From d25339adda9ba6332d1a773015f6ae55598299ce Mon Sep 17 00:00:00 2001 From: Thomas Feuvrier <thomas.feuvrier@c-s.fr> Date: Wed, 5 Jul 2006 15:44:36 +0000 Subject: [PATCH] Suppression de la CAI de la CONF --- Utilities/CAI/cai_dll/CMakeLists.txt | 3 - Utilities/CAI/cai_dll/README | 71 - Utilities/CAI/cai_dll/cai_dll.dsp | 299 - Utilities/CAI/cai_dll/cai_dll.dsw | 29 - Utilities/CAI/cai_dll/cai_dll.ncb | Bin 295936 -> 0 bytes Utilities/CAI/cai_dll/cai_dll.opt | Bin 54784 -> 0 bytes Utilities/CAI/cai_dll/cai_dll.plg | 16 - Utilities/CAI/cai_dll/dll/hd421md.dll | Bin 1151061 -> 0 bytes Utilities/CAI/cai_dll/dll/hm421md.dll | Bin 266325 -> 0 bytes Utilities/CAI/cai_dll/dll/szlibdll.dll | Bin 77824 -> 0 bytes Utilities/CAI/cai_dll/dll/tiff.dll | Bin 679994 -> 0 bytes Utilities/CAI/cai_dll/dll/zlib1.dll | Bin 70656 -> 0 bytes Utilities/CAI/cai_dll/inc/CMakeLists.txt | 5 - Utilities/CAI/cai_dll/inc/cai_image.h | 782 - Utilities/CAI/cai_dll/inc/cderror.h | 132 - Utilities/CAI/cai_dll/inc/cdjpeg.h | 179 - Utilities/CAI/cai_dll/inc/g3states.h | 0 Utilities/CAI/cai_dll/inc/inc_hdf/atom.h | 300 - Utilities/CAI/cai_dll/inc/inc_hdf/bitvect.h | 385 - Utilities/CAI/cai_dll/inc/inc_hdf/cdeflate.h | 102 - Utilities/CAI/cai_dll/inc/inc_hdf/cnbit.h | 111 - Utilities/CAI/cai_dll/inc/inc_hdf/crle.h | 113 - Utilities/CAI/cai_dll/inc/inc_hdf/cskphuff.h | 104 - Utilities/CAI/cai_dll/inc/inc_hdf/df.h | 212 - Utilities/CAI/cai_dll/inc/inc_hdf/dfan.h | 65 - Utilities/CAI/cai_dll/inc/inc_hdf/dfgr.h | 73 - Utilities/CAI/cai_dll/inc/inc_hdf/dfi.h | 220 - Utilities/CAI/cai_dll/inc/inc_hdf/dfrig.h | 73 - Utilities/CAI/cai_dll/inc/inc_hdf/dfsd.h | 136 - Utilities/CAI/cai_dll/inc/inc_hdf/dfstubs.h | 75 - Utilities/CAI/cai_dll/inc/inc_hdf/dfufp2i.h | 85 - Utilities/CAI/cai_dll/inc/inc_hdf/dynarray.h | 156 - Utilities/CAI/cai_dll/inc/inc_hdf/hbitio.h | 85 - Utilities/CAI/cai_dll/inc/inc_hdf/hchunks.h | 294 - Utilities/CAI/cai_dll/inc/inc_hdf/hcomp.h | 143 - Utilities/CAI/cai_dll/inc/inc_hdf/hcompi.h | 114 - Utilities/CAI/cai_dll/inc/inc_hdf/hconv.h | 272 - .../CAI/cai_dll/inc/inc_hdf/hdf2netcdf.h | 56 - Utilities/CAI/cai_dll/inc/inc_hdf/herr.h | 457 - Utilities/CAI/cai_dll/inc/inc_hdf/hfile.h | 1015 - Utilities/CAI/cai_dll/inc/inc_hdf/hkit.h | 171 - Utilities/CAI/cai_dll/inc/inc_hdf/hntdefs.h | 275 - Utilities/CAI/cai_dll/inc/inc_hdf/hproto.h | 4221 --- Utilities/CAI/cai_dll/inc/inc_hdf/linklist.h | 210 - Utilities/CAI/cai_dll/inc/inc_hdf/mfan.h | 372 - Utilities/CAI/cai_dll/inc/inc_hdf/mfgr.h | 143 - Utilities/CAI/cai_dll/inc/inc_hdf/mstdio.h | 89 - Utilities/CAI/cai_dll/inc/inc_hdf/netcdf.h | 581 - Utilities/CAI/cai_dll/inc/inc_hdf/tbbt.h | 327 - Utilities/CAI/cai_dll/inc/inc_hdf/vg.h | 72 - .../CAI/cai_dll/inc/inc_unix2win/asm/atomic.h | 107 - .../CAI/cai_dll/inc/inc_unix2win/dirent.h | 186 - .../CAI/cai_dll/inc/inc_unix2win/dlfcn.h | 142 - Utilities/CAI/cai_dll/inc/inc_unix2win/glob.h | 173 - .../CAI/cai_dll/inc/inc_unix2win/sys/mman.h | 160 - .../CAI/cai_dll/inc/inc_unix2win/sys/time.h | 136 - .../CAI/cai_dll/inc/inc_unix2win/sys/uio.h | 107 - .../CAI/cai_dll/inc/inc_unix2win/unistd.h | 247 - .../inc/inc_unix2win/unixem/implicit_link.h | 185 - .../inc/inc_unix2win/unixem/internal/util.h | 97 - .../cai_dll/inc/inc_unix2win/unixem/unixem.h | 98 - Utilities/CAI/cai_dll/inc/jchuff.h | 34 - Utilities/CAI/cai_dll/inc/jconfig.h | 50 - Utilities/CAI/cai_dll/inc/jdct.h | 176 - Utilities/CAI/cai_dll/inc/jdhuff.h | 202 - Utilities/CAI/cai_dll/inc/jerror.h | 291 - Utilities/CAI/cai_dll/inc/jinclude.h | 91 - Utilities/CAI/cai_dll/inc/jmemsys.h | 183 - Utilities/CAI/cai_dll/inc/jmorecfg.h | 369 - Utilities/CAI/cai_dll/inc/jpegint.h | 388 - Utilities/CAI/cai_dll/inc/jpeglib.h | 1096 - Utilities/CAI/cai_dll/inc/jversion.h | 14 - Utilities/CAI/cai_dll/inc/machdep.h | 258 - Utilities/CAI/cai_dll/inc/port.h | 32 - Utilities/CAI/cai_dll/inc/t4.h | 285 - Utilities/CAI/cai_dll/inc/tif_dir.h | 268 - Utilities/CAI/cai_dll/inc/tif_fax3.h | 522 - Utilities/CAI/cai_dll/inc/tif_predict.h | 61 - Utilities/CAI/cai_dll/inc/tiff.h | 440 - Utilities/CAI/cai_dll/inc/tiffcomp.h | 214 - Utilities/CAI/cai_dll/inc/tiffconf.h | 143 - Utilities/CAI/cai_dll/inc/tiffio.h | 334 - Utilities/CAI/cai_dll/inc/tiffiop.h | 279 - Utilities/CAI/cai_dll/inc/uvcode.h | 173 - Utilities/CAI/cai_dll/inc/version.h | 1 - Utilities/CAI/cai_dll/lib/hd421md.lib | Bin 86972 -> 0 bytes Utilities/CAI/cai_dll/lib/hm421md.lib | Bin 17280 -> 0 bytes Utilities/CAI/cai_dll/lib/libjpeg.lib | Bin 233802 -> 0 bytes Utilities/CAI/cai_dll/lib/tiff.lib | Bin 21044 -> 0 bytes Utilities/CAI/cai_dll/lib/unix2win.lib | Bin 27558 -> 0 bytes Utilities/CAI/cai_dll/src/CMakeLists.txt | 25 - Utilities/CAI/cai_dll/src/cai_DonAux.c | 3873 --- Utilities/CAI/cai_dll/src/cai_arcinfo.c | 1402 - Utilities/CAI/cai_dll/src/cai_atg2.c | 2170 -- Utilities/CAI/cai_dll/src/cai_bandeau.c | 730 - Utilities/CAI/cai_dll/src/cai_bil.c | 1810 -- Utilities/CAI/cai_dll/src/cai_bip.c | 1807 -- Utilities/CAI/cai_dll/src/cai_bsq.c | 2009 -- Utilities/CAI/cai_dll/src/cai_fonctions.c | 2499 -- Utilities/CAI/cai_dll/src/cai_gessimu.c | 1233 - Utilities/CAI/cai_dll/src/cai_grilles.c | 1916 -- Utilities/CAI/cai_dll/src/cai_hdf.c | 1779 -- Utilities/CAI/cai_dll/src/cai_inria.c | 1529 -- Utilities/CAI/cai_dll/src/cai_jpeg.c | 1008 - Utilities/CAI/cai_dll/src/cai_lum.c | 1765 -- Utilities/CAI/cai_dll/src/cai_mapsat.c | 1080 - Utilities/CAI/cai_dll/src/cai_multis.c | 1985 -- Utilities/CAI/cai_dll/src/cai_onera.c | 1296 - Utilities/CAI/cai_dll/src/cai_radar.c | 1466 - Utilities/CAI/cai_dll/src/cai_rasterfile.c | 1440 - Utilities/CAI/cai_dll/src/cai_spot.c | 22134 ---------------- Utilities/CAI/cai_dll/src/cai_tiff.c | 1534 -- 112 files changed, 76655 deletions(-) delete mode 100755 Utilities/CAI/cai_dll/CMakeLists.txt delete mode 100755 Utilities/CAI/cai_dll/README delete mode 100755 Utilities/CAI/cai_dll/cai_dll.dsp delete mode 100755 Utilities/CAI/cai_dll/cai_dll.dsw delete mode 100755 Utilities/CAI/cai_dll/cai_dll.ncb delete mode 100755 Utilities/CAI/cai_dll/cai_dll.opt delete mode 100755 Utilities/CAI/cai_dll/cai_dll.plg delete mode 100755 Utilities/CAI/cai_dll/dll/hd421md.dll delete mode 100755 Utilities/CAI/cai_dll/dll/hm421md.dll delete mode 100755 Utilities/CAI/cai_dll/dll/szlibdll.dll delete mode 100755 Utilities/CAI/cai_dll/dll/tiff.dll delete mode 100755 Utilities/CAI/cai_dll/dll/zlib1.dll delete mode 100755 Utilities/CAI/cai_dll/inc/CMakeLists.txt delete mode 100755 Utilities/CAI/cai_dll/inc/cai_image.h delete mode 100755 Utilities/CAI/cai_dll/inc/cderror.h delete mode 100755 Utilities/CAI/cai_dll/inc/cdjpeg.h delete mode 100755 Utilities/CAI/cai_dll/inc/g3states.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/atom.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/bitvect.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/cdeflate.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/cnbit.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/crle.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/cskphuff.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/df.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/dfan.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/dfgr.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/dfi.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/dfrig.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/dfsd.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/dfstubs.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/dfufp2i.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/dynarray.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/hbitio.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/hchunks.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/hcomp.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/hcompi.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/hconv.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/hdf2netcdf.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/herr.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/hfile.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/hkit.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/hntdefs.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/hproto.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/linklist.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/mfan.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/mfgr.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/mstdio.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/netcdf.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/tbbt.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_hdf/vg.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_unix2win/asm/atomic.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_unix2win/dirent.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_unix2win/dlfcn.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_unix2win/glob.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_unix2win/sys/mman.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_unix2win/sys/time.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_unix2win/sys/uio.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_unix2win/unistd.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_unix2win/unixem/implicit_link.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_unix2win/unixem/internal/util.h delete mode 100755 Utilities/CAI/cai_dll/inc/inc_unix2win/unixem/unixem.h delete mode 100755 Utilities/CAI/cai_dll/inc/jchuff.h delete mode 100755 Utilities/CAI/cai_dll/inc/jconfig.h delete mode 100755 Utilities/CAI/cai_dll/inc/jdct.h delete mode 100755 Utilities/CAI/cai_dll/inc/jdhuff.h delete mode 100755 Utilities/CAI/cai_dll/inc/jerror.h delete mode 100755 Utilities/CAI/cai_dll/inc/jinclude.h delete mode 100755 Utilities/CAI/cai_dll/inc/jmemsys.h delete mode 100755 Utilities/CAI/cai_dll/inc/jmorecfg.h delete mode 100755 Utilities/CAI/cai_dll/inc/jpegint.h delete mode 100755 Utilities/CAI/cai_dll/inc/jpeglib.h delete mode 100755 Utilities/CAI/cai_dll/inc/jversion.h delete mode 100755 Utilities/CAI/cai_dll/inc/machdep.h delete mode 100755 Utilities/CAI/cai_dll/inc/port.h delete mode 100755 Utilities/CAI/cai_dll/inc/t4.h delete mode 100755 Utilities/CAI/cai_dll/inc/tif_dir.h delete mode 100755 Utilities/CAI/cai_dll/inc/tif_fax3.h delete mode 100755 Utilities/CAI/cai_dll/inc/tif_predict.h delete mode 100755 Utilities/CAI/cai_dll/inc/tiff.h delete mode 100755 Utilities/CAI/cai_dll/inc/tiffcomp.h delete mode 100755 Utilities/CAI/cai_dll/inc/tiffconf.h delete mode 100755 Utilities/CAI/cai_dll/inc/tiffio.h delete mode 100755 Utilities/CAI/cai_dll/inc/tiffiop.h delete mode 100755 Utilities/CAI/cai_dll/inc/uvcode.h delete mode 100755 Utilities/CAI/cai_dll/inc/version.h delete mode 100755 Utilities/CAI/cai_dll/lib/hd421md.lib delete mode 100755 Utilities/CAI/cai_dll/lib/hm421md.lib delete mode 100755 Utilities/CAI/cai_dll/lib/libjpeg.lib delete mode 100755 Utilities/CAI/cai_dll/lib/tiff.lib delete mode 100755 Utilities/CAI/cai_dll/lib/unix2win.lib delete mode 100755 Utilities/CAI/cai_dll/src/CMakeLists.txt delete mode 100755 Utilities/CAI/cai_dll/src/cai_DonAux.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_arcinfo.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_atg2.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_bandeau.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_bil.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_bip.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_bsq.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_fonctions.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_gessimu.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_grilles.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_hdf.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_inria.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_jpeg.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_lum.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_mapsat.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_multis.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_onera.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_radar.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_rasterfile.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_spot.c delete mode 100755 Utilities/CAI/cai_dll/src/cai_tiff.c diff --git a/Utilities/CAI/cai_dll/CMakeLists.txt b/Utilities/CAI/cai_dll/CMakeLists.txt deleted file mode 100755 index a90eb09083..0000000000 --- a/Utilities/CAI/cai_dll/CMakeLists.txt +++ /dev/null @@ -1,3 +0,0 @@ - -SUBDIRS(src inc) - diff --git a/Utilities/CAI/cai_dll/README b/Utilities/CAI/cai_dll/README deleted file mode 100755 index 4a0b9fe13c..0000000000 --- a/Utilities/CAI/cai_dll/README +++ /dev/null @@ -1,71 +0,0 @@ -# Version :$Header: README,v 1.5 01/01/15 15:24:06 cmf Exp $ - INSTALLATION COUCHE_ACCES_IMAGE ATLAS - ------------------------------------- -########################################################################## -# MOD : VERSION : 4.1 : DM : installation sur DEC UNIX -########################################################################## - -########################################################################## -# MOD : VERSION : 4.3 : DM : installation sur HP64Bits, pCNT, PC LINUX -########################################################################## - -La Couche Acces Image peut etre installee sur HP 32 bits et 64 bits Sun OS et SUN SOLARIS 32 bits et 64 bits, sur HP ITANIUM2 , sur DEC UNIX ainsi que PC LINUX et PC NT ainsi que station XEON EMT64 Linux Redhat - - - -Pour la generer, quatre variables d'environnement doivent etre positionnees : - - -MACHINE_ATLAS represente le type de machine sur lequel se fait l'installation - Les valeurs possibles : SOLARIS, SOLARIS64, HPUX, HPUX64, - WIN, LINUX, ITANIUM2, AIX, DEC, SUNOS - -RACINE_ATLAS indique le repertoire racine de stockage de CAI. - (exle : /home/ATALGO/regine/COUCHE_IMA_V5.2) - -RACINE_HDF indique le repertoire racine de stockage du freeware HDF - (exle : /home/ATALGO/HDF) - -########################################################################## -# MOD : VERSION : 4.0 : DM : s'affranchir du compilateur -########################################################################## -COMPILO : si cette variable n'est pas positionnee, le compilateur par defaut est - utilise : cc. - si elle est positionnee, c'est le compilateur indique qui est utilise - - -Pour generer, lancer $(RACINE_ATLAS)/ins/COUCHE_IMA.install - -Si vous ne voulez pas de bibliotheque dynamique, dans le fichier COUCHE_IMA.install, -enlever l'appel au deuxieme makefile - -Si vous n'avez pas la biblitheque HDF a votre disposition, dans le fichier -$(RACINE_ATLAS)/gen/genere.mk preciser all: CAI_NOHD - - - -Remarque : ----------- -Pour PC LINUX et PC NT et ITANIUM2 ainsi que XEON, seule la bibliotheque simple est generee - -Vérifier que la variable d'environnement $PATH est à jour de façon à pouvoir - acceder au précompilateur cpp - - - - INSTALLATION COUCHE_ACCES_IMAGE QIV SUR HP - ------------------------------------------ - -Pour generer libimage.a , deux variables d'environnement doivent etre positionnees : - - -MACHINE_ATLAS represente le type de machine sur lequel se fait l'installation - Les valeurs possibles : HPUX - - -RACINE_HDF indique le repertoire racine de stockage du freeware HDF - (exle : /home/ATALGO/HDF) - - -Pour generer : sous gen : - make -f cai_libimage.mk diff --git a/Utilities/CAI/cai_dll/cai_dll.dsp b/Utilities/CAI/cai_dll/cai_dll.dsp deleted file mode 100755 index e1be2de439..0000000000 --- a/Utilities/CAI/cai_dll/cai_dll.dsp +++ /dev/null @@ -1,299 +0,0 @@ -# Microsoft Developer Studio Project File - Name="cai_dll" - Package Owner=<4> -# Microsoft Developer Studio Generated Build File, Format Version 6.00 -# ** DO NOT EDIT ** - -# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 - -CFG=cai_dll - Win32 Debug -!MESSAGE This is not a valid makefile. To build this project using NMAKE, -!MESSAGE use the Export Makefile command and run -!MESSAGE -!MESSAGE NMAKE /f "cai_dll.mak". -!MESSAGE -!MESSAGE You can specify a configuration when running NMAKE -!MESSAGE by defining the macro CFG on the command line. For example: -!MESSAGE -!MESSAGE NMAKE /f "cai_dll.mak" CFG="cai_dll - Win32 Debug" -!MESSAGE -!MESSAGE Possible choices for configuration are: -!MESSAGE -!MESSAGE "cai_dll - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE "cai_dll - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") -!MESSAGE - -# Begin Project -# PROP AllowPerConfigDependencies 0 -# PROP Scc_ProjName "" -# PROP Scc_LocalPath "" -CPP=cl.exe -MTL=midl.exe -RSC=rc.exe - -!IF "$(CFG)" == "cai_dll - Win32 Release" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 0 -# PROP BASE Output_Dir "Release" -# PROP BASE Intermediate_Dir "Release" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 0 -# PROP Output_Dir "Release" -# PROP Intermediate_Dir "Release" -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CAI_DLL_EXPORTS" /YX /FD /c -# ADD CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CAI_DLL_EXPORTS" /YX /FD /c -# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x40c /d "NDEBUG" -# ADD RSC /l 0x40c /d "NDEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 -# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 - -!ELSEIF "$(CFG)" == "cai_dll - Win32 Debug" - -# PROP BASE Use_MFC 0 -# PROP BASE Use_Debug_Libraries 1 -# PROP BASE Output_Dir "Debug" -# PROP BASE Intermediate_Dir "Debug" -# PROP BASE Target_Dir "" -# PROP Use_MFC 0 -# PROP Use_Debug_Libraries 1 -# PROP Output_Dir "Debug" -# PROP Intermediate_Dir "Debug" -# PROP Ignore_Export_Lib 0 -# PROP Target_Dir "" -# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CAI_DLL_EXPORTS" /YX /FD /GZ /c -# ADD CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /I "inc" /I "inc/inc_hdf" /I "inc/inc_unix2win" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "CAI_DLL_EXPORTS" /YX /FD /GZ /c -# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 -# ADD BASE RSC /l 0x40c /d "_DEBUG" -# ADD RSC /l 0x40c /d "_DEBUG" -BSC32=bscmake.exe -# ADD BASE BSC32 /nologo -# ADD BSC32 /nologo -LINK32=link.exe -# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept -# ADD LINK32 lib/hd421md.lib lib/hm421md.lib lib/libjpeg.lib lib/tiff.lib lib/unix2win.lib kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /nodefaultlib:"libcmtd.lib" /out:"Debug/cai.dll" /pdbtype:sept -# SUBTRACT LINK32 /pdb:none - -!ENDIF - -# Begin Target - -# Name "cai_dll - Win32 Release" -# Name "cai_dll - Win32 Debug" -# Begin Group "Source Files" - -# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat" -# Begin Source File - -SOURCE=.\src\cai_arcinfo.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_atg2.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_bandeau.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_bil.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_bip.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_bsq.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_DonAux.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_fonctions.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_gessimu.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_grilles.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_hdf.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_inria.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_jpeg.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_lum.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_mapsat.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_multis.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_onera.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_radar.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_rasterfile.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_spot.c -# End Source File -# Begin Source File - -SOURCE=.\src\cai_tiff.c -# End Source File -# End Group -# Begin Group "Header Files" - -# PROP Default_Filter "h;hpp;hxx;hm;inl" -# Begin Source File - -SOURCE=.\inc\cai_image.h -# End Source File -# Begin Source File - -SOURCE=.\inc\cderror.h -# End Source File -# Begin Source File - -SOURCE=.\inc\cdjpeg.h -# End Source File -# Begin Source File - -SOURCE=.\inc\g3states.h -# End Source File -# Begin Source File - -SOURCE=.\inc\jchuff.h -# End Source File -# Begin Source File - -SOURCE=.\inc\jconfig.h -# End Source File -# Begin Source File - -SOURCE=.\inc\jdct.h -# End Source File -# Begin Source File - -SOURCE=.\inc\jdhuff.h -# End Source File -# Begin Source File - -SOURCE=.\inc\jerror.h -# End Source File -# Begin Source File - -SOURCE=.\inc\jinclude.h -# End Source File -# Begin Source File - -SOURCE=.\inc\jmemsys.h -# End Source File -# Begin Source File - -SOURCE=.\inc\jmorecfg.h -# End Source File -# Begin Source File - -SOURCE=.\inc\jpegint.h -# End Source File -# Begin Source File - -SOURCE=.\inc\jpeglib.h -# End Source File -# Begin Source File - -SOURCE=.\inc\jversion.h -# End Source File -# Begin Source File - -SOURCE=.\inc\machdep.h -# End Source File -# Begin Source File - -SOURCE=.\inc\port.h -# End Source File -# Begin Source File - -SOURCE=.\inc\t4.h -# End Source File -# Begin Source File - -SOURCE=.\inc\tif_dir.h -# End Source File -# Begin Source File - -SOURCE=.\inc\tif_fax3.h -# End Source File -# Begin Source File - -SOURCE=.\inc\tif_predict.h -# End Source File -# Begin Source File - -SOURCE=.\inc\tiff.h -# End Source File -# Begin Source File - -SOURCE=.\inc\tiffcomp.h -# End Source File -# Begin Source File - -SOURCE=.\inc\tiffconf.h -# End Source File -# Begin Source File - -SOURCE=.\inc\tiffio.h -# End Source File -# Begin Source File - -SOURCE=.\inc\tiffiop.h -# End Source File -# Begin Source File - -SOURCE=.\inc\uvcode.h -# End Source File -# Begin Source File - -SOURCE=.\inc\version.h -# End Source File -# End Group -# Begin Group "Resource Files" - -# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe" -# End Group -# End Target -# End Project diff --git a/Utilities/CAI/cai_dll/cai_dll.dsw b/Utilities/CAI/cai_dll/cai_dll.dsw deleted file mode 100755 index d13fe7a6bb..0000000000 --- a/Utilities/CAI/cai_dll/cai_dll.dsw +++ /dev/null @@ -1,29 +0,0 @@ -Microsoft Developer Studio Workspace File, Format Version 6.00 -# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! - -############################################################################### - -Project: "cai_dll"=".\cai_dll.dsp" - Package Owner=<4> - -Package=<5> -{{{ -}}} - -Package=<4> -{{{ -}}} - -############################################################################### - -Global: - -Package=<5> -{{{ -}}} - -Package=<3> -{{{ -}}} - -############################################################################### - diff --git a/Utilities/CAI/cai_dll/cai_dll.ncb b/Utilities/CAI/cai_dll/cai_dll.ncb deleted file mode 100755 index 45842ab1cb5b10253660132b54f9ced67649c82d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 295936 zcmeEv2Vhl2*8iFNZt{{4NFfA5k(bay2_zw*gccxF1p#SNgpdRXrjdeOf?~(sv4CY2 zS$n~Tirv*+3+k?}4Lg5VSKM_!-CczL?>95|=D`Mp;JWVjWnLz8&z+ew=gysS=FFLM zCzTdeSJqT6t__XuH@bK4P*rv1lIp_pP;p^x;iAHtl2CTv%*>WC?I(^C5m!V>s>+NI zsk-nT)j@SsxZCWSYoNIX{%dPsxTgI3-EhH1A7UG$nq6}ZG}l0L4K&w4a}6}tKywW= z*FbX(G}l0L4K&w4a}6}tKywW=*FbX(G}l0L4K&w4a}6}tKywW=*FbX(G}l0L4K&w4 za}6}tz%RE3M7HcAb-p6c7F@Lxr~+t>fL|`*&6G9QKywW=*FbX(G}l0L4K&w4a}6}t zKywW=*FbX(G}l0L4K&w4a}6}tKywW=*FbX(G}l0L4K&w4a}6}tKywW=*FbX(G}l0L z4fr+C=aEeH)Z^!mj>ggd>R6F}6@}#`H3*6p^{XwcUQ$w9TCup&z~z<2b!8<Da7}Gx zbr@J$T2WJ5T(a2aHmUm+<jq@BU0PgJSzc8KTubJyD6Oe0EGz2WdtOmt>4M_2vUxSt zMf$q1x`@d87KImgPzY+5WH&wcqSCTM$y{{^nQN9eJ##^2#mKtjo1TAhWkpeKX=O!C z(@`ubsi`R~uR8<;)um-+C5J%4(&EKUFTJ#)y0ozA*_Tz7ENOb~vbyr7XD%<Sswu2J zg#2}7wWWtp?UfZJ)rU}X)rG}{)lH|qy0E6Uq<V2_SxM7z)Kpa-LjBd2E^b1*E3Gi& zU1@pYl9Ikl4|cTE*^5i6t1GLUnprp5CKbG-e@$&+ExKxxaxW`dT8A2IV&2M%#idJ{ zn7O#9wy8M}f#gGYNz3q>%j$}o*glq(mz39>(A2k7j(NRkaZ{@r!(nMfQ)?TU%SsnD z@l~xTsjk6H*0kK^g+)t?ORAcdxvH|diBDXc)3g#X^eiYYZQ=;P%!><;@89&ItEx+i zOPkuK^sw2aL4Y~QN;a8r<gRGq0K~FOE1O<&X=M}1u3J%5+0=nxuP$L&`hJ%44rPR9 zl~(l64i%Ivs#_Ay^#4nWX(eSPFb8PTSfmXrfrIDu7Zp|%mlTp^9E_F6G4KKSzhwOR zm0csI-+I`>C(;4Rak!a`@IEY0G7<KGr;)OUVTrH<!UqxG7U9MiksO3^Q6fDN*1|&J zVF>R**css;TZk^F4C(p<{s#E65cZA~NkzER5lKQg6Ue(GybkFHAtY`jk@xYhE5g?h zPr_Cpe?Np{;BhJ6fu4>CABFOC9Kx?qZV2Hn!0`wbLM*Q2dC=Df;c&n$5uO9MH^O?9 zpNOzM@OMMl73B{=Scq^S!d&3%gm63P&qe5>&<uoiD7QVr$B@4@!tYQY?GR?6u%QU) zkVHlxJ^^7K;@cp+8PC%NVF>AlAUqQusAUQ6ry(4GOeqMnaWfm?WuU7ELIeU*<QaI7 zrfI|@$W8!x2#15Nz6g)N&0Yvk!gIDlNY_~gtHJ6Yz?>lYp$rMh5$Xtanh&SSI5kdP z1PV-injE8!QGI>5i_B4TR98Gff@1!zGDr<l(ICmB?<Pg6NPP+N4BTC2saa~fpTCDJ zQj1i;&z~*>)j&0q<+mcfo-#&_QB{6?FBzhSs5yTA-ZD?kQ}M*#n(6z<BsEDr?5EGb zTOF>-h%b)uePyf~t1d&$;}+n4QsGv(4REH6j2Ia)#E;LCF%e_J;B36zI(McY-(Mz2 zPL6DVb0j|^KcWH7m2$V-eGWBl${QdLI}bZ&`|v<{z<I#Hiu4SUDpjS1;mxr1Z)^3o zT839Od*R#2fmW1g!gPdpY(#HB$Txiz!j5Q)8xXRkZ9(|Z2$5GAqAtEi_$A&+RO`3Z zPGD+>Fc$dJZ8!+w8>rLq2=B-J*$B5G-BN_<fR9JW^k>`qS0TI~@f#2>#r=m6lD-!Z zRsntsA@grX7!UY+3r8irt@?nDb_f}tj__`jI|yM{<R6bP6X|CoB)+8xrz1Sx!e=8a z27DD^q}zay`5r>J5aA052O;NM2=52H9bqQ$e~<7P3<Xhb4BimJw@@#c2y2lpA7MSh zDF|axp$idi16+l$0Ql+=UW@P|gx})+dV~n%ZiKg^?QKCAh39$|VG{0dv++9+E@r}H z6UHM%JCG2<rNEGh@OJc!M2r(jvQWyTTq>kes${uTOO4b@ove`K<ajwjPLz}6WI07n zm6cL2tK>8}T~^B(7$we<v*jE)SI(0{StLbLEG4p7mdH{mm1Qzk#>se@AQR<qIYK7M zWEm|-$`qL@)8r_bE;D4N%#zu1w9JvYGEe4X+`m`ull$cX*(49j(->EtmFMJnc|m?7 zFUm{uTlt;5EU(C`@|tXwkupk-mGk9dxkN6N%j9yoLavmn<Z4+f*T}VUom?;LWWC%V zH_A<Nv;0bKky~Yh+$I}kjocx3%3X4|+#>}Tw-;cXT#fe{?x)~AU2A<6-X-Hw0PnKb z3<-OAn1(R(@!o}~XZo?Yrk@|?`A)s~0}Yuc+#g83@bux=zXz_y+=;lK7?Kd<y5l#S zFq#eFRQ#&K;4YXma>L-mFvpGvgF9o4FA9UxFqcdWgISC>{?U@~2hImh1MJ9&ffECI zJUkr<!4G`qeCBAl1z}fC4V)U#<6R2j2ytA;jE}K|BjtVPeMiTiLpUfW1WpKe;~{#a zw0GM3<00qmzN)YC#z)S7kGqe%4R8xdc9NYtlo?Mse{XTOxD9YiY3H;Hi*F^FDpP&n zr;n2?l@$iZ%aiVtZbN*6q&O+gsc0kUr=T}c&T-FiH~aZpOIxR{(*P&Q6YdjX@ol7^ z>Ziv>lRsH<+#I)-_}(PGw$jFF<7impZzmZlLuvRAj8Bor+{fI{{PNn%DS=Z0KM-~p z-$6chK6cjn^mUYz11ASKM!TaK-$_1lK61|X;}4Tholl*c{QRBe6Xz4>E<ZjbA37i6 ziIIO4^QX!-XPbf75>Ato0w)D7XMS-2cfkzXM-rJ{zwfRXJ7yVJKTkK=>~3~-d@1vH zmn0|2(QrB89@0nkQKig3gK)a^cl*1))%Xebl(XHl-Ism17e=Ppejh!QJ{&$4u+N6~ zLtY<BKW2XR<!ta?Z{xSVo8fn|!6*I+zZ<%H@F4jMe(k`9u|BiG|6b!<>%7}Vb8&$4 z<Z=A|g8Bi+3Vs0GoGMm&Jkb0>*m%&|#QWnxgn|9>V3C3S@nD;Q{qex2_s4^lCO#w~ zU4Br<D=9|#`Do0Be{-Y&GvY%&9FPfWf-1n6YvNs*tLCbg{rCusH51kEF-MyCNSUc- zs_ht?4IGqwm9KXBaFmQxBh`sMzG#`R=BulGd@(X!jaN7M>08J!HB9yL<6~vC8m-Rs z<6Fv5HB^1#$G4Kh)!}NZA0LOYa)jFImlrREs!(nA;RIQz7OFXZ`b5c7dFnF%d0NX+ z>L_)p4=2eqg`W?%ktu45TI$2eGF44g-F>*NOjeWCP#<n5N2(*$Eq?havOq0R?R>bs z9IcL48~yYhWV)KJw)k*InW1K=B>#Ck$tX2SIez}bFqh0$TydEC{|Whj$wzxV1pZ&= z599we9LE1^ct8BVjt}GiH5|tOYxoz$|2yn&Vf?@DZ-)QZ{aufzT)Fk#WBw;U@F7-o z9zW0%V`ex%kd84moFCx$Fa^A+m!9K8IDf$YAI=~2z!<IhgCYzBa9#168<xKt*20gj zCa1vofSl;O?tDQwk8lKdtYe%T2(KX=CwHn|&Q8J_Un027*W^{gWsFaeZ{>8Q=a(D@ zaC=As`pd6T-UIN@!Sniyuy7}?gW%CSz-PfvfG>ithCdztc*LIqe=a<EJzn33`%lBa z0{=ez7w{aj4+XcEcLd(W{>tg_Bk}voOB$Qq|GgT}{H~tw2g{=1qM+t)_4tq{)v8)G zz(b@sSR58VR33C5bUc1GLxxF7uq4<350{6Whr;4VNR6sdo6*i(jXz(Cf<-|Mqkm_} zNLj9yhsBSQP0l8VYk!k|w44@sTBOI%W?&UpsVWUWtMiYM`<?rJem4WF(ZXP1(Bp42 zur@7-D2UMftxi8)s@-bW<8L#tZXF#lIzsceI)0)ocbB^!f180dZLM4DYW`N!e}vSy zHLl0sW?;Qr<yN_xzt#CCOQl;G1|KP-B1T2%@h8H;^G<=}ueZ<7W?+?Ep(>Q-Uv>Uz za-Vab;b%3>74-D5^wVWwaA8pMw>o}?tcqL}>G87}SZmL~&-rUVah%=|VRVO25hptf zVG?{Id=7lFIICKTb6OmHS8+~njeF7Xnee&r>F^2gG2(m^i?9uR5BUD@hrxG-?+D)s zz5{%Fao$Zs*hQR#mIyQ8yTPZ5lh_Mk3&dw5j2EYMPlO?H7PLdy7QQchAI%ebYwYm# zws()~?K@qJs|b0|TeF9+-y6&4<=<Brp8tR2`o943y&>?E;2(g00bbAld<k&-oc}RC zFy5d4ZTbVA|807I{<rx2`5*0<`1d*g>-=H!zfK=E|Lgd$`CrF}&How>oBy4kfBq*Q zKz?8y#Qswub?2PE3sUn|xV{MY!sETTrMS=dGw`1N27e&;-$kB3!T$gsi##3n%J*aO zwa6D<PB`q{CrusUd%@?z=fiu?Gz$6u2MbE3^{yX4{L}Dn!hZ&jVMNE*fi~g~e@^Dx z*ZpuD9{$aiUY5n{W<G{J>A;=t|6@)6n}9hmT>du-^44&EzW{S?IKMv(bH3*HZT}u2 z_$l!JnFil*8E*J}+uuh+9vm(Y94R9Wzi;#BOTMhd`&U8c56Iu$u@RHN(*h;n7#Zo_ z<^B))kbz_6MfY9z4L^M{<b$2u#Xg(@nfCY6!_VJQj)}M-f;(p>e^)urnI5>#$Jblh zt72!ZAD=DHM6?X*`8vq)0{bucvEA*xUhvil#mIXqJl6(H*VMIym-pYz?~lYn%`59# zY*XF>|1kW^@Sno(f{(?vp|{q#59yzS_trh^&s_Tu$0<n5=k;jjI>_tq%aA7*X*pha zYZNbj@3j)wDEo?I-)`>T2i~_2B&F{Ey1#M9c&O?B1K8iVqn=~d|MLty5HbWk9#k55 z0A!GQJjgb1KkRYp@gT~;S=eI_9}hCYQ|k5qmnJ?J{G}cbY7NZwxL*I;^0Oi3{DJ+^ zjt3GkHsUz!NGm%Y^mgxa^L#i~UU5HmTlsLZR0bm5Kl%Anut)WkEb!ww9;}ZT@55cO z3qLy0)rWgypLw=(fe&*$XtBq5!10T1|9{JPa3JlaInDpB8qoc}jp=`!@Adp|;XLdS zX!)OoIp6F4Z()uXx#)}--b1Vv_GjJyV+_pkLic|QbG*>~-{v0z-4osaEj$Q13A+EU zF!={#&*Dw?KOG;Cvm@S#SO}h3X?`L`o_B{v<oR%{%#JuVqLmLP%Qt}=+|T^{DcJ8m zOpW*BJIY@p(jt!|tm*G6F@YBX-!r|&-y8Dmj~r^^7&u$TMZRJBe;dOOjDt+!|4#qM zK)NqCKHhawLm{vLd$<kHoIjeCdo${k^-O&Qqkq+qtiGV2puPcY!qtB00uN$cyt^tt z-*q80fb;0O05omKTE%<;^D&zg!FqRUr~x{Ft0|48!IOu(2_&>W3Hv8eq5OJ@2Q5>2 zsrcwrC$T;%1U)hL7F%BtsK|HFsi=Vksk8o%f9sQ?z#RRk%m2|7;R$sAxAQI6|8JpA z5-m*mz3%@OraV4;JrF`S{asjkuJ4};gSj6NK0b7Sd`OQEdOx2#$eqmi&<BX%I^w6t z2i+g3G1l3P54L>nFMbq;pZgQx`~u|%>%n89qBTBhqYw_xAgln5ms1IAe!_u{$`Kll z*6R;PYptBk{1zSqJrTkteE`rHp$sK@6!Bp{5}GcA!2$qw0Zr8M6$3};^#bKBhMovW z2q$aViwBQ|jFPe#lRgsASh*9h+5Zkg3umP~>BCXb#91wG_;9q=$GH@+()1?CTag99 z9IS!WFb6Ft2^u<!M8kT&qpkeVA|rMt(=Q;sDUz+0samvuC^!M`Ce<;2Zed~M&w_SN zp(L7kz`58@nd8AoKUmsFUl4r>>c{YBL!ocBByfbEex%m$u`tq)m2abaq6DUAc~fL; z%Trrf82INvk7${+B>j5*I8XlAs$<;i8XxIBMlNjiT&qmduj_lU%yVCfSjqJI`OD?( zK&Jb-jwk*a$g?{{Ss3_F(E3L&G5t{1&njpW94#8w@}P5MVARg2IT|11&xelET+#3- z;=5RGjNTR<>C<zmd=&9i<a(c;Yvf6_!Qps<`b7Tgp&7MUk1wWvZ;+UlSuHoRzBIkJ zKtm~{78!bx{&uZRrQzKy?_Rkq_MfpM{PH%*3F<C&59!nRABO%_k!V=czgdRHu86%H zmE-FAeGJ@mf8GAs=Gl%LlmESg@;QfjvZ(#Zbq+__OiNjdcg=jfN14rP&`Md(pWrEf zx(M((c*>wCce)4HPr)}OJ<I8WynSu{#$d{&yk{XD^N@CFSo+59?Ms$*3~*J1;X9CY zT~H>=_d>5u_m=N@va)@}hd%?$ZI=I;dOdjgUqGxg6XzCmj(t1y!F@QJtzL!NskF59 z6E?ch&S~S%^-|~j=}OJ#e3UBkt2E6IBPvrzzuV1A6(0I@h2Q+?t|xBP&)eS8^%!WH zv>F~WOE$(~>vS4D|1Xjd?~%XP{C}*0$-jrs-;@XF`P-%^zpnXvJswjVe1Ms+t-OHi zfh)krfYSkfMd_e)ggnXB`5mFWuNPpYVOK)YgQJJyEf_dbPKdrZdWjE5%go61;1H(Q z{6oAv<JLzU5By5wPn5M0Ln2S}<C7&Kx@GjEKHOf8ie3_(#q>IVNBMR16Vd1T_`AzC ztQT(d@%4nR>A5n?kI#S>={ObP=ZC&_@TA~WKmB0r*F6{@-)88^mojyplj5fzC+mZo zqR#f?$IEY{zKqi2^&*b<6ChnJkZz!to^q~9DBBA;CQ!x}uBYJ1>?R}q68Lbr<CVk# zzXAS!c*1YNe+~b4c<zDyuap1P<H6wWwS08jz9PTL)VF>S|2(?JgRaNmu@rza|NjF7 zvj5kI_kZ?h-TxEWU&#Sx8GhgPck&Z@Jh1W9&(!0Ag(?3F9}hCH_pAANo1gMLz21*E z_$d$6{JYK1^~W1H#$x(sK;DM@E}gLE*JC6ta8Y2s568-{1DgYte)?oN%h~0e<HIT7 zj-HowKAbA|srk+$KAbMwWsMq5SmW;}J>B2B4g6E49uL{?{@wDu{psa+^74J@7VR%D z$BszoE&sd@g@(DCOS?H<yZ@xW$g~{29zqJNf_@IiR&Jbab^73#zT?q#G-&z@jzNuw zE<^_AsDHD=bhxL>T{5$L^2hD(`C{Waqh5b%;#!ZcouFy?LP4L&mmQL_XT|P`V&717 z$kk$yke-L9pWAC|>b*{Vdeq9l9lQJd_ioeu-^%N`U#I)O?XR5g!`J(q-}U<5?iZ3j zI1ECaM4O-EhaMm7{O|7v==s@<CwhE1x}pE;@j=VmjQmiK4`Jht9v{NS4-MP$C?9+Q z<*W9@=gLhHZ%4dGSeMsA*0|f;V+rf|zLo59&xkn1hug`mfhF#hKHL%W{p)gv4|kKR zos$DSd^iKUiB-;2AI_EC5p_l$7{&Q}fN+14<Hbm%InXhKX%BXvka@!O4n4Rr-9vBu z*k2lsA^VHxIP!0H-xL4ccHVxv7<*Bbg7vwBlS4E9%|$ng{`e<W?*8HN-3y-B{q+z2 z_%#tU)mHK3qk{D3XBxj6B~L!*EAi^<Owd$a&6Ac2qdgX(2jRl!f6B*t;&>=n)DThZ ztq(wcUCRS)e`I^t<Aa5{f1vxn&CmS--QRJ3fcUt+(EZ)UbN@{DcMEfUp!>IlIUcP5 zJ>LG`N!Z_;@53?D+U@6l;lr_VxO<E{hOo|`ESChn3S<#3X89>N-?mL&^V6rw_0HnJ zKm7FR;;I$SIevUUxg+AwkvI5ow*1pQCqnZFT3*&4XWNd{{ry1u`oZ?|@IJn;`QPi` z`-<Nmf55SdG(C!EY^;xa^U#U4&^taE@*{8)X&7_SE&u%vFA<JYR}{(%E&OhG)Eg`B z`vZ;_`277%peg@!!CO#hX%m@#|E_-j(FYZq|FB6;IxpNwds?nvU!Z9tym<uk|DbUH zw24C=U5|pMy`Ap=R=&>utmpq#5@I^;&*}bc<Jo`1<@@ZP;r-p;?`vc7lONFi-R9?b zp!>Upxxc9UyM;NQufTDCufPAw{obAL!!hz{V5WN`;UwaZh5qeX?!7*oEQ14E0w4Ks z3Qo7~mUDbKRYFc&U<_f+@25+e`cA#*$M=(t5#O5rt>vegdcWYmo&V>1Y<A5xu&)}> z{eOY!uk3%i|67>rb>06h%=Lio?^geZ>wCTaxBUCw>wm82b^o{dDL>Ht-@=qH=>BhE z$^+72azp9!oB{c5;LAWEVcp+jBqA^}kVm-4^#A#Ry8<Wp@yW6P=Sgq%;S}t?{6;1a z*5`jx<vP{hxyX-Chc-~1IS&+aLey^Nc=k*0@0_O#VcO&=*cj-YCc^!(b77Bx`(WJb z;{F)-w773YStidzQ74jmP}GH>e1vNr@<kjgSzjqI<nRbKn@eCy<YbstDS^q9%Yc75 z@KgTDJujXk<=IinKdDnmJu2!_aR2K*+~>YmDZ=0MG_rc`b5Yll`c>TfryPcBEAn5I znQ~m_yZIA*JCu7f{0x*Ghd1$0Jl`CIn?T13&_S6x&v8*#llocI(V!fMYcuk1l(}+T z=er$>XW5Nsc?|e20={*?k&XHp1sv4vq&^pQIw<$yT8{i4Wwe|J?nd5m$a@0v22k$( zpyLOGNyvLKo@)%AkNb0XfVPE5%e^`BhexDBu8R0X#8bXIs25lQTyt;kE#TON@<X7b z0M|Pau0r}(P|jrzp1BXo>W%zJPZ|AbfH%XJAx(Tg%)v;Lfc4M=eMQ~|-iMI(!$R;E z*{B=bQ@G|C-lqZo9oOmblr8ccJZ0~cxA)3{E@n0GW{GS;czX@%1?69ibh`h8Jb~l> zweJ6R{@z>Phy1@D4{SX7b<Gdh{N(4gJix;KdZ4YrPkum;7dD>!#R%1~-r)G7#|w*} z{V{xf;PVSMKlv3se%SQnFM8v>nDHVY84+_M93PI6+3x-BG{QQ6ti0;RMXdGVWH~yJ z?XoYJ{3+NmeqXmw1E=D=f8PMxmw|CEMt!5$W(>Z5a%x0vB-;gG^qL%P^TNWY-@$Te z<hzlVBhpQB0O$SJuOGZUgyneVdiXW)josszHR9#(JHP(jy6xX=c=YXWCY3G!=gD7p zR<C@1<U`xOJ9*pR^55D0%8NaAe0$`XFPyb?_t2Hkez)?A<6mnrFnQ-u+dkcXWZt;X zv%XmK!U^BB-|@#?f9Q6@${n3=>o{xYE3fxBzw<}Coyw0-8C1M-XW^OI(@wwrl=IZ? ztKVJq&8a7sJ@fjo-RW@|4`-L2@$JAX-`f4!f)R1MD+_nL@|&;ndJX(+REzIVR_`D2 z*Uvlmd3Sf`Q@?&_^K0uqUiaBQb}t`s*ykVL^{Kma<&*11w*2RmZ}2t;vV;7HbAKfM zml&=4|2GmMZTqzUVdMSt{<{Cr!qz_Qf2=n6s1Fq0e?z#<F%R{G@|0ZXT(^h)kE}qJ zvHzjt1Ckra4TD{|*}2)+_t5bXk{QS}_CPcoDVqYD!r-7>3wsC8DU_%A{V4fJePrx? z=;w)+B$X5f$H@EYeRJMX<AePVl^h1g$~IUM`oPE6Qa)548n}wj(@NT^wraB<A15Cm zwgHZpHmZ%W*P-c2knMr(0q;B`N5R&rwSS(G_PpLx?<swLaXRrQNlqZg*ykuD+(vG2 zZV0o_ku3cK{f&K&BN*RS);sIN>~pk}n;iT|pMJg+xzV{X%sxkZS?8=X_BcY!-vRQG z>kT}Ca7W1wWQW=3=p_F6Mg9DT$-C-ZbAE9c(|49cg&*H{Pr@O69??6mNc$h32R;wz z^NPAY(qtxno^6b#+TY+<<9QF){z5Npc=&tZz#rads<g~B*DX*VAI~<|XX8G3Bc^GI z_f&AWxpq~mYyi(;?#Ijf1B|F7enyTwu)y3eL|!YSMqb#YnP%>{Lf#qW<~kWYu~V(N zj)EPvuTC`A-Lc=cX_dKd4c_~V0&~3rIMZ!<2kD=+X~rPU1&d9Zc;I|=n7Lkr^s6oX zy8kP|`=MpJK1Tn~!qlhJ`~c)HjOTehJ^$Nyo(IfTXt_52fY1Ni^gKVP$A@tSzpu|{ zVd@*62R=n<I3PnKuZmpm!!h!x`%T0`ABN;JGBvU<VNGAM{4;QcOTO0RPl3IucQvmG zlJPvL^0s;{Kwi<n>A1LCk^eLK`$=r@u^{<0qra6S??rBpv@m9b!Qf^FYd%Vi<9t3; z9*KN5l6)0l#E-z7F;Mh;ujPgLdO!7-zP{L>ypTEslo!5_XZ#kP`Um^Ew*m2Y!!zEy zW*-}dHhIL+tW)sbcn2L9n(OW=Rjlk5{UTbg!<eQ3<KARUz8FR%eoBtq4?dgs6Os2T z+y1L@{fO;@@8P-wcy^|V0UNg9By*j{)_t0}o(vk!v;8^({dx!b0`ccxJxngO{qZf} zdD-^I9_TwzPSiMu;9AR|k-i1!EV8s^R^{lm56c}5n)_NBVnM^;g(mM<;QXg8OHM~w zt<3$7&;cm7b#gn><XbvNfzFM#Uq^%f*fA!31=5TdZmx@Q%{3Uy%>f>L9uC($sePM$ z#vq<?lf@GRp3`lebj7vq|H~wVEPDN``@4nNeszDhF!^)c-?cp^+91l_gP*5-K=bqS z3_h;+H9v3jlmDLxLK7{_{lsv2KlOz!#@Y)>Ku-YHEXTWV`f!Z&4*WV0X~tK?$I5eo zcLIO*<CAfICnCT#tWwO+^FE*Jb)~_VDsQS84%dYSPL~##-MQ8?>HA5U8ylhft73o7 z#CtURdH=2QefBrjH<q>{XARZz0f1;#5%P>}Z}+186x+5PiMIW%Z8NRWW^yZZT|tV| zT>^FHdNkS$+X$A=lD}rCmJ<+XOV|i#Vbdfd&9%0D_Ef17b(G2bG|GC{w!Pj+!?r;@ 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 F_#bPWZ3O@T diff --git a/Utilities/CAI/cai_dll/cai_dll.opt b/Utilities/CAI/cai_dll/cai_dll.opt deleted file mode 100755 index 141839befae186f752518f390b3cd73e3cfad446..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 54784 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 diff --git a/Utilities/CAI/cai_dll/cai_dll.plg b/Utilities/CAI/cai_dll/cai_dll.plg deleted file mode 100755 index 6a4ce7b042..0000000000 --- a/Utilities/CAI/cai_dll/cai_dll.plg +++ /dev/null @@ -1,16 +0,0 @@ -<html> -<body> -<pre> -<h1>Build Log</h1> -<h3> ---------------------Configuration: cai_dll - Win32 Debug-------------------- -</h3> -<h3>Command Lines</h3> - - - -<h3>Results</h3> -cai.dll - 0 error(s), 0 warning(s) -</pre> -</body> -</html> diff --git a/Utilities/CAI/cai_dll/dll/hd421md.dll b/Utilities/CAI/cai_dll/dll/hd421md.dll deleted file mode 100755 index ac89adeda270f270fa9141a1ed28c432713d43bc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1151061 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 zC;=s)1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwO5neRfM_Sze@Z|JC;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) z1eAahPy$Lo2`B+2pahhF5>Nt4KnW-TC7=Y9fD%vwN<axH0VSXWlz<XY0!ly$C;=s) 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 diff --git a/Utilities/CAI/cai_dll/dll/hm421md.dll b/Utilities/CAI/cai_dll/dll/hm421md.dll deleted file mode 100755 index ffb7c04c35d423ac1fb7fba7f502a79432603e08..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 266325 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,~XE`%PV_83; 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�o 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 diff --git a/Utilities/CAI/cai_dll/dll/szlibdll.dll b/Utilities/CAI/cai_dll/dll/szlibdll.dll deleted file mode 100755 index 2e3d53b7fb40a148b3476bb46c0c2b7aced0a6b3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 77824 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 YLKFy5AVh%>1ws@EQ6NNt|78^TKQsa4<^TWy diff --git a/Utilities/CAI/cai_dll/dll/tiff.dll b/Utilities/CAI/cai_dll/dll/tiff.dll deleted file mode 100755 index 5aec94192c2af88c1ce705d343066d0848a6189d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 679994 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�@IR&jd4y`*2 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 diff --git a/Utilities/CAI/cai_dll/dll/zlib1.dll b/Utilities/CAI/cai_dll/dll/zlib1.dll deleted file mode 100755 index 4eb8adb9167b2826192b88bec87bc6c618329297..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 70656 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 E1F8gfB>(^b diff --git a/Utilities/CAI/cai_dll/inc/CMakeLists.txt b/Utilities/CAI/cai_dll/inc/CMakeLists.txt deleted file mode 100755 index 3f5eb00f91..0000000000 --- a/Utilities/CAI/cai_dll/inc/CMakeLists.txt +++ /dev/null @@ -1,5 +0,0 @@ -# Sources of non-templated classes. - -INSTALL_FILES(/include/otb/Utilities/CAI "(\\.h)$") - -SUBDIRS( inc_unix2win ) diff --git a/Utilities/CAI/cai_dll/inc/cai_image.h b/Utilities/CAI/cai_dll/inc/cai_image.h deleted file mode 100755 index 185b17e44a..0000000000 --- a/Utilities/CAI/cai_dll/inc/cai_image.h +++ /dev/null @@ -1,782 +0,0 @@ - -/* fichier include de toutes les informations necessaires au bon - fonctionnement de la bibliotheque Couche Acces Image */ - -/* MOD:VERSION:2:DM optimisation */ -/* VERSION : $Header: cai_image.h,v 1.12 01/02/15 14:24:43 cmf Exp $ */ -/* Octobre 1996 : prise en compte du format HDF pour QIV */ -/* Septembre 1999 : prise en compte du format GESSIMU */ -/* Septembre 1999 : prise en compte du format GDB et GDR */ -/* Regine CHAISEMARTIN (CISI) */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : prototypage des fonctions */ -/*****************************************************************************/ /* MOD : VERSION : 4.3 : DM : integration des formats SPOT1a4 et SPOT5 */ -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : suppression du format multiscope, modif SPOT5 */ -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : DM : integration du format RADAR_CNES */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA : PB de reconnaissance automatique RADAR */ -/*****************************************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte de l'information INTEL ou IEEE*/ -/* et des types non signes */ -/*****************************************************************************/ -/* MOD : VERSION : 5.3 : DM : portage de la couche CAI dans plateforme */ -/* Microsof Visual C++ V6.0 */ -/*****************************************************************************/ -/* MOD : VERSION : 5.3 : DM : prise en compte du format bandeau */ -/*****************************************************************************/ - - -#ifndef CAI_IMAGE_H -#define CAI_IMAGE_H - - -#ifndef MAIN -#define WHERE extern -#else -#define WHERE -#endif - - -/* Code à ajouter si visual c++ */ -#ifdef _MSC_VER - #define _HDF16 - #ifdef CAI_DLL_EXPORTS - #define EXPORT __declspec(dllexport) - #define WHERE - #else - #define EXPORT __declspec(dllimport) - #endif - #define LIGNES_PAVE NB_LIG - #define COLONNES_PAVE NB_COL - #define F_OK 0 - #define PATH_MAX 4096 - #define strcasecmp(a,b) _stricmp(a,b) - #define ftruncate(a,b) _chsize(a,b) - #define strncasecmp(a,b,c) _strnicmp(a,b,c) - #define snprintf _snprintf -#else - #define EXPORT -#endif - - - -#ifndef IN_CAI_HDF -#define WHERE_HDF extern EXPORT -#else -#define WHERE_HDF EXPORT -#endif - -#ifndef IN_CAI_BSQ -#define WHERE_BSQ extern EXPORT -#else -#define WHERE_BSQ EXPORT -#endif - -#ifndef IN_CAI_BIP -#define WHERE_BIP extern EXPORT -#else -#define WHERE_BIP EXPORT -#endif - -#ifndef IN_CAI_INRIA -#define WHERE_INRIA extern EXPORT -#else -#define WHERE_INRIA EXPORT -#endif - -#ifndef IN_CAI_ONERA -#define WHERE_ONERA extern EXPORT -#else -#define WHERE_ONERA EXPORT -#endif - -#ifndef IN_CAI_TIFF -#define WHERE_TIFF extern EXPORT -#else -#define WHERE_TIFF EXPORT -#endif - -#ifndef IN_CAI_BIL -#define WHERE_BIL extern EXPORT -#else -#define WHERE_BIL EXPORT -#endif - -#ifndef IN_CAI_LUM -#define WHERE_LUM extern EXPORT -#else -#define WHERE_LUM EXPORT -#endif - -#ifndef IN_CAI_GESSIMU -#define WHERE_GESSIMU extern EXPORT -#else -#define WHERE_GESSIMU EXPORT -#endif - -#ifndef IN_CAI_RASTER -#define WHERE_RASTER extern EXPORT -#else -#define WHERE_RASTER EXPORT -#endif - -#ifndef IN_CAI_JPEG -#define WHERE_JPEG extern EXPORT -#else -#define WHERE_JPEG EXPORT -#endif - -#ifndef IN_CAI_GRIL -#define WHERE_GRIL extern EXPORT -#else -#define WHERE_GRIL EXPORT -#endif - -#ifndef IN_CAI_DA -#define WHERE_DA extern EXPORT -#else -#define WHERE_DA EXPORT -#endif - -#ifndef IN_CAI_FONC -#define WHERE_FONC extern EXPORT -#else -#define WHERE_FONC EXPORT -#endif - -#ifndef IN_CAI_SPOT -#define WHERE_SPOT extern EXPORT -#else -#define WHERE_SPOT EXPORT -#endif - -#ifndef IN_CAI_RADAR -#define WHERE_RADAR extern EXPORT -#else -#define WHERE_RADAR EXPORT -#endif - -#ifndef IN_CAI_BANDEAU -#define WHERE_BANDEAU extern EXPORT -#else -#define WHERE_BANDEAU EXPORT -#endif - -#include "tiffio.h" -#include "jpeglib.h" - -typedef char CAI_EXTENS[5]; -typedef char CH3[3]; -typedef char CH50[50]; - -#define CAI_NB_MAX_IMA 200 -#define CAI_NB_MAX_CAN 250 -#define CAI_SUFFIXE_DA ".aux" -#define CAI_NB_ALLOC 100 -#define CAI_TAILLE_MAX_CLEDA 70 -#define CAI_TAILLE_MAX_LIGDA 8192 -#define CAI_NB_MAX_CLE 100 -#define CAI_TAILLE_MAX_ASCII 600 -#define CAI_JPEG_LECTURE 0 -#define CAI_JPEG_ECRITURE 1 -#define CAI_JPEG_MODIFIER 2 - -/* cette taille doit etre paire et superieur a 2 fois la taille du plus - grand mot cle du fichier */ -#define CAI_TAILLE_BUFFER 8192 -/* */ - - - -/* definition de types */ - -typedef enum{CAI_LECTURE,CAI_ECRITURE} CAI_MODE_OUVERTURE; -typedef char CAI_MOT_CLE[CAI_TAILLE_MAX_CLEDA]; -typedef char CAI_CHAINE[1024]; -typedef long int CAI_TYPE; -typedef long int CAI_OK_KO; - - -typedef struct { - CAI_CHAINE nom_fichier; /* nom du fichier ouvert */ - int descr; /* file descriptor du fichier de DA */ - char *buffer; /* buffer de donnee ASCII */ - long taille_buffer; /* taille du buffer ASCII demande */ - long taille_buffer_lu; /* taille du buffer ASCII lu */ - long num_buffer; /*( -1 si non lu ou si ajout ou modif DA) */ - CAI_MOT_CLE *liste_mot_cle;/* liste des mot cle ASCII presents ds fichier*/ - long int *ad_mot_cle; /* adresse des mot cles ASCII dans le fichier */ - long int *ad_donnee; /* adr debut de donnee apres chaque mot cle */ - int nb_mot_cle; /* nombre de mot cles presents ( -1 si non alloue ou si ajout ou modif DA) */ - CAI_MOT_CLE dernier_mot_cle;/* dernier mot cle lu dans le fichier ( oper cai_caractDA ) */ - long int ad_dern_mot_cle; /* adresse du dernier mot cle ASCII lu dans le fichier - (-1 si non alloue ou ajout ou modif )*/ - long int ad_dern_donnee; /* adresse du debut de la donne apres le dernier mot cle lu */ - char REMPLI[128]; -}CAI_FILE_DA; - - -typedef struct { - char TYPE_IMAGE[20]; - char NOM_IMAGE[1024]; - char COD_PIX[5]; - int INV_OCTETS; - int NB_CANAUX; - int NB_LIG; - int NB_COL; - char COMMENT[80]; - int NB_BITS_PIX; - int NUM_LIG_DEB; - int NUM_COL_DEB; - int PAS_GRIL_LIG; - int PAS_GRIL_COL; - int DECAL_LIG; - int DECAL_COL; - char CAR_GRIL[20]; - char TYPE_COD[5]; - char NIVEAU[3]; /* Niveau de traitement de l'image (SPOT) */ - int TYPE_SPOT; /* =1 SPOT 1a4 ; =2 SPOT5 TIFF ; =3 SPOT5 BIL */ - int ACCES_SPOT[2];/* 0 pour le leader et 1 pour le volume */ - char SENS_COD[3]; - int NBOCT_PIX; - TIFF *ACCES_CANAL_TIFF[CAI_NB_MAX_CAN]; - struct jpeg_decompress_struct *ACCES_CANAL_JPEG_LEC; - struct jpeg_compress_struct *ACCES_CANAL_JPEG_ECR; - JSAMPLE *image_JPEG; - FILE *ACCES_FILE_JPEG; - int ACCES_CANAL_INT[CAI_NB_MAX_CAN]; - int POS_OCTET[CAI_NB_MAX_CAN]; - char NOM_FIC_CAN[100*CAI_NB_MAX_CAN]; - char NOM_UTIL_CAN[100*CAI_NB_MAX_CAN]; - - int COLORMAP; - int *TABCOLOR; - int HISTO[CAI_NB_MAX_CAN][256]; - int NB_PIX_ECRITS[CAI_NB_MAX_CAN]; - CAI_MODE_OUVERTURE MODE; -}CAI_IMAGE; - - -#ifdef _CAI_IMAGE - -#ifdef _HDF16 - -#define CAI_NB_FORMAT 18 -#define CAI_NB_EXTENSIONS 18 - -static long int CAI_NUMEROS[CAI_NB_EXTENSIONS]= - { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}; -static char *CAI_SUFFIXES[CAI_NB_EXTENSIONS]= - { ".xs",".inf",".hd",".bil",".tif",".srf",".bip",".hdf",".lum", - ".jpg",".pfe",".gdb",".gdr"," "," "," ",".rad",".band"}; - -static char *CAI_NOM_FORMAT[CAI_NB_FORMAT]= -{"INRIA","ONERA","BSQ","BIL","TIFF","RASTERFILE","BIP","HDF","LUM","JPEG","GESSIMU","GDB","GDR","SPOT1A4","SPOT5TIF","SPOT5BIL","RADAR","BANDEAU"}; - - - -/* include necessaire pour le bon fonctionnement des fonctions d'acces des - donnees auxiliaires */ - -static char * CAI_SUF_FORMAT[2][CAI_NB_FORMAT]= - {{ ".xs",".inf",".hd",".bil",".tif",".srf",".bip",".hdf",".lum", - ".jpg",".pfe",".gdb",".gdr"," "," "," ",".rad",".band"}, - { ".xs",".inf",".hd",".bil",".tif",".srf",".bip",".hdf",".lum", - ".jpg",".pfe",".gdb",".gdr"," "," "," ",".rad",".band"}}; - -WHERE_HDF long int cai_liste_ima_hdf16(char *repert,char ***tab_ima); -WHERE_HDF CAI_OK_KO cai_dest_ima_hdf16(char *repertoire,char *nom_ima); -WHERE_HDF CAI_IMAGE *cai_ouvre_lecture_hdf16(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_HDF CAI_IMAGE *cai_ouvre_modifie_hdf16(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_HDF CAI_OK_KO cai_ferme_hdf16(CAI_IMAGE *image1); -WHERE_HDF CAI_IMAGE *cai_ouvre_creation_hdf16(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, - char* label); -WHERE_HDF CAI_OK_KO cai_ecriture_canal_hdf16(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_HDF CAI_OK_KO cai_lecture_canal_hdf16(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); -WHERE_HDF CAI_OK_KO cai_rename_fichiers_hdf16(CAI_IMAGE *image1, - CAI_EXTENS *TabExtens); - -#endif - -#ifdef _NOHDF16 -#define CAI_NB_FORMAT 17 -#define CAI_NB_EXTENSIONS 17 - -static long int CAI_NUMEROS[CAI_NB_EXTENSIONS]= - { 0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16}; -static char *CAI_SUFFIXES[CAI_NB_EXTENSIONS]= - { ".xs",".inf",".hd",".bil",".tif",".srf",".bip",".lum",".jpg",".pfe",".gdb",".gdr"," "," ",",",".rad",".band"}; - -static char *CAI_NOM_FORMAT[CAI_NB_FORMAT]= -{"INRIA","ONERA","BSQ","BIL","TIFF","RASTERFILE","BIP","LUM","JPEG","GESSIMU","GDB","GDR","SPOT1A4","SPOT5TIF","SPOT5BIL","RADAR","BANDEAU"}; - - -/* include necessaire pour le bon fonctionnement des fonctions d'acces des - donnees auxiliaires */ - -static char * CAI_SUF_FORMAT[2][CAI_NB_FORMAT]= - {{ ".xs",".inf",".hd",".bil",".tif",".srf",".bip",".lum", - ".jpg",".pfe",".gdb",".gdr"," "," "," ",".rad",".band"}, - { ".xs",".inf",".hd",".bil",".tif",".srf",".bip",".lum", - ".jpg",".pfe",".gdb",".gdr"," "," "," ",".rad",".band"}}; - -#endif - -WHERE_BSQ long int cai_liste_ima_bsq(char *repert,char ***tab_ima); -WHERE_BSQ CAI_OK_KO cai_dest_ima_bsq(char *repertoire,char *nom_ima); -WHERE_BSQ CAI_IMAGE *cai_ouvre_lecture_bsq(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_BSQ CAI_IMAGE *cai_ouvre_modifie_bsq(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_BSQ CAI_OK_KO cai_ferme_bsq(CAI_IMAGE *image1); -WHERE_BSQ CAI_IMAGE *cai_ouvre_creation_bsq(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, - char* label); -WHERE_BSQ CAI_OK_KO cai_ecriture_canal_bsq(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_BSQ CAI_OK_KO cai_lecture_canal_bsq(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); -WHERE_BSQ CAI_OK_KO cai_modif_nbbitspix_bsq(CAI_IMAGE *image1, - int NbBitsPix); - - -WHERE_BIP long int cai_liste_ima_bip(char *repert,char ***tab_ima); -WHERE_BIP CAI_OK_KO cai_dest_ima_bip(char *repertoire,char *nom_ima); -WHERE_BIP CAI_IMAGE *cai_ouvre_lecture_bip(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_BIP CAI_IMAGE *cai_ouvre_modifie_bip(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_BIP CAI_OK_KO cai_ferme_bip(CAI_IMAGE *image1); -WHERE_BIP CAI_IMAGE *cai_ouvre_creation_bip(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, - char* label); -WHERE_BIP CAI_OK_KO cai_ecriture_canal_bip(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_BIP CAI_OK_KO cai_lecture_canal_bip(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); -WHERE_BIP CAI_OK_KO cai_modif_nbbitspix_bip(CAI_IMAGE *image1, - int NbBitsPix); - -WHERE_INRIA long int cai_liste_ima_inria(char *repert,char ***tab_ima); -WHERE_INRIA CAI_OK_KO cai_dest_ima_inria(char *repertoire,char *nom_ima); -WHERE_INRIA CAI_IMAGE *cai_ouvre_lecture_inria(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_INRIA CAI_IMAGE *cai_ouvre_modifie_inria(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_INRIA CAI_OK_KO cai_ferme_inria(CAI_IMAGE *image1); -WHERE_INRIA CAI_IMAGE *cai_ouvre_creation_inria(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, - char* label); -WHERE_INRIA CAI_OK_KO cai_ecriture_canal_inria(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_INRIA CAI_OK_KO cai_lecture_canal_inria(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); - - -WHERE_ONERA long int cai_liste_ima_onera(char *repert,char ***tab_ima); -WHERE_ONERA CAI_OK_KO cai_dest_ima_onera(char *repertoire,char *nom_ima); -WHERE_ONERA CAI_IMAGE *cai_ouvre_lecture_onera(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_ONERA CAI_IMAGE *cai_ouvre_modifie_onera(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_ONERA CAI_OK_KO cai_ferme_onera(CAI_IMAGE *image1); -WHERE_ONERA CAI_IMAGE *cai_ouvre_creation_onera(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, - char* label); -WHERE_ONERA CAI_OK_KO cai_ecriture_canal_onera(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_ONERA CAI_OK_KO cai_lecture_canal_onera(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); - - -WHERE_TIFF long int cai_liste_ima_tiff(char *repert,char ***tab_ima); -WHERE_TIFF CAI_OK_KO cai_dest_ima_tiff(char *repertoire,char *nom_ima); -WHERE_TIFF CAI_IMAGE *cai_ouvre_lecture_tiff(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_TIFF CAI_IMAGE *cai_ouvre_modifie_tiff(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_TIFF CAI_OK_KO cai_ferme_tiff(CAI_IMAGE *image1); -WHERE_TIFF CAI_IMAGE *cai_ouvre_creation_tiff(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, - char* label); -WHERE_TIFF CAI_OK_KO cai_ecriture_canal_tiff(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_TIFF CAI_OK_KO cai_lecture_canal_tiff(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); - -WHERE_BIL long int cai_liste_ima_bil(char *repert,char ***tab_ima); -WHERE_BIL CAI_OK_KO cai_dest_ima_bil(char *repertoire,char *nom_ima); -WHERE_BIL CAI_IMAGE *cai_ouvre_lecture_bil(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_BIL CAI_IMAGE *cai_ouvre_modifie_bil(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_BIL CAI_OK_KO cai_ferme_bil(CAI_IMAGE *image1); -WHERE_BIL CAI_IMAGE *cai_ouvre_creation_bil(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, - char* label); -WHERE_BIL CAI_OK_KO cai_ecriture_canal_bil(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_BIL CAI_OK_KO cai_lecture_canal_bil(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); -WHERE_BIL CAI_OK_KO cai_modif_nbbitspix_bil(CAI_IMAGE *image1, - int NbBitsPix); - - -WHERE_LUM long int cai_liste_ima_lum(char *repert,char ***tab_ima); -WHERE_LUM CAI_OK_KO cai_dest_ima_lum(char *repertoire,char *nom_ima); -WHERE_LUM CAI_IMAGE *cai_ouvre_lecture_lum(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_LUM CAI_IMAGE *cai_ouvre_modifie_lum(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_LUM CAI_OK_KO cai_ferme_lum(CAI_IMAGE *image1); -WHERE_LUM CAI_IMAGE *cai_ouvre_creation_lum(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, - char* label); -WHERE_LUM CAI_OK_KO cai_ecriture_canal_lum(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_LUM CAI_OK_KO cai_lecture_canal_lum(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); - - -WHERE_RASTER long int cai_liste_ima_sun_raster(char *repert,char ***tab_ima); -WHERE_RASTER CAI_OK_KO cai_dest_ima_sun_raster(char *repertoire,char *nom_ima); -WHERE_RASTER CAI_IMAGE *cai_ouvre_lecture_sun_raster(char *repert, - char *nom_image,int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_RASTER CAI_IMAGE *cai_ouvre_modifie_sun_raster(char *repert, - char *nom_image, int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_RASTER CAI_OK_KO cai_ferme_sun_raster(CAI_IMAGE *image1); -WHERE_RASTER CAI_IMAGE *cai_ouvre_creation_sun_raster(char *repert, - char *nom_image, int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, char* label); -WHERE_RASTER CAI_OK_KO cai_ecriture_canal_sun_raster(CAI_IMAGE *image1, - int *canal, int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_RASTER CAI_OK_KO cai_lecture_canal_sun_raster(CAI_IMAGE *image1, - int *canal,int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); - - -WHERE_JPEG long int cai_liste_ima_jpeg(char *repert,char ***tab_ima); -WHERE_JPEG CAI_OK_KO cai_dest_ima_jpeg(char *repertoire,char *nom_ima); -WHERE_JPEG CAI_IMAGE *cai_ouvre_lecture_jpeg(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_JPEG CAI_IMAGE *cai_ouvre_modifie_jpeg(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_JPEG CAI_OK_KO cai_ferme_jpeg(CAI_IMAGE *image1); -WHERE_JPEG CAI_IMAGE *cai_ouvre_creation_jpeg(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, - char* label); -WHERE_JPEG CAI_OK_KO cai_ecriture_canal_jpeg(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_JPEG CAI_OK_KO cai_lecture_canal_jpeg(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); - - -WHERE_GESSIMU long int cai_liste_ima_gessimu(char *repert,char ***tab_ima); -WHERE_GESSIMU CAI_OK_KO cai_dest_ima_gessimu(char *repertoire,char *nom_ima); -WHERE_GESSIMU CAI_IMAGE *cai_ouvre_lecture_gessimu(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_GESSIMU CAI_IMAGE *cai_ouvre_modifie_gessimu(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_GESSIMU CAI_OK_KO cai_ferme_gessimu(CAI_IMAGE *image1); -WHERE_GESSIMU CAI_IMAGE *cai_ouvre_creation_gessimu(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, - char* label); -WHERE_GESSIMU CAI_OK_KO cai_ecriture_canal_gessimu(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_GESSIMU CAI_OK_KO cai_lecture_canal_gessimu(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); - - -WHERE_GRIL long int cai_liste_ima_grilles(char typgrille,char *repert, - char ***tab_ima); -WHERE_GRIL CAI_OK_KO cai_dest_ima_grilles(char typgrille,char *repertoire, - char *nom_ima); -WHERE_GRIL CAI_IMAGE *cai_ouvre_lecture_grilles(char typgrille,char *repert, - char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_GRIL CAI_IMAGE *cai_ouvre_modifie_grilles(char typgrille,char *repert, - char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_GRIL CAI_OK_KO cai_ferme_grilles(char typgrille,CAI_IMAGE *image1); -WHERE_GRIL CAI_IMAGE *cai_ouvre_creation_grilles(char typgrille, - char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, - char* label); -WHERE_GRIL CAI_OK_KO cai_ecriture_canal_grilles(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_GRIL CAI_OK_KO cai_lecture_canal_grilles(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); -WHERE_GRIL CAI_OK_KO cai_modif_nbbitspix_grilles(CAI_IMAGE *image1, - int NbBitsPix); - -WHERE_SPOT long int cai_liste_ima_spot(char typspot,char *repert, - char ***tab_ima); -WHERE_SPOT CAI_OK_KO cai_dest_ima_spot(char typspot,char *repertoire, - char *nom_ima); -WHERE_SPOT CAI_IMAGE *cai_ouvre_lecture_spot(char typspot,char *repert, - char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_SPOT CAI_IMAGE *cai_ouvre_modifie_spot(char typspot,char *repert, - char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_SPOT CAI_OK_KO cai_ferme_spot(char typspot,CAI_IMAGE *image1); -WHERE_SPOT CAI_IMAGE *cai_ouvre_creation_spot(char typspot, - char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, - char* label); -WHERE_SPOT CAI_OK_KO cai_ecriture_canal_spot(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_SPOT CAI_OK_KO cai_lecture_canal_spot(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); -WHERE_SPOT CAI_OK_KO cai_creat_leader_spot5( CAI_IMAGE *desc_im , - char *repertoire); - - -WHERE_RADAR long int cai_liste_ima_radar(char *repert,char ***tab_ima); -WHERE_RADAR CAI_OK_KO cai_dest_ima_radar(char *repertoire,char *nom_ima); -WHERE_RADAR CAI_IMAGE *cai_ouvre_lecture_radar(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_RADAR CAI_IMAGE *cai_ouvre_modifie_radar(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_RADAR CAI_OK_KO cai_ferme_radar(CAI_IMAGE *image1); -WHERE_RADAR CAI_IMAGE *cai_ouvre_creation_radar(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig, - char* label); -WHERE_RADAR CAI_OK_KO cai_ecriture_canal_radar(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *nombre_lignes_ecrire, - int *nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_RADAR CAI_OK_KO cai_lecture_canal_radar(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); - -WHERE_RADAR int cai_istyp_radar(char *type_code,int *ind_typ, int *is_Cplx); - -WHERE_BANDEAU long int cai_liste_ima_bandeau(char *repert,char ***tab_ima); -WHERE_BANDEAU CAI_OK_KO cai_dest_ima_bandeau(char *repertoire,char *nom_ima); -WHERE_BANDEAU CAI_IMAGE *cai_ouvre_lecture_bandeau(char *repert,char *nom_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_BANDEAU CAI_OK_KO cai_ferme_bandeau(CAI_IMAGE *image1); -WHERE_BANDEAU CAI_OK_KO cai_lecture_canal_bandeau(CAI_IMAGE *image1, int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nombre_lignes_lire, int *nombre_colonnes_lire, - int *pas_lig, int *pas_col,unsigned char *data); -#endif - -#define CAI_MAX_LG_FORMAT 20 -#define CAI_MAX_LG_IMAGE 1024 - -#define PERMS 0666 -#define CAI_NB_RADAR 28 -#define CAI_NB_TYPE 8 -#define CAI_NB_LUM 8 - -WHERE char CAI_ERREUR[1024]; -WHERE CAI_IMAGE *FBANDEAU[20]; - -static int CAI_RADAR_LONG[CAI_NB_RADAR]= -{1,1,2,2,4,4,8,1,1,1,1,1,1,1,1,2,4,8,8,16,2,2,2,2,2,2,2,2}; -static char *CAI_RADAR_TYP[CAI_NB_RADAR]= -{"OCT","PHA","I2","UI2","I4","R4","R8","1B","2B","3B","4B","5B","6B","7B","8B", -"COCT","CI2","CI4","CR4","CR8","C1B","C2B","C3B","C4B","C5B", -"C6B","C7B","C8B"}; -static char *CAI_TYPE_CONNU[CAI_NB_TYPE]= - {"OCT","UOCT","I2","UI2","I4","UI4","R4","R8"}; -static char *CAI_LUM_TYP[CAI_NB_LUM]= - {"BI","LI","BU","LU","FLOA","FLOL","R8B","R8L"}; - -#define CAI_OK 0 -#define CAI_KO 1 -#define CAI_IMPOS 2 -#define CAI_EOF -1 -#define CAI_ERREUR_OUV -2 -#define CAI_PB_LSEEK -3 -#define CAI_DEB_NEG -4 -#define CAI_FIN_DEP -5 -#define CAI_ECRASEMENT -6 -#define CAI_PB_READ -7 -#define CAI_PB_WRITE -8 -#define CAI_PB_FTRUNC -9 -#define CAI_ERR_FORME_FIC -10 -#define CAI_ERR_DO -11 -#define CAI_ERR_TYP -12 -#define CAI_ERR_FIN_DO -13 -#define CAI_ERR_ASCII -14 -#define CAI_ERR_ALLOC -15 -#define CAI_ERR_REEL -16 -#define CAI_ERR_ENTIER -17 -#define CAI_ERR_DIM -18 -#define CAI_ERREUR_RECHERCHE_MOT -19 -#define CAI_MOT_DEJA_EXISTE -20 -#define CAI_ERREUR_ENCODE -21 -#define CAI_ERR_ADRESSE -22 -#define CAI_CLE_TROP_LONG -23 -#define CAI_MC_INCONNU -24 -#define CAI_PAS_MC -24 -#define CAI_ERR_CROCHET -25 -#define CAI_TROUVE -26 -#define CAI_NON_TROUVE -27 - - -/* constantes relatives aux types de donnees */ -#define CAI_INCONNU -1 -#define CAI_ENTIER4 1 -#define CAI_REEL4 2 -#define CAI_REEL8 3 -#define CAI_ASCII 4 -#define CAI_BLOC 5 - - -/* prototype des fonctions */ - -WHERE_DA CAI_FILE_DA * cai_openDA(char *nom_fichier, char *type_image, - int nb_can,CAI_MODE_OUVERTURE mode_ouv); -WHERE_DA CAI_OK_KO cai_closeDA(CAI_FILE_DA *fd); -WHERE_DA CAI_OK_KO cai_removeDA(char *nom_fichier,char *type_image,int nb_can); -WHERE_DA CAI_OK_KO cai_lirecaractDA(CAI_FILE_DA *fd,char *mot_cle, - CAI_TYPE *type,int *nb_lig,int *nb_col, - long *taille_cell); -WHERE_DA CAI_OK_KO cai_lireDA(CAI_FILE_DA *fd,char *mot_cle, - CAI_TYPE *type,int *nb_lig,int *nb_col, - long *taille_cell,void *donnees); -WHERE_DA CAI_OK_KO cai_modifieDA(CAI_FILE_DA *fd,char *mot_cle, - CAI_TYPE type,int nb_lig,int nb_col, - long taille_cell,void *donnees); -WHERE_DA CAI_OK_KO cai_detruitDA(CAI_FILE_DA *fd,char *mot_cle); -WHERE_DA CAI_OK_KO cai_listeDA(CAI_FILE_DA *fd); -WHERE_DA CAI_OK_KO cai_ajouteDA(CAI_FILE_DA *fd,char *mot_cle, - CAI_TYPE type,int nb_lig,int nb_col, - long taille_cell,void *donnees); -WHERE_DA CAI_OK_KO cai_lecture_colormap(CAI_IMAGE *fdima); -WHERE_DA CAI_OK_KO cai_ecriture_colormap(CAI_IMAGE *fdima); - - -WHERE_FONC long int cai_liste_image(char *repert,char *type_image, - char ***tab_ima); -WHERE_FONC long int cai_liste_format(char ***tab_format, - char **(tab_suffixe[2])); -WHERE_FONC CAI_OK_KO cai_destruction_image(char *format,char *nom_ima); -WHERE_FONC CAI_IMAGE *cai_ouvre_lecture_image(char *nom_image,char *type_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_FONC CAI_IMAGE *cai_ouvre_modifie_image(char *nom_image,char *type_image, - int *nb_can, int *nboct_pix, - int *nb_col, int *nb_lig); -WHERE_FONC CAI_OK_KO cai_ferme_image(CAI_IMAGE *image1); -WHERE_FONC CAI_IMAGE *cai_ouvre_creation_image(char *nom_image,char *type_image, - int nb_can, int nboct_pix, - int nb_col, int nb_lig, - char* label); -WHERE_FONC CAI_OK_KO cai_ecriture_canal(CAI_IMAGE *image1, int canal, - int premiere_ligne, int nombre_lignes_ecrire, - int nombre_colonnes_ecrire,unsigned char *data_image); -WHERE_FONC CAI_OK_KO cai_lecture_canal(CAI_IMAGE *image1, int canal, - int premiere_ligne, int premiere_colonne, - int nombre_lignes_lire, int nombre_colonnes_lire, - int pas_lig, int pas_col,unsigned char *data); -WHERE_FONC CAI_OK_KO cai_modif_nbbitspix(char *format,CAI_IMAGE *image, - int NbBitsPix); - -WHERE_FONC CAI_OK_KO cai_modif_nbbitspix(char *format,CAI_IMAGE *image, - int NbBitsPix); -WHERE_FONC void cai_inverser_tableau(short *BufL,short *BufE,int Nb); -WHERE_FONC void cai_inverser_tableau_complet(unsigned char *data_image, - int nbpix, int oct_pix); -WHERE_FONC char* cai_test_pFpf(); -WHERE_FONC char* cai_En_majuscule( char *mot ); -WHERE_FONC char* cai_En_minuscule( char *mot ); -WHERE_FONC int cai_istyp_connu(char *type_code); -WHERE_FONC CAI_OK_KO cai_lead4to5spot ( CAI_IMAGE *desc_im ,char *repertoire); - -#endif -#ifndef _WIN -#define O_BINARY 0 -#endif diff --git a/Utilities/CAI/cai_dll/inc/cderror.h b/Utilities/CAI/cai_dll/inc/cderror.h deleted file mode 100755 index 41a29cd12f..0000000000 --- a/Utilities/CAI/cai_dll/inc/cderror.h +++ /dev/null @@ -1,132 +0,0 @@ -/* - * cderror.h - * - * Copyright (C) 1994, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the error and message codes for the cjpeg/djpeg - * applications. These strings are not needed as part of the JPEG library - * proper. - * Edit this file to add new codes, or to translate the message strings to - * some other language. - */ - -/* - * To define the enum list of message codes, include this file without - * defining macro JMESSAGE. To create a message string table, include it - * again with a suitable JMESSAGE definition (see jerror.c for an example). - */ -#ifndef JMESSAGE -#ifndef CDERROR_H -#define CDERROR_H -/* First time through, define the enum list */ -#define JMAKE_ENUM_LIST -#else -/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ -#define JMESSAGE(code,string) -#endif /* CDERROR_H */ -#endif /* JMESSAGE */ - -#ifdef JMAKE_ENUM_LIST - -typedef enum { - -#define JMESSAGE(code,string) code , - -#endif /* JMAKE_ENUM_LIST */ - -JMESSAGE(JMSG_FIRSTADDONCODE=1000, NULL) /* Must be first entry! */ - -#ifdef BMP_SUPPORTED -JMESSAGE(JERR_BMP_BADCMAP, "Unsupported BMP colormap format") -JMESSAGE(JERR_BMP_BADDEPTH, "Only 8- and 24-bit BMP files are supported") -JMESSAGE(JERR_BMP_BADHEADER, "Invalid BMP file: bad header length") -JMESSAGE(JERR_BMP_BADPLANES, "Invalid BMP file: biPlanes not equal to 1") -JMESSAGE(JERR_BMP_COLORSPACE, "BMP output must be grayscale or RGB") -JMESSAGE(JERR_BMP_COMPRESSED, "Sorry, compressed BMPs not yet supported") -JMESSAGE(JERR_BMP_NOT, "Not a BMP file - does not start with BM") -JMESSAGE(JTRC_BMP, "%ux%u 24-bit BMP image") -JMESSAGE(JTRC_BMP_MAPPED, "%ux%u 8-bit colormapped BMP image") -JMESSAGE(JTRC_BMP_OS2, "%ux%u 24-bit OS2 BMP image") -JMESSAGE(JTRC_BMP_OS2_MAPPED, "%ux%u 8-bit colormapped OS2 BMP image") -#endif /* BMP_SUPPORTED */ - -#ifdef GIF_SUPPORTED -JMESSAGE(JERR_GIF_BUG, "GIF output got confused") -JMESSAGE(JERR_GIF_CODESIZE, "Bogus GIF codesize %d") -JMESSAGE(JERR_GIF_COLORSPACE, "GIF output must be grayscale or RGB") -JMESSAGE(JERR_GIF_IMAGENOTFOUND, "Too few images in GIF file") -JMESSAGE(JERR_GIF_NOT, "Not a GIF file") -JMESSAGE(JTRC_GIF, "%ux%ux%d GIF image") -JMESSAGE(JTRC_GIF_BADVERSION, - "Warning: unexpected GIF version number '%c%c%c'") -JMESSAGE(JTRC_GIF_EXTENSION, "Ignoring GIF extension block of type 0x%02x") -JMESSAGE(JTRC_GIF_NONSQUARE, "Caution: nonsquare pixels in input") -JMESSAGE(JWRN_GIF_BADDATA, "Corrupt data in GIF file") -JMESSAGE(JWRN_GIF_CHAR, "Bogus char 0x%02x in GIF file, ignoring") -JMESSAGE(JWRN_GIF_ENDCODE, "Premature end of GIF image") -JMESSAGE(JWRN_GIF_NOMOREDATA, "Ran out of GIF bits") -#endif /* GIF_SUPPORTED */ - -#ifdef PPM_SUPPORTED -JMESSAGE(JERR_PPM_COLORSPACE, "PPM output must be grayscale or RGB") -JMESSAGE(JERR_PPM_NONNUMERIC, "Nonnumeric data in PPM file") -JMESSAGE(JERR_PPM_NOT, "Not a PPM file") -JMESSAGE(JTRC_PGM, "%ux%u PGM image") -JMESSAGE(JTRC_PGM_TEXT, "%ux%u text PGM image") -JMESSAGE(JTRC_PPM, "%ux%u PPM image") -JMESSAGE(JTRC_PPM_TEXT, "%ux%u text PPM image") -#endif /* PPM_SUPPORTED */ - -#ifdef RLE_SUPPORTED -JMESSAGE(JERR_RLE_BADERROR, "Bogus error code from RLE library") -JMESSAGE(JERR_RLE_COLORSPACE, "RLE output must be grayscale or RGB") -JMESSAGE(JERR_RLE_DIMENSIONS, "Image dimensions (%ux%u) too large for RLE") -JMESSAGE(JERR_RLE_EMPTY, "Empty RLE file") -JMESSAGE(JERR_RLE_EOF, "Premature EOF in RLE header") -JMESSAGE(JERR_RLE_MEM, "Insufficient memory for RLE header") -JMESSAGE(JERR_RLE_NOT, "Not an RLE file") -JMESSAGE(JERR_RLE_TOOMANYCHANNELS, "Cannot handle %d output channels for RLE") -JMESSAGE(JERR_RLE_UNSUPPORTED, "Cannot handle this RLE setup") -JMESSAGE(JTRC_RLE, "%ux%u full-color RLE file") -JMESSAGE(JTRC_RLE_FULLMAP, "%ux%u full-color RLE file with map of length %d") -JMESSAGE(JTRC_RLE_GRAY, "%ux%u grayscale RLE file") -JMESSAGE(JTRC_RLE_MAPGRAY, "%ux%u grayscale RLE file with map of length %d") -JMESSAGE(JTRC_RLE_MAPPED, "%ux%u colormapped RLE file with map of length %d") -#endif /* RLE_SUPPORTED */ - -#ifdef TARGA_SUPPORTED -JMESSAGE(JERR_TGA_BADCMAP, "Unsupported Targa colormap format") -JMESSAGE(JERR_TGA_BADPARMS, "Invalid or unsupported Targa file") -JMESSAGE(JERR_TGA_COLORSPACE, "Targa output must be grayscale or RGB") -JMESSAGE(JTRC_TGA, "%ux%u RGB Targa image") -JMESSAGE(JTRC_TGA_GRAY, "%ux%u grayscale Targa image") -JMESSAGE(JTRC_TGA_MAPPED, "%ux%u colormapped Targa image") -#else -JMESSAGE(JERR_TGA_NOTCOMP, "Targa support was not compiled") -#endif /* TARGA_SUPPORTED */ - -JMESSAGE(JERR_BAD_CMAP_FILE, - "Color map file is invalid or of unsupported format") -JMESSAGE(JERR_TOO_MANY_COLORS, - "Output file format cannot handle %d colormap entries") -JMESSAGE(JERR_UNGETC_FAILED, "ungetc failed") -#ifdef TARGA_SUPPORTED -JMESSAGE(JERR_UNKNOWN_FORMAT, - "Unrecognized input file format --- perhaps you need -targa") -#else -JMESSAGE(JERR_UNKNOWN_FORMAT, "Unrecognized input file format") -#endif -JMESSAGE(JERR_UNSUPPORTED_FORMAT, "Unsupported output file format") - -#ifdef JMAKE_ENUM_LIST - - JMSG_LASTADDONCODE -} ADDON_MESSAGE_CODE; - -#undef JMAKE_ENUM_LIST -#endif /* JMAKE_ENUM_LIST */ - -/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ -#undef JMESSAGE diff --git a/Utilities/CAI/cai_dll/inc/cdjpeg.h b/Utilities/CAI/cai_dll/inc/cdjpeg.h deleted file mode 100755 index cc0d60016a..0000000000 --- a/Utilities/CAI/cai_dll/inc/cdjpeg.h +++ /dev/null @@ -1,179 +0,0 @@ -/* - * cdjpeg.h - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains common declarations for the sample applications - * cjpeg and djpeg. It is NOT used by the core JPEG library. - */ - -#define JPEG_CJPEG_DJPEG /* define proper options in jconfig.h */ -#define JPEG_INTERNAL_OPTIONS /* cjpeg.c,djpeg.c need to see xxx_SUPPORTED */ -#include "jinclude.h" -#include "jpeglib.h" -#include "jerror.h" /* get library error codes too */ -#include "cderror.h" /* get application-specific error codes */ - - -/* - * Object interface for cjpeg's source file decoding modules - */ - -typedef struct cjpeg_source_struct * cjpeg_source_ptr; - -struct cjpeg_source_struct { - JMETHOD(void, start_input, (j_compress_ptr cinfo, - cjpeg_source_ptr sinfo)); - JMETHOD(JDIMENSION, get_pixel_rows, (j_compress_ptr cinfo, - cjpeg_source_ptr sinfo)); - JMETHOD(void, finish_input, (j_compress_ptr cinfo, - cjpeg_source_ptr sinfo)); - - FILE *input_file; - - JSAMPARRAY buffer; - JDIMENSION buffer_height; -}; - - -/* - * Object interface for djpeg's output file encoding modules - */ - -typedef struct djpeg_dest_struct * djpeg_dest_ptr; - -struct djpeg_dest_struct { - /* start_output is called after jpeg_start_decompress finishes. - * The color map will be ready at this time, if one is needed. - */ - JMETHOD(void, start_output, (j_decompress_ptr cinfo, - djpeg_dest_ptr dinfo)); - /* Emit the specified number of pixel rows from the buffer. */ - JMETHOD(void, put_pixel_rows, (j_decompress_ptr cinfo, - djpeg_dest_ptr dinfo, - JDIMENSION rows_supplied)); - /* Finish up at the end of the image. */ - JMETHOD(void, finish_output, (j_decompress_ptr cinfo, - djpeg_dest_ptr dinfo)); - - /* Target file spec; filled in by djpeg.c after object is created. */ - FILE * output_file; - - /* Output pixel-row buffer. Created by module init or start_output. - * Width is cinfo->output_width * cinfo->output_components; - * height is buffer_height. - */ - JSAMPARRAY buffer; - JDIMENSION buffer_height; -}; - - -/* - * cjpeg/djpeg may need to perform extra passes to convert to or from - * the source/destination file format. The JPEG library does not know - * about these passes, but we'd like them to be counted by the progress - * monitor. We use an expanded progress monitor object to hold the - * additional pass count. - */ - -struct cdjpeg_progress_mgr { - struct jpeg_progress_mgr pub; /* fields known to JPEG library */ - int completed_extra_passes; /* extra passes completed */ - int total_extra_passes; /* total extra */ - /* last printed percentage stored here to avoid multiple printouts */ - int percent_done; -}; - -typedef struct cdjpeg_progress_mgr * cd_progress_ptr; - - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jinit_read_bmp jIRdBMP -#define jinit_write_bmp jIWrBMP -#define jinit_read_gif jIRdGIF -#define jinit_write_gif jIWrGIF -#define jinit_read_ppm jIRdPPM -#define jinit_write_ppm jIWrPPM -#define jinit_read_rle jIRdRLE -#define jinit_write_rle jIWrRLE -#define jinit_read_targa jIRdTarga -#define jinit_write_targa jIWrTarga -#define read_quant_tables RdQTables -#define read_scan_script RdScnScript -#define set_quant_slots SetQSlots -#define set_sample_factors SetSFacts -#define read_color_map RdCMap -#define enable_signal_catcher EnSigCatcher -#define start_progress_monitor StProgMon -#define end_progress_monitor EnProgMon -#define read_stdin RdStdin -#define write_stdout WrStdout -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - -/* Module selection routines for I/O modules. */ - -EXTERN(cjpeg_source_ptr) jinit_read_bmp JPP((j_compress_ptr cinfo)); -EXTERN(djpeg_dest_ptr) jinit_write_bmp JPP((j_decompress_ptr cinfo, - boolean is_os2)); -EXTERN(cjpeg_source_ptr) jinit_read_gif JPP((j_compress_ptr cinfo)); -EXTERN(djpeg_dest_ptr) jinit_write_gif JPP((j_decompress_ptr cinfo)); -EXTERN(cjpeg_source_ptr) jinit_read_ppm JPP((j_compress_ptr cinfo)); -EXTERN(djpeg_dest_ptr) jinit_write_ppm JPP((j_decompress_ptr cinfo)); -EXTERN(cjpeg_source_ptr) jinit_read_rle JPP((j_compress_ptr cinfo)); -EXTERN(djpeg_dest_ptr) jinit_write_rle JPP((j_decompress_ptr cinfo)); -EXTERN(cjpeg_source_ptr) jinit_read_targa JPP((j_compress_ptr cinfo)); -EXTERN(djpeg_dest_ptr) jinit_write_targa JPP((j_decompress_ptr cinfo)); - -/* cjpeg support routines (in rdswitch.c) */ - -EXTERN(boolean) read_quant_tables JPP((j_compress_ptr cinfo, char * filename, - int scale_factor, boolean force_baseline)); -EXTERN(boolean) read_scan_script JPP((j_compress_ptr cinfo, char * filename)); -EXTERN(boolean) set_quant_slots JPP((j_compress_ptr cinfo, char *arg)); -EXTERN(boolean) set_sample_factors JPP((j_compress_ptr cinfo, char *arg)); - -/* djpeg support routines (in rdcolmap.c) */ - -EXTERN(void) read_color_map JPP((j_decompress_ptr cinfo, FILE * infile)); - -/* common support routines (in cdjpeg.c) */ - -EXTERN(void) enable_signal_catcher JPP((j_common_ptr cinfo)); -EXTERN(void) start_progress_monitor JPP((j_common_ptr cinfo, - cd_progress_ptr progress)); -EXTERN(void) end_progress_monitor JPP((j_common_ptr cinfo)); -EXTERN(boolean) keymatch JPP((char * arg, const char * keyword, int minchars)); -EXTERN(FILE *) read_stdin JPP((void)); -EXTERN(FILE *) write_stdout JPP((void)); - -/* miscellaneous useful macros */ - -#ifdef DONT_USE_B_MODE /* define mode parameters for fopen() */ -#define READ_BINARY "r" -#define WRITE_BINARY "w" -#else -#define READ_BINARY "rb" -#define WRITE_BINARY "wb" -#endif - -#ifndef EXIT_FAILURE /* define exit() codes if not provided */ -#define EXIT_FAILURE 1 -#endif -#ifndef EXIT_SUCCESS -#ifdef VMS -#define EXIT_SUCCESS 1 /* VMS is very nonstandard */ -#else -#define EXIT_SUCCESS 0 -#endif -#endif -#ifndef EXIT_WARNING -#ifdef VMS -#define EXIT_WARNING 1 /* VMS is very nonstandard */ -#else -#define EXIT_WARNING 2 -#endif -#endif diff --git a/Utilities/CAI/cai_dll/inc/g3states.h b/Utilities/CAI/cai_dll/inc/g3states.h deleted file mode 100755 index e69de29bb2..0000000000 diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/atom.h b/Utilities/CAI/cai_dll/inc/inc_hdf/atom.h deleted file mode 100755 index 9caab48d9e..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/atom.h +++ /dev/null @@ -1,300 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: atom.h - * Purpose: header file for atom API - * Dependencies: - * Invokes: - * Contents: - * Structure definitions: - * Constant definitions: - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef __ATOM_H -#define __ATOM_H - -/* Atom Features control */ -/* Define the following macro for fast hash calculations (but limited hash sizes) */ -#define HASH_SIZE_POWER_2 - -/* Define the following macro for atom caching over all the atoms */ -#define ATOMS_ARE_CACHED - -/* Define the following macro for "inline" atom lookups from the cache */ -#ifdef ATOMS_ARE_CACHED /* required for this to work */ -#define ATOMS_CACHE_INLINE -#endif /* ATOMS_ARE_CACHED */ - -#ifdef ATOMS_CACHE_INLINE -/* Do swap using XOR operator. Ugly but fast... -QAK */ -#define HAIswap_cache(i,j) \ - atom_id_cache[i]^=atom_id_cache[j], \ - atom_obj_cache[i]=(void *)((hdf_pint_t)atom_obj_cache[j]^(hdf_pint_t)atom_obj_cache[i]), \ - atom_id_cache[j]^=atom_id_cache[i], \ - atom_obj_cache[j]=(void *)((hdf_pint_t)atom_obj_cache[i]^(hdf_pint_t)atom_obj_cache[j]), \ - atom_id_cache[i]^=atom_id_cache[j], \ - atom_obj_cache[i]=(void *)((hdf_pint_t)atom_obj_cache[i]^(hdf_pint_t)atom_obj_cache[j]) - -/* Note! This is hardwired to the atom cache value being 4 */ -#define HAatom_object(atm) \ - (atom_id_cache[0]==atm ? atom_obj_cache[0] : \ - atom_id_cache[1]==atm ? (HAIswap_cache(0,1),atom_obj_cache[0]) : \ - atom_id_cache[2]==atm ? (HAIswap_cache(1,2),atom_obj_cache[1]) : \ - atom_id_cache[3]==atm ? (HAIswap_cache(2,3),atom_obj_cache[2]) : \ - HAPatom_object(atm)) -#endif /* ATOMS_CACHE_INLINE */ - -#include "hdf.h" - -/* Group values allowed */ -typedef enum {BADGROUP=(-1), /* Invalid Group */ -DDGROUP=0, /* Group ID for DD objects */ -AIDGROUP=1, /* Group ID for access ID objects */ -FIDGROUP=2, /* Group ID for file ID objects */ -VGIDGROUP=3, /* Group ID for Vgroup ID objects */ -VSIDGROUP=4, /* Group ID for Vdata ID objects */ -GRIDGROUP=5, /* Group ID for GR ID objects */ -RIIDGROUP=6, /* Group ID for RI ID objects */ -BITIDGROUP=7, /* Group ID for Bitfile ID objects */ -ANIDGROUP=8, /* Group ID for Annotation ID objects */ -MAXGROUP /* Highest group in group_t (Invalid as true group) */ -} group_t; - -/* Type of atoms to return to users */ -typedef int32 atom_t; - -/* Type of the function to compare objects & keys */ -typedef intn (*HAsearch_func_t)(const void * obj, const void * key); - -#if defined ATOM_MASTER | defined ATOM_TESTER - -/* # of bits to use for Group ID in each atom (change if MAXGROUP>16) */ -#define GROUP_BITS 4 -#define GROUP_MASK 0x0F - -/* # of bits to use for the Atom index in each atom (change if MAXGROUP>16) */ -#define ATOM_BITS 28 -#define ATOM_MASK 0x0FFFFFFF - -#ifdef ATOMS_ARE_CACHED -/* # of previous atoms cached, change inline caching macros (HAatom_object & HAIswap_cache) if this changes */ -#define ATOM_CACHE_SIZE 4 -#endif /* ATOMS_ARE_CACHED */ - -/* Map an atom to a Group number */ -#define ATOM_TO_GROUP(a) ((group_t)((((atom_t)(a))>>((sizeof(atom_t)*8)-GROUP_BITS))&GROUP_MASK)) - -#ifdef HASH_SIZE_POWER_2 -/* Map an atom to a hash location (assumes s is a power of 2 and smaller than the ATOM_MASK constant) */ -#define ATOM_TO_LOC(a,s) ((atom_t)(a)&((s)-1)) -#else /* HASH_SIZE_POWER_2 */ -/* Map an atom to a hash location */ -#define ATOM_TO_LOC(a,s) (((atom_t)(a)&ATOM_MASK)%(s)) -#endif /* HASH_SIZE_POWER_2 */ - -/* Combine a Group number and an atom index into an atom */ -#define MAKE_ATOM(g,i) ((((atom_t)(g)&GROUP_MASK)<<((sizeof(atom_t)*8)-GROUP_BITS))|((atom_t)(i)&ATOM_MASK)) - -/* Atom information structure used */ -typedef struct atom_info_struct_tag { - atom_t id; /* atom ID for this info */ - VOIDP *obj_ptr; /* pointer associated with the atom */ - struct atom_info_struct_tag *next; /* link to next atom (in case of hash-clash) */ - }atom_info_t; - -/* Atom group structure used */ -typedef struct atom_group_struct_tag { - uintn count; /* # of times this group has been initialized */ - intn hash_size; /* size of the hash table to store the atoms in */ - uintn atoms; /* current number of atoms held */ - uintn nextid; /* atom ID to use for the next atom */ - atom_info_t **atom_list;/* pointer to an array of ptrs to atoms */ - }atom_group_t; - -/* Define this in only one place */ -#ifdef ATOM_MASTER - -/* Array of pointers to atomic groups */ -static atom_group_t *atom_group_list[MAXGROUP]={NULL}; - -/* Pointer to the atom node free list */ -static atom_info_t *atom_free_list=NULL; - -#ifdef ATOMS_ARE_CACHED -/* Array of pointers to atomic groups */ -#ifdef OLD_WAY -static atom_t atom_id_cache[ATOM_CACHE_SIZE]={-1,-1,-1,-1}; -static VOIDP atom_obj_cache[ATOM_CACHE_SIZE]={NULL}; -#else /* OLD_WAY */ -atom_t atom_id_cache[ATOM_CACHE_SIZE]={-1,-1,-1,-1}; -VOIDP atom_obj_cache[ATOM_CACHE_SIZE]={NULL}; -#endif /* OLD_WAY */ -#endif /* ATOMS_ARE_CACHED */ -#endif /* ATOM_MASTER */ - -/* Useful routines for generally private use */ - -#endif /* ATOM_MASTER | ATOM_TESTER */ - -#ifndef ATOM_MASTER -extern atom_t atom_id_cache[]; -extern VOIDP atom_obj_cache[]; -#endif /* ATOM_MASTER */ - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/****************************************************************************** - NAME - HAinit_group - Initialize an atomic group - - DESCRIPTION - Creates an atomic group to store atoms in. If the group has already been - initialized, this routine just increments the count of # of initializations - and returns without trying to change the size of the hash table. - - RETURNS - Returns SUCCEED if successful and FAIL otherwise - -*******************************************************************************/ -intn HAinit_group(group_t grp, /* IN: Group to initialize */ - intn hash_size /* IN: Minimum hash table size to use for group */ -); - -/****************************************************************************** - NAME - HAdestroy_group - Destroy an atomic group - - DESCRIPTION - Destroys an atomic group which atoms are stored in. If the group still - has atoms which are registered, this routine fails. If there have been - multiple initializations of the group, this routine just decrements the - count of initializations and does not check the atoms out-standing. - - RETURNS - Returns SUCCEED if successful and FAIL otherwise - -*******************************************************************************/ -intn HAdestroy_group(group_t grp /* IN: Group to destroy */ -); - -/****************************************************************************** - NAME - HAregister_atom - Register an object in a group and get an atom for it. - - DESCRIPTION - Registers an object in a group and returns an atom for it. This routine - does _not_ check for unique-ness of the objects, if you register an object - twice, you will get two different atoms for it. This routine does make - certain that each atom in a group is unique. Atoms are created by getting - a unique number for the group the atom is in and incorporating the group - into the atom which is returned to the user. - - RETURNS - Returns atom if successful and FAIL otherwise - -*******************************************************************************/ -atom_t HAregister_atom(group_t grp, /* IN: Group to register the object in */ - VOIDP object /* IN: Object to attach to atom */ -); - -/****************************************************************************** - NAME - HAatom_object - Returns to the object ptr for the atom - - DESCRIPTION - Retrieves the object ptr which is associated with the atom. - - RETURNS - Returns object ptr if successful and NULL otherwise - -*******************************************************************************/ -#ifdef ATOMS_CACHE_INLINE -VOIDP HAPatom_object(atom_t atm /* IN: Atom to retrieve object for */ -); -#else /* ATOMS_CACHE_INLINE */ -VOIDP HAatom_object(atom_t atm /* IN: Atom to retrieve object for */ -); -#endif /* ATOMS_CACHE_INLINE */ - -/****************************************************************************** - NAME - HAatom_group - Returns to the group for the atom - - DESCRIPTION - Retrieves the group which is associated with the atom. - - RETURNS - Returns group if successful and FAIL otherwise - -*******************************************************************************/ -group_t HAatom_group(atom_t atm /* IN: Atom to retrieve group for */ -); - -/****************************************************************************** - NAME - HAremove_atom - Removes an atom from a group - - DESCRIPTION - Removes an atom from a group. - - RETURNS - Returns atom's object if successful and FAIL otherwise - -*******************************************************************************/ -VOIDP HAremove_atom(atom_t atm /* IN: Atom to remove */ -); - -/****************************************************************************** - NAME - HAsearch_atom - Search for an object in a group and get it's pointer. - - DESCRIPTION - Searchs for an object in a group and returns the pointer to it. - This routine calls the function pointer passed in for each object in the - group until it finds a match. Currently there is no way to resume a - search. - - RETURNS - Returns pointer an atom's object if successful and NULL otherwise - -*******************************************************************************/ -VOIDP HAsearch_atom(group_t grp, /* IN: Group to search for the object in */ - HAsearch_func_t func, /* IN: Ptr to the comparison function */ - const void * key /* IN: pointer to key to compare against */ -); - -/****************************************************************************** - NAME - HAshutdown - Terminate various static buffers. - - DESCRIPTION - Free various buffers allocated in the HA routines. - - RETURNS - Returns SUCCEED/FAIL - -*******************************************************************************/ -intn HAshutdown(void); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -#endif /* __ATOM_H */ - diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/bitvect.h b/Utilities/CAI/cai_dll/inc/inc_hdf/bitvect.h deleted file mode 100755 index fe3bec1352..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/bitvect.h +++ /dev/null @@ -1,385 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: bitvect.h - * Purpose: header file for bit-vector API - * Dependencies: - * Invokes: - * Contents: - * Structure definitions: - * Constant definitions: - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef __BITVECT_H -#define __BITVECT_H - -#include "hdf.h" - -/* Boolean values used */ -typedef enum {BV_FALSE=0, BV_TRUE=1} bv_bool; - -/* Flags for the bit-vector */ -#define BV_INIT_TO_ONE 0x00000001 /* to indicate whether to create the bit-vector with one's instead of zero's */ -#define BV_EXTENDABLE 0x00000002 /* to indicate that the bit-vector can be extended */ - -/* Default size of a bit-vector */ -#define BV_DEFAULT_BITS 128 - -/* Define the size of the chunks bits are allocated in */ -#define BV_CHUNK_SIZE 64 - -/* Create the external interface data structures needed */ -typedef struct bv_struct_tag *bv_ptr; - -#if defined BV_MASTER | defined BV_TESTER - -/* Base type of the array used to store the bits */ -typedef unsigned char bv_base; - -/* # of bits in the base type of the array used to store the bits */ -#define BV_BASE_BITS (sizeof(bv_base)*8) - -/* bit-vector structure used */ -typedef struct bv_struct_tag { - uint32 bits_used; /* The actual number of bits current in use */ - uint32 array_size; /* The number of bv_base elements in the bit-vector */ - uint32 flags; /* The flags used to create this bit-vector */ - int32 last_zero; /* The last location we know had a zero bit */ - bv_base *buffer; /* Pointer to the buffer used to store the bits */ - }bv_struct; - -/* Table of bits for each bit position */ -/* (This will need to be changed/expanded if another base type is used) */ -static const uint8 bv_bit_value[8]={ - 1, /* bit 0's value is 1 */ - 2, /* bit 1's value is 2 */ - 4, /* bit 2's value is 4 */ - 8, /* bit 3's value is 8 */ - 16, /* bit 4's value is 16 */ - 32, /* bit 5's value is 32 */ - 64, /* bit 6's value is 64 */ - 128 /* bit 7's value is 128 */ -}; - -/* Table of bit-masks for each number of bits in a byte */ -/* (This will need to be changed/expanded if another base type is used) */ -static const uint8 bv_bit_mask[9]={ - 0x00, /* 0 bits is a mask of 0x00 */ - 0x01, /* 1 bits is a mask of 0x01 */ - 0x03, /* 2 bits is a mask of 0x03 */ - 0x07, /* 3 bits is a mask of 0x07 */ - 0x0F, /* 4 bits is a mask of 0x0F */ - 0x1F, /* 5 bits is a mask of 0x1F */ - 0x3F, /* 6 bits is a mask of 0x3F */ - 0x7F, /* 7 bits is a mask of 0x7F */ - 0xFF /* 8 bits is a mask of 0xFF */ -}; - -/* Table of "first zero bit" for each byte value */ -/* (This will need to be changed/expanded if another base type is used) */ -static const int8 bv_first_zero[256]={ - 0, /* "0" - bit 0 is lowest zero */ 1, /* "1" - bit 1 is lowest zero */ - 0, /* "2" - bit 0 is lowest zero */ 2, /* "3" - bit 2 is lowest zero */ - 0, /* "4" - bit 0 is lowest zero */ 1, /* "5" - bit 1 is lowest zero */ - 0, /* "6" - bit 0 is lowest zero */ 3, /* "7" - bit 3 is lowest zero */ - 0, /* "8" - bit 0 is lowest zero */ 1, /* "9" - bit 1 is lowest zero */ - 0, /* "10" - bit 0 is lowest zero */ 2, /* "11" - bit 2 is lowest zero */ - 0, /* "12" - bit 0 is lowest zero */ 1, /* "13" - bit 1 is lowest zero */ - 0, /* "14" - bit 0 is lowest zero */ 4, /* "15" - bit 4 is lowest zero */ - 0, /* "16" - bit 0 is lowest zero */ 1, /* "17" - bit 1 is lowest zero */ - 0, /* "18" - bit 0 is lowest zero */ 2, /* "19" - bit 2 is lowest zero */ - 0, /* "20" - bit 0 is lowest zero */ 1, /* "21" - bit 1 is lowest zero */ - 0, /* "22" - bit 0 is lowest zero */ 3, /* "23" - bit 3 is lowest zero */ - 0, /* "24" - bit 0 is lowest zero */ 1, /* "25" - bit 1 is lowest zero */ - 0, /* "26" - bit 0 is lowest zero */ 2, /* "27" - bit 2 is lowest zero */ - 0, /* "28" - bit 0 is lowest zero */ 1, /* "29" - bit 1 is lowest zero */ - 0, /* "30" - bit 0 is lowest zero */ 5, /* "31" - bit 5 is lowest zero */ - 0, /* "32" - bit 0 is lowest zero */ 1, /* "33" - bit 1 is lowest zero */ - 0, /* "34" - bit 0 is lowest zero */ 2, /* "35" - bit 2 is lowest zero */ - 0, /* "36" - bit 0 is lowest zero */ 1, /* "37" - bit 1 is lowest zero */ - 0, /* "38" - bit 0 is lowest zero */ 3, /* "39" - bit 3 is lowest zero */ - 0, /* "40" - bit 0 is lowest zero */ 1, /* "41" - bit 1 is lowest zero */ - 0, /* "42" - bit 0 is lowest zero */ 2, /* "43" - bit 2 is lowest zero */ - 0, /* "44" - bit 0 is lowest zero */ 1, /* "45" - bit 1 is lowest zero */ - 0, /* "46" - bit 0 is lowest zero */ 4, /* "47" - bit 4 is lowest zero */ - 0, /* "48" - bit 0 is lowest zero */ 1, /* "49" - bit 1 is lowest zero */ - 0, /* "50" - bit 0 is lowest zero */ 2, /* "51" - bit 2 is lowest zero */ - 0, /* "52" - bit 0 is lowest zero */ 1, /* "53" - bit 1 is lowest zero */ - 0, /* "54" - bit 0 is lowest zero */ 3, /* "55" - bit 3 is lowest zero */ - 0, /* "56" - bit 0 is lowest zero */ 1, /* "57" - bit 1 is lowest zero */ - 0, /* "58" - bit 0 is lowest zero */ 2, /* "59" - bit 2 is lowest zero */ - 0, /* "60" - bit 0 is lowest zero */ 1, /* "61" - bit 1 is lowest zero */ - 0, /* "62" - bit 0 is lowest zero */ 6, /* "63" - bit 6 is lowest zero */ - 0, /* "64" - bit 0 is lowest zero */ 1, /* "65" - bit 1 is lowest zero */ - 0, /* "66" - bit 0 is lowest zero */ 2, /* "67" - bit 2 is lowest zero */ - 0, /* "68" - bit 0 is lowest zero */ 1, /* "69" - bit 1 is lowest zero */ - 0, /* "70" - bit 0 is lowest zero */ 3, /* "71" - bit 3 is lowest zero */ - 0, /* "72" - bit 0 is lowest zero */ 1, /* "73" - bit 1 is lowest zero */ - 0, /* "74" - bit 0 is lowest zero */ 2, /* "75" - bit 2 is lowest zero */ - 0, /* "76" - bit 0 is lowest zero */ 1, /* "77" - bit 1 is lowest zero */ - 0, /* "78" - bit 0 is lowest zero */ 4, /* "79" - bit 4 is lowest zero */ - 0, /* "80" - bit 0 is lowest zero */ 1, /* "81" - bit 1 is lowest zero */ - 0, /* "82" - bit 0 is lowest zero */ 2, /* "83" - bit 2 is lowest zero */ - 0, /* "84" - bit 0 is lowest zero */ 1, /* "85" - bit 1 is lowest zero */ - 0, /* "86" - bit 0 is lowest zero */ 3, /* "87" - bit 3 is lowest zero */ - 0, /* "88" - bit 0 is lowest zero */ 1, /* "89" - bit 1 is lowest zero */ - 0, /* "90" - bit 0 is lowest zero */ 2, /* "91" - bit 2 is lowest zero */ - 0, /* "92" - bit 0 is lowest zero */ 1, /* "93" - bit 1 is lowest zero */ - 0, /* "94" - bit 0 is lowest zero */ 5, /* "95" - bit 5 is lowest zero */ - 0, /* "96" - bit 0 is lowest zero */ 1, /* "97" - bit 1 is lowest zero */ - 0, /* "98" - bit 0 is lowest zero */ 2, /* "99" - bit 2 is lowest zero */ - 0, /* "100" - bit 0 is lowest zero */ 1, /* "101" - bit 1 is lowest zero */ - 0, /* "102" - bit 0 is lowest zero */ 3, /* "103" - bit 3 is lowest zero */ - 0, /* "104" - bit 0 is lowest zero */ 1, /* "105" - bit 1 is lowest zero */ - 0, /* "106" - bit 0 is lowest zero */ 2, /* "107" - bit 2 is lowest zero */ - 0, /* "108" - bit 0 is lowest zero */ 1, /* "109" - bit 1 is lowest zero */ - 0, /* "110" - bit 0 is lowest zero */ 4, /* "111" - bit 4 is lowest zero */ - 0, /* "112" - bit 0 is lowest zero */ 1, /* "113" - bit 1 is lowest zero */ - 0, /* "114" - bit 0 is lowest zero */ 2, /* "115" - bit 2 is lowest zero */ - 0, /* "116" - bit 0 is lowest zero */ 1, /* "117" - bit 1 is lowest zero */ - 0, /* "118" - bit 0 is lowest zero */ 3, /* "119" - bit 3 is lowest zero */ - 0, /* "120" - bit 0 is lowest zero */ 1, /* "121" - bit 1 is lowest zero */ - 0, /* "122" - bit 0 is lowest zero */ 2, /* "123" - bit 2 is lowest zero */ - 0, /* "124" - bit 0 is lowest zero */ 1, /* "125" - bit 1 is lowest zero */ - 0, /* "126" - bit 0 is lowest zero */ 7, /* "127" - bit 7 is lowest zero */ - 0, /* "128" - bit 0 is lowest zero */ 1, /* "129" - bit 1 is lowest zero */ - 0, /* "130" - bit 0 is lowest zero */ 2, /* "131" - bit 2 is lowest zero */ - 0, /* "132" - bit 0 is lowest zero */ 1, /* "133" - bit 1 is lowest zero */ - 0, /* "134" - bit 0 is lowest zero */ 3, /* "135" - bit 3 is lowest zero */ - 0, /* "136" - bit 0 is lowest zero */ 1, /* "137" - bit 1 is lowest zero */ - 0, /* "138" - bit 0 is lowest zero */ 2, /* "139" - bit 2 is lowest zero */ - 0, /* "140" - bit 0 is lowest zero */ 1, /* "141" - bit 1 is lowest zero */ - 0, /* "142" - bit 0 is lowest zero */ 4, /* "143" - bit 4 is lowest zero */ - 0, /* "144" - bit 0 is lowest zero */ 1, /* "145" - bit 1 is lowest zero */ - 0, /* "146" - bit 0 is lowest zero */ 2, /* "147" - bit 2 is lowest zero */ - 0, /* "148" - bit 0 is lowest zero */ 1, /* "149" - bit 1 is lowest zero */ - 0, /* "150" - bit 0 is lowest zero */ 3, /* "151" - bit 3 is lowest zero */ - 0, /* "152" - bit 0 is lowest zero */ 1, /* "153" - bit 1 is lowest zero */ - 0, /* "154" - bit 0 is lowest zero */ 2, /* "155" - bit 2 is lowest zero */ - 0, /* "156" - bit 0 is lowest zero */ 1, /* "157" - bit 1 is lowest zero */ - 0, /* "158" - bit 0 is lowest zero */ 5, /* "159" - bit 5 is lowest zero */ - 0, /* "160" - bit 0 is lowest zero */ 1, /* "161" - bit 1 is lowest zero */ - 0, /* "162" - bit 0 is lowest zero */ 2, /* "163" - bit 2 is lowest zero */ - 0, /* "164" - bit 0 is lowest zero */ 1, /* "165" - bit 1 is lowest zero */ - 0, /* "166" - bit 0 is lowest zero */ 3, /* "167" - bit 3 is lowest zero */ - 0, /* "168" - bit 0 is lowest zero */ 1, /* "169" - bit 1 is lowest zero */ - 0, /* "170" - bit 0 is lowest zero */ 2, /* "171" - bit 2 is lowest zero */ - 0, /* "172" - bit 0 is lowest zero */ 1, /* "173" - bit 1 is lowest zero */ - 0, /* "174" - bit 0 is lowest zero */ 4, /* "175" - bit 4 is lowest zero */ - 0, /* "176" - bit 0 is lowest zero */ 1, /* "177" - bit 1 is lowest zero */ - 0, /* "178" - bit 0 is lowest zero */ 2, /* "179" - bit 2 is lowest zero */ - 0, /* "180" - bit 0 is lowest zero */ 1, /* "181" - bit 1 is lowest zero */ - 0, /* "182" - bit 0 is lowest zero */ 3, /* "183" - bit 3 is lowest zero */ - 0, /* "184" - bit 0 is lowest zero */ 1, /* "185" - bit 1 is lowest zero */ - 0, /* "186" - bit 0 is lowest zero */ 2, /* "187" - bit 2 is lowest zero */ - 0, /* "188" - bit 0 is lowest zero */ 1, /* "189" - bit 1 is lowest zero */ - 0, /* "190" - bit 0 is lowest zero */ 6, /* "191" - bit 6 is lowest zero */ - 0, /* "192" - bit 0 is lowest zero */ 1, /* "193" - bit 1 is lowest zero */ - 0, /* "194" - bit 0 is lowest zero */ 2, /* "195" - bit 2 is lowest zero */ - 0, /* "196" - bit 0 is lowest zero */ 1, /* "197" - bit 1 is lowest zero */ - 0, /* "198" - bit 0 is lowest zero */ 3, /* "199" - bit 3 is lowest zero */ - 0, /* "200" - bit 0 is lowest zero */ 1, /* "201" - bit 1 is lowest zero */ - 0, /* "202" - bit 0 is lowest zero */ 2, /* "203" - bit 2 is lowest zero */ - 0, /* "204" - bit 0 is lowest zero */ 1, /* "205" - bit 1 is lowest zero */ - 0, /* "206" - bit 0 is lowest zero */ 4, /* "207" - bit 4 is lowest zero */ - 0, /* "208" - bit 0 is lowest zero */ 1, /* "209" - bit 1 is lowest zero */ - 0, /* "210" - bit 0 is lowest zero */ 2, /* "211" - bit 2 is lowest zero */ - 0, /* "212" - bit 0 is lowest zero */ 1, /* "213" - bit 1 is lowest zero */ - 0, /* "214" - bit 0 is lowest zero */ 3, /* "215" - bit 3 is lowest zero */ - 0, /* "216" - bit 0 is lowest zero */ 1, /* "217" - bit 1 is lowest zero */ - 0, /* "218" - bit 0 is lowest zero */ 2, /* "219" - bit 2 is lowest zero */ - 0, /* "220" - bit 0 is lowest zero */ 1, /* "221" - bit 1 is lowest zero */ - 0, /* "222" - bit 0 is lowest zero */ 5, /* "223" - bit 5 is lowest zero */ - 0, /* "224" - bit 0 is lowest zero */ 1, /* "225" - bit 1 is lowest zero */ - 0, /* "226" - bit 0 is lowest zero */ 2, /* "227" - bit 2 is lowest zero */ - 0, /* "228" - bit 0 is lowest zero */ 1, /* "229" - bit 1 is lowest zero */ - 0, /* "230" - bit 0 is lowest zero */ 3, /* "231" - bit 3 is lowest zero */ - 0, /* "232" - bit 0 is lowest zero */ 1, /* "233" - bit 1 is lowest zero */ - 0, /* "234" - bit 0 is lowest zero */ 2, /* "235" - bit 2 is lowest zero */ - 0, /* "236" - bit 0 is lowest zero */ 1, /* "237" - bit 1 is lowest zero */ - 0, /* "238" - bit 0 is lowest zero */ 4, /* "239" - bit 4 is lowest zero */ - 0, /* "240" - bit 0 is lowest zero */ 1, /* "241" - bit 1 is lowest zero */ - 0, /* "242" - bit 0 is lowest zero */ 2, /* "243" - bit 2 is lowest zero */ - 0, /* "244" - bit 0 is lowest zero */ 1, /* "245" - bit 1 is lowest zero */ - 0, /* "246" - bit 0 is lowest zero */ 3, /* "247" - bit 3 is lowest zero */ - 0, /* "248" - bit 0 is lowest zero */ 1, /* "249" - bit 1 is lowest zero */ - 0, /* "250" - bit 0 is lowest zero */ 2, /* "251" - bit 2 is lowest zero */ - 0, /* "252" - bit 0 is lowest zero */ 1, /* "253" - bit 1 is lowest zero */ - 0, /* "254" - bit 0 is lowest zero */ 8 /* "255" - bit 8 is lowest zero */ -}; - -/* Table of "number of 1 bits" for each byte value */ -/* (This will need to be changed/expanded if another base type is used) */ -static const int8 bv_num_ones[256]={ - 0, /* "0" - n bits are 1's */ 1, /* "1" - n bits are 1's */ - 1, /* "2" - n bits are 1's */ 2, /* "3" - n bits are 1's */ - 1, /* "4" - n bits are 1's */ 2, /* "5" - n bits are 1's */ - 2, /* "6" - n bits are 1's */ 3, /* "7" - n bits are 1's */ - 1, /* "8" - n bits are 1's */ 2, /* "9" - n bits are 1's */ - 2, /* "10" - n bits are 1's */ 3, /* "11" - n bits are 1's */ - 2, /* "12" - n bits are 1's */ 3, /* "13" - n bits are 1's */ - 3, /* "14" - n bits are 1's */ 4, /* "15" - n bits are 1's */ - 1, /* "16" - n bits are 1's */ 2, /* "17" - n bits are 1's */ - 2, /* "18" - n bits are 1's */ 3, /* "19" - n bits are 1's */ - 2, /* "20" - n bits are 1's */ 3, /* "21" - n bits are 1's */ - 3, /* "22" - n bits are 1's */ 4, /* "23" - n bits are 1's */ - 2, /* "24" - n bits are 1's */ 3, /* "25" - n bits are 1's */ - 3, /* "26" - n bits are 1's */ 4, /* "27" - n bits are 1's */ - 3, /* "28" - n bits are 1's */ 3, /* "29" - n bits are 1's */ - 4, /* "30" - n bits are 1's */ 5, /* "31" - n bits are 1's */ - 1, /* "32" - n bits are 1's */ 2, /* "33" - n bits are 1's */ - 2, /* "34" - n bits are 1's */ 3, /* "35" - n bits are 1's */ - 2, /* "36" - n bits are 1's */ 3, /* "37" - n bits are 1's */ - 3, /* "38" - n bits are 1's */ 4, /* "39" - n bits are 1's */ - 2, /* "40" - n bits are 1's */ 3, /* "41" - n bits are 1's */ - 3, /* "42" - n bits are 1's */ 4, /* "43" - n bits are 1's */ - 3, /* "44" - n bits are 1's */ 4, /* "45" - n bits are 1's */ - 4, /* "46" - n bits are 1's */ 5, /* "47" - n bits are 1's */ - 2, /* "48" - n bits are 1's */ 3, /* "49" - n bits are 1's */ - 3, /* "50" - n bits are 1's */ 4, /* "51" - n bits are 1's */ - 3, /* "52" - n bits are 1's */ 4, /* "53" - n bits are 1's */ - 4, /* "54" - n bits are 1's */ 5, /* "55" - n bits are 1's */ - 3, /* "56" - n bits are 1's */ 4, /* "57" - n bits are 1's */ - 4, /* "58" - n bits are 1's */ 5, /* "59" - n bits are 1's */ - 4, /* "60" - n bits are 1's */ 5, /* "61" - n bits are 1's */ - 5, /* "62" - n bits are 1's */ 6, /* "63" - n bits are 1's */ - 1, /* "64" - n bits are 1's */ 2, /* "65" - n bits are 1's */ - 2, /* "66" - n bits are 1's */ 3, /* "67" - n bits are 1's */ - 2, /* "68" - n bits are 1's */ 3, /* "69" - n bits are 1's */ - 3, /* "70" - n bits are 1's */ 4, /* "71" - n bits are 1's */ - 2, /* "72" - n bits are 1's */ 3, /* "73" - n bits are 1's */ - 3, /* "74" - n bits are 1's */ 4, /* "75" - n bits are 1's */ - 3, /* "76" - n bits are 1's */ 4, /* "77" - n bits are 1's */ - 4, /* "78" - n bits are 1's */ 5, /* "79" - n bits are 1's */ - 2, /* "80" - n bits are 1's */ 3, /* "81" - n bits are 1's */ - 3, /* "82" - n bits are 1's */ 4, /* "83" - n bits are 1's */ - 3, /* "84" - n bits are 1's */ 4, /* "85" - n bits are 1's */ - 4, /* "86" - n bits are 1's */ 5, /* "87" - n bits are 1's */ - 3, /* "88" - n bits are 1's */ 4, /* "89" - n bits are 1's */ - 4, /* "90" - n bits are 1's */ 5, /* "91" - n bits are 1's */ - 4, /* "92" - n bits are 1's */ 5, /* "93" - n bits are 1's */ - 5, /* "94" - n bits are 1's */ 6, /* "95" - n bits are 1's */ - 2, /* "96" - n bits are 1's */ 3, /* "97" - n bits are 1's */ - 3, /* "98" - n bits are 1's */ 4, /* "99" - n bits are 1's */ - 3, /* "100" - n bits are 1's */ 4, /* "101" - n bits are 1's */ - 4, /* "102" - n bits are 1's */ 5, /* "103" - n bits are 1's */ - 3, /* "104" - n bits are 1's */ 4, /* "105" - n bits are 1's */ - 4, /* "106" - n bits are 1's */ 5, /* "107" - n bits are 1's */ - 3, /* "108" - n bits are 1's */ 4, /* "109" - n bits are 1's */ - 4, /* "110" - n bits are 1's */ 5, /* "111" - n bits are 1's */ - 3, /* "112" - n bits are 1's */ 4, /* "113" - n bits are 1's */ - 4, /* "114" - n bits are 1's */ 5, /* "115" - n bits are 1's */ - 4, /* "116" - n bits are 1's */ 5, /* "117" - n bits are 1's */ - 5, /* "118" - n bits are 1's */ 6, /* "119" - n bits are 1's */ - 4, /* "120" - n bits are 1's */ 5, /* "121" - n bits are 1's */ - 5, /* "122" - n bits are 1's */ 6, /* "123" - n bits are 1's */ - 5, /* "124" - n bits are 1's */ 6, /* "125" - n bits are 1's */ - 6, /* "126" - n bits are 1's */ 7, /* "127" - n bits are 1's */ - 1, /* "128" - n bits are 1's */ 2, /* "129" - n bits are 1's */ - 2, /* "130" - n bits are 1's */ 3, /* "131" - n bits are 1's */ - 2, /* "132" - n bits are 1's */ 3, /* "133" - n bits are 1's */ - 3, /* "134" - n bits are 1's */ 4, /* "135" - n bits are 1's */ - 2, /* "136" - n bits are 1's */ 3, /* "137" - n bits are 1's */ - 3, /* "138" - n bits are 1's */ 4, /* "139" - n bits are 1's */ - 3, /* "140" - n bits are 1's */ 4, /* "141" - n bits are 1's */ - 4, /* "142" - n bits are 1's */ 5, /* "143" - n bits are 1's */ - 2, /* "144" - n bits are 1's */ 3, /* "145" - n bits are 1's */ - 3, /* "146" - n bits are 1's */ 4, /* "147" - n bits are 1's */ - 3, /* "148" - n bits are 1's */ 4, /* "149" - n bits are 1's */ - 4, /* "150" - n bits are 1's */ 5, /* "151" - n bits are 1's */ - 3, /* "152" - n bits are 1's */ 4, /* "153" - n bits are 1's */ - 4, /* "154" - n bits are 1's */ 5, /* "155" - n bits are 1's */ - 4, /* "156" - n bits are 1's */ 5, /* "157" - n bits are 1's */ - 5, /* "158" - n bits are 1's */ 6, /* "159" - n bits are 1's */ - 2, /* "160" - n bits are 1's */ 3, /* "161" - n bits are 1's */ - 3, /* "162" - n bits are 1's */ 4, /* "163" - n bits are 1's */ - 3, /* "164" - n bits are 1's */ 4, /* "165" - n bits are 1's */ - 4, /* "166" - n bits are 1's */ 5, /* "167" - n bits are 1's */ - 3, /* "168" - n bits are 1's */ 4, /* "169" - n bits are 1's */ - 4, /* "170" - n bits are 1's */ 5, /* "171" - n bits are 1's */ - 4, /* "172" - n bits are 1's */ 5, /* "173" - n bits are 1's */ - 5, /* "174" - n bits are 1's */ 6, /* "175" - n bits are 1's */ - 3, /* "176" - n bits are 1's */ 4, /* "177" - n bits are 1's */ - 4, /* "178" - n bits are 1's */ 5, /* "179" - n bits are 1's */ - 4, /* "180" - n bits are 1's */ 5, /* "181" - n bits are 1's */ - 5, /* "182" - n bits are 1's */ 6, /* "183" - n bits are 1's */ - 4, /* "184" - n bits are 1's */ 5, /* "185" - n bits are 1's */ - 5, /* "186" - n bits are 1's */ 6, /* "187" - n bits are 1's */ - 5, /* "188" - n bits are 1's */ 6, /* "189" - n bits are 1's */ - 6, /* "190" - n bits are 1's */ 7, /* "191" - n bits are 1's */ - 2, /* "192" - n bits are 1's */ 3, /* "193" - n bits are 1's */ - 3, /* "194" - n bits are 1's */ 4, /* "195" - n bits are 1's */ - 3, /* "196" - n bits are 1's */ 4, /* "197" - n bits are 1's */ - 4, /* "198" - n bits are 1's */ 5, /* "199" - n bits are 1's */ - 3, /* "200" - n bits are 1's */ 4, /* "201" - n bits are 1's */ - 4, /* "202" - n bits are 1's */ 5, /* "203" - n bits are 1's */ - 4, /* "204" - n bits are 1's */ 5, /* "205" - n bits are 1's */ - 5, /* "206" - n bits are 1's */ 6, /* "207" - n bits are 1's */ - 3, /* "208" - n bits are 1's */ 4, /* "209" - n bits are 1's */ - 4, /* "210" - n bits are 1's */ 5, /* "211" - n bits are 1's */ - 4, /* "212" - n bits are 1's */ 5, /* "213" - n bits are 1's */ - 5, /* "214" - n bits are 1's */ 6, /* "215" - n bits are 1's */ - 4, /* "216" - n bits are 1's */ 5, /* "217" - n bits are 1's */ - 5, /* "218" - n bits are 1's */ 6, /* "219" - n bits are 1's */ - 5, /* "220" - n bits are 1's */ 6, /* "221" - n bits are 1's */ - 6, /* "222" - n bits are 1's */ 7, /* "223" - n bits are 1's */ - 3, /* "224" - n bits are 1's */ 4, /* "225" - n bits are 1's */ - 4, /* "226" - n bits are 1's */ 5, /* "227" - n bits are 1's */ - 4, /* "228" - n bits are 1's */ 5, /* "229" - n bits are 1's */ - 5, /* "230" - n bits are 1's */ 6, /* "231" - n bits are 1's */ - 4, /* "232" - n bits are 1's */ 5, /* "233" - n bits are 1's */ - 5, /* "234" - n bits are 1's */ 6, /* "235" - n bits are 1's */ - 5, /* "236" - n bits are 1's */ 6, /* "237" - n bits are 1's */ - 6, /* "238" - n bits are 1's */ 7, /* "239" - n bits are 1's */ - 4, /* "240" - n bits are 1's */ 5, /* "241" - n bits are 1's */ - 5, /* "242" - n bits are 1's */ 6, /* "243" - n bits are 1's */ - 5, /* "244" - n bits are 1's */ 6, /* "245" - n bits are 1's */ - 6, /* "246" - n bits are 1's */ 7, /* "247" - n bits are 1's */ - 5, /* "248" - n bits are 1's */ 6, /* "249" - n bits are 1's */ - 6, /* "250" - n bits are 1's */ 7, /* "251" - n bits are 1's */ - 6, /* "252" - n bits are 1's */ 7, /* "253" - n bits are 1's */ - 7, /* "254" - n bits are 1's */ 8 /* "255" - n bits are 1's */ -}; - -/* Useful routines for generally private use */ - -#endif /* BV_MASTER | BV_TESTER */ -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ -extern bv_ptr bv_new(int32 num_bits, uint32 flags); - -extern intn bv_delete(bv_ptr b); - -extern intn bv_set(bv_ptr b, int32 bit_num, bv_bool value); - -extern intn bv_get(bv_ptr b, int32 bit_num); - -extern intn bv_clear(bv_ptr b, bv_bool value); - -extern int32 bv_size(bv_ptr b); - -extern uint32 bv_flags(bv_ptr b); - -extern int32 bv_find(bv_ptr b, int32 last_find, bv_bool value); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -#endif /* __BITVECT_H */ - diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/cdeflate.h b/Utilities/CAI/cai_dll/inc/inc_hdf/cdeflate.h deleted file mode 100755 index 852c955258..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/cdeflate.h +++ /dev/null @@ -1,102 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - - /* $Id$ */ - - /*----------------------------------------------------------------------------- - * File: cdeflate.h - * Purpose: Header file for gzip 'deflate' encoding information. - * Dependencies: should only be included from hcompi.h - * Invokes: none - * Contents: Structures & definitions for gzip 'deflate' encoding. - * Structure definitions: - * Constant definitions: - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef __CDEFLATE_H -#define __CDEFLATE_H - -/* Get the gzip 'deflate' header */ -#define intf zintf -#include "zlib.h" -#undef zintf - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/* - ** from cdeflate.c - */ - - extern int32 HCPcdeflate_stread - (accrec_t * rec); - - extern int32 HCPcdeflate_stwrite - (accrec_t * rec); - - extern int32 HCPcdeflate_seek - (accrec_t * access_rec, int32 offset, int origin); - - extern int32 HCPcdeflate_inquire - (accrec_t * access_rec, int32 *pfile_id, uint16 *ptag, uint16 *pref, - int32 *plength, int32 *poffset, int32 *pposn, int16 *paccess, - int16 *pspecial); - - extern int32 HCPcdeflate_read - (accrec_t * access_rec, int32 length, void * data); - - extern int32 HCPcdeflate_write - (accrec_t * access_rec, int32 length, const void * data); - - extern intn HCPcdeflate_endaccess - (accrec_t * access_rec); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -/* Define the [default] size of the buffer to interact with the file. */ -#define DEFLATE_BUF_SIZE 4096 -#define DEFLATE_TMP_BUF_SIZE 16384 - -/* gzip [en|de]coding information */ -typedef struct -{ - intn deflate_level; /* how hard to try to compress this data */ - int32 offset; /* offset in the de-compressed array */ - intn acc_init; /* is access mode initialized? */ - int16 acc_mode; /* access mode desired */ - void * io_buf; /* buffer for I/O with the file */ - z_stream deflate_context; /* pointer to the deflation context for each byte in the element */ -} -comp_coder_deflate_info_t; - -#ifndef CDEFLATE_MASTER -extern funclist_t cdeflate_funcs; /* functions to perform gzip encoding */ -#else -funclist_t cdeflate_funcs = -{ /* functions to perform gzip encoding */ - HCPcdeflate_stread, - HCPcdeflate_stwrite, - HCPcdeflate_seek, - HCPcdeflate_inquire, - HCPcdeflate_read, - HCPcdeflate_write, - HCPcdeflate_endaccess -}; -#endif - -#endif /* __CDEFLATE_H */ - diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/cnbit.h b/Utilities/CAI/cai_dll/inc/inc_hdf/cnbit.h deleted file mode 100755 index 0e7118d0de..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/cnbit.h +++ /dev/null @@ -1,111 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - - /* $Id$ */ - - /*----------------------------------------------------------------------------- - * File: cnbit.h - * Purpose: Header file for N-bit encoding information. - * Dependencies: should only be included from hcompi.h - * Invokes: none - * Contents: Structures & definitions for N-bit encoding. - * Structure definitions: - * Constant definitions: - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef __CNBIT_H -#define __CNBIT_H - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/* - ** from cnbit.c - */ - - extern int32 HCPcnbit_stread - (accrec_t * rec); - - extern int32 HCPcnbit_stwrite - (accrec_t * rec); - - extern int32 HCPcnbit_seek - (accrec_t * access_rec, int32 offset, int origin); - - extern int32 HCPcnbit_inquire - (accrec_t * access_rec, int32 *pfile_id, uint16 *ptag, uint16 *pref, - int32 *plength, int32 *poffset, int32 *pposn, int16 *paccess, - int16 *pspecial); - - extern int32 HCPcnbit_read - (accrec_t * access_rec, int32 length, void * data); - - extern int32 HCPcnbit_write - (accrec_t * access_rec, int32 length, const void * data); - - extern intn HCPcnbit_endaccess - (accrec_t * access_rec); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -/* size of the N-bit buffer */ -#define NBIT_BUF_SIZE (MAX_NT_SIZE*64) -/* size of the N-bit mask buffer (same as buffer size for now) */ -#define NBIT_MASK_SIZE (MAX_NT_SIZE) - -typedef struct -{ /* structure to hold bit vector info */ - intn offset, /* offset of the bit information */ - length; /* number of bits in the information */ - uint8 mask; /* mask for this bit vector */ -} -nbit_mask_info_t; - -/* N-bit [en|de]coding information */ -typedef struct - { - int32 nt; /* number type of data we are encoding */ - intn nt_size; /* size of the number-type in the file */ - intn fill_one; /* whether to fill with 1's or not (0's) */ - intn sign_ext; /* whether to sign extend or not */ - uint8 buffer[NBIT_BUF_SIZE]; /* buffer for expanding n-bit data in */ - intn buf_pos; /* current offset in the expansion buffer */ - intn mask_off, /* offset of the bit to start masking with */ - mask_len; /* number of bits to mask */ - int32 offset; /* offset in the file in terms of bytes */ - uint8 mask_buf[NBIT_MASK_SIZE]; /* buffer to hold the bitmask */ - nbit_mask_info_t mask_info[NBIT_MASK_SIZE]; /* information about the mask */ - intn nt_pos; /* current byte to read or write */ - } -comp_coder_nbit_info_t; - -#ifndef CNBIT_MASTER -extern funclist_t cnbit_funcs; /* functions to perform N-bit encoding */ -#else -funclist_t cnbit_funcs = -{ /* functions to perform N-bit encoding */ - HCPcnbit_stread, - HCPcnbit_stwrite, - HCPcnbit_seek, - HCPcnbit_inquire, - HCPcnbit_read, - HCPcnbit_write, - HCPcnbit_endaccess -}; -#endif - -#endif /* __CNBIT_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/crle.h b/Utilities/CAI/cai_dll/inc/inc_hdf/crle.h deleted file mode 100755 index 9bb79ccf4e..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/crle.h +++ /dev/null @@ -1,113 +0,0 @@ - -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: crle.h - * Purpose: Header file for run-length encoding information. - * Dependencies: should only be included from hcompi.h - * Invokes: none - * Contents: Structures & definitions for run-length encoding. This header - * should only be included in hcomp.c and crle.c. - * Structure definitions: - * Constant definitions: - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef __CRLE_H -#define __CRLE_H - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/* - ** from crle.c - */ - - extern int32 HCPcrle_stread - (accrec_t * rec); - - extern int32 HCPcrle_stwrite - (accrec_t * rec); - - extern int32 HCPcrle_seek - (accrec_t * access_rec, int32 offset, int origin); - - extern int32 HCPcrle_inquire - (accrec_t * access_rec, int32 *pfile_id, uint16 *ptag, uint16 *pref, - int32 *plength, int32 *poffset, int32 *pposn, int16 *paccess, - int16 *pspecial); - - extern int32 HCPcrle_read - (accrec_t * access_rec, int32 length, void * data); - - extern int32 HCPcrle_write - (accrec_t * access_rec, int32 length, const void * data); - - extern intn HCPcrle_endaccess - (accrec_t * access_rec); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -/* size of the RLE buffer */ -#define RLE_BUF_SIZE 128 -/* NIL code for run bytes */ -#define RLE_NIL (-1) -/* minimum length of run */ -#define RLE_MIN_RUN 3 -/* maximum length of run */ -#define RLE_MAX_RUN (RLE_BUF_SIZE+RLE_MIN_RUN-1) -/* minimum length of mix */ -#define RLE_MIN_MIX 1 - -/* RLE [en|de]coding information */ -typedef struct -{ - int32 offset; /* offset in the file */ - uint8 buffer[RLE_BUF_SIZE]; /* buffer for storing RLE bytes */ - intn buf_length; /* number of bytes in buffer */ - intn buf_pos; /* offset into the buffer */ - uintn last_byte, /* the last byte stored in the buffer */ - second_byte; /* the second to last byte stored in the buffer */ - enum - { - RLE_INIT, /* initial state, need to read a byte to determine - next state */ - RLE_RUN, /* buffer up to the current position is a run */ - RLE_MIX - } /* buffer up to the current position is a mix */ - rle_state; /* state of the buffer storage */ -} -comp_coder_rle_info_t; - -#ifndef CRLE_MASTER -extern funclist_t crle_funcs; /* functions to perform run-length encoding */ -#else -funclist_t crle_funcs = -{ /* functions to perform run-length encoding */ - HCPcrle_stread, - HCPcrle_stwrite, - HCPcrle_seek, - HCPcrle_inquire, - HCPcrle_read, - HCPcrle_write, - HCPcrle_endaccess -}; -#endif - -#endif /* __CRLE_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/cskphuff.h b/Utilities/CAI/cai_dll/inc/inc_hdf/cskphuff.h deleted file mode 100755 index 06b6513473..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/cskphuff.h +++ /dev/null @@ -1,104 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - - /* $Id$ */ - - /*----------------------------------------------------------------------------- - * File: cskphuff.h - * Purpose: Header file for skipping huffman encoding information. - * Dependencies: should only be included from hcompi.h - * Invokes: none - * Contents: Structures & definitions for skipping huffman encoding. - * Structure definitions: - * Constant definitions: - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef __CSKPHUFF_H -#define __CSKPHUFF_H - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/* - ** from cskphuff.c - */ - - extern int32 HCPcskphuff_stread - (accrec_t * rec); - - extern int32 HCPcskphuff_stwrite - (accrec_t * rec); - - extern int32 HCPcskphuff_seek - (accrec_t * access_rec, int32 offset, int origin); - - extern int32 HCPcskphuff_inquire - (accrec_t * access_rec, int32 *pfile_id, uint16 *ptag, uint16 *pref, - int32 *plength, int32 *poffset, int32 *pposn, int16 *paccess, - int16 *pspecial); - - extern int32 HCPcskphuff_read - (accrec_t * access_rec, int32 length, void * data); - - extern int32 HCPcskphuff_write - (accrec_t * access_rec, int32 length, const void * data); - - extern intn HCPcskphuff_endaccess - (accrec_t * access_rec); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -/* The maximum source character code: */ -#define SKPHUFF_MAX_CHAR 255 - -/* One greater than the maximum source character code: */ -#define SUCCMAX (SKPHUFF_MAX_CHAR+1) - -/* Twice the maximum source character code: */ -#define TWICEMAX (2*SUCCMAX+1) - -/* The root node in the tree */ -#define ROOT 0 - -/* Skipping huffman [en|de]coding information */ -typedef struct -{ - intn skip_size; /* number of bytes in each element */ - uintn **left, /* define the left and right pointer arrays */ - **right; - uint8 **up; /* define the up pointer array */ - intn skip_pos; /* current byte to read or write */ - int32 offset; /* offset in the de-compressed array */ -} -comp_coder_skphuff_info_t; - -#ifndef CSKPHUFF_MASTER -extern funclist_t cskphuff_funcs; /* functions to perform skipping huffman encoding */ -#else -funclist_t cskphuff_funcs = -{ /* functions to perform skipping huffman encoding */ - HCPcskphuff_stread, - HCPcskphuff_stwrite, - HCPcskphuff_seek, - HCPcskphuff_inquire, - HCPcskphuff_read, - HCPcskphuff_write, - HCPcskphuff_endaccess -}; -#endif - -#endif /* __CSKPHUFF_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/df.h b/Utilities/CAI/cai_dll/inc/inc_hdf/df.h deleted file mode 100755 index fc153ae882..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/df.h +++ /dev/null @@ -1,212 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: df.h - * Purpose: header file for HDF routines - * Invokes: dfi.h - * Contents: - * Structure definitions: DFddh, DFdd, DFdesc, DFdle, DF, DFdi, DFdata - * Procedure type definitions - * Global variables - * Tag definitions - * Error return codes - * Logical constants - * Remarks: This file is included with user programs - * Since it includes stdio.h etc., do not include these after df.h - *---------------------------------------------------------------------------*/ - -#ifndef DF_H /* avoid re-inclusion */ -#define DF_H - -/* include DF (internal) header information */ -#include "hdf.h" - -/*-------------------------------------------------------------------------*/ -/* Type declarations */ - -typedef struct DFddh - { /*format of data descriptor headers in file */ - int16 dds; /* number of dds in header block */ - int32 next; /* offset of next header block */ - } -DFddh; - -typedef struct DFdd - { /* format of data descriptors as in file */ - uint16 tag; /* data tag */ - uint16 ref; /* data reference number */ - int32 offset; /* offset of data element in file */ - int32 length; /* number of bytes */ - } -DFdd; - -/* descriptor structure is same as dd structure. ###Note: may be changed */ -typedef DFdd DFdesc; - -/* DLE is the internal structure which stores data descriptor information */ -/* It is a linked list of DDs */ -typedef struct DFdle - { /* Data List element */ - struct DFdle *next; /* link to next dle */ - DFddh ddh; /* To store headers */ - DFdd dd[1]; /* dummy size */ - } -DFdle; - -/* DF is the internal structure associated with each DF file */ -/* It holds information associated with the file as a whole */ -/* ### Note: there are hooks for having multiple DF files open at a time */ -typedef struct DF - { - DFdle *list; /* Pointer to the DLE list */ - DFdle *last_dle; /* last_dle and last_dd are used in searches */ - /* to indicate element returned */ - /* by previous call to DFfind */ - DFdd *up_dd; /* DD of element being read/updated, */ - /* used by DFstart */ - uint16 last_tag; /* Last tag searched for by DFfind */ - uint16 last_ref; /* Last reference number searched for */ - intn type; /* 0= not in use, 1= normal, -1 = multiple */ - /* this is a hook for when */ - /* multiple files are open */ - intn access; /* permitted access types: */ - /* 0=none, 1=r, 2=w, 3=r/w */ - intn changed; /* True if anything in DDs modified */ - /* since last write */ - intn last_dd; /* see last_dle */ - intn defdds; /* default numer of DD's in each block */ - intn up_access; /* access permissions to element being */ - /* read/updated. Used by DFstart */ - /* File handle is a file pointer or file descriptor depending on whether */ - /* we use buffered or unbuffered I/O. But, since this structure is a */ - /* fake, it doesn't matter whether I/O is buffered or not. */ - intn file; /* file descriptor */ - } -DF; - -typedef struct DFdata - { /* structure for returning status information */ - int32 version; /* version number of program */ - } -DFdata; - -/*--------------------------------------------------------------------------*/ -/* Procedure types */ - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/* prototypes for dfstubs.c */ - extern DF *DFopen - (char *name, int acc_mode, int ndds); - - extern int DFclose - (DF * dfile); - - extern int DFdescriptors - (DF * dfile, DFdesc ptr[], int begin, int num); - - extern int DFnumber - (DF * dfile, uint16 tag); - - extern int DFsetfind - (DF * dfile, uint16 tag, uint16 ref); - - extern int DFfind - (DF * dfile, DFdesc * ptr); - - extern int DFaccess - (DF * dfile, uint16 tag, uint16 ref, char *acc_mode); - - extern int DFstart - (DF * dfile, uint16 tag, uint16 ref, char *acc_mode); - - extern int32 DFread - (DF * dfile, char *ptr, int32 len); - - extern int32 DFseek - (DF * dfile, int32 offset); - - extern int32 DFwrite - (DF * dfile, char *ptr, int32 len); - - extern int DFupdate - (DF * dfile); - - extern int DFstat - (DF * dfile, DFdata * dfinfo); - - extern int32 DFgetelement - (DF * dfile, uint16 tag, uint16 ref, char *ptr); - - extern int32 DFputelement - (DF * dfile, uint16 tag, uint16 ref, char *ptr, int32 len); - - extern int DFdup - (DF * dfile, uint16 itag, uint16 iref, uint16 otag, uint16 oref); - - extern int DFdel - (DF * dfile, uint16 tag, uint16 ref); - - extern uint16 DFnewref - (DF * dfile); - - extern int DFishdf - (char *filename); - - extern int DFerrno - (void); - - extern int DFIerr - (DF * dfile); - - extern int DFImemcopy - (char *from, char *to, int length); - - extern void *DFIgetspace - (uint32 qty); - - extern void *DFIfreespace - (void *ptr); - - extern int DFIc2fstr - (char *str, int len); - - extern char *DFIf2cstring - (_fcd fdesc, intn len); - -/* prototypes for dfconv.c */ - extern int DFconvert - (uint8 *source, uint8 *dest, int ntype, int sourcetype, int desttype, int32 size); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -/*--------------------------------------------------------------------------*/ -/* Global Variables */ - -#ifndef DFMASTER -extern -#endif /*DFMASTER */ -int DFerror; /* Error code for DF routines */ - -#define DFSETERR(error) (DFerror=(DFerror?DFerror:error)) - -#define DFTOFID(df) (int32)(df->list) - -#endif /* DF_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/dfan.h b/Utilities/CAI/cai_dll/inc/inc_hdf/dfan.h deleted file mode 100755 index 8709a7490e..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/dfan.h +++ /dev/null @@ -1,65 +0,0 @@ - -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*------------------------------------------------------------------------------ - * File: dfan.h - * Purpose: header file for the Annotations set - * Invokes: df.h - * Contents: - * Structure definitions: DFANdirentry, DFANdirhead - * Constant definitions: DFAN_LABEL, DFAN_DESC - * Remarks: none - *----------------------------------------------------------------------------*/ - -#ifndef DFAN_H /* avoid re-inclusion */ -#define DFAN_H - -#include "hdf.h" - -#define DFAN_LABEL 0 -#define DFAN_DESC 1 - -#define DFAN_LAB_BLKSIZE 64 /* default blksize to use for labels */ -#define DFAN_DESC_BLKSIZE 512 /* default blksize to use for descriptions */ - -#define DFAN_DEFENTRIES 16 /* no of dir entries to add at a time */ - -/* - * This structure stores an entry in the label/desc directory - * for a label/desc in the file, it gives the ref of the label/desc, - * and the tag/ref of the data item to which the label/desc relates - */ -typedef struct - { - uint16 annref; /* ref of annotation */ - uint16 datatag; /* tag of data */ - uint16 dataref; /* ref of data */ - } -DFANdirentry; - -/* - * This structure is a head node for the directory, which is organized as - * as a linked list of arrays. DFANdirentry is the structure of an - * array element, while DFANdirhead is the list element - */ -typedef struct DFANdirhead - { - struct DFANdirhead *next; /* list element */ - int32 nentries; /* Numer of entries */ - DFANdirentry *entries; /* actually an arbitrary size array */ - } -DFANdirhead; - -#endif /* DFAN_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/dfgr.h b/Utilities/CAI/cai_dll/inc/inc_hdf/dfgr.h deleted file mode 100755 index 46dcf2ca08..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/dfgr.h +++ /dev/null @@ -1,73 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: dfgr.h - * Purpose: header file for the Raster Image set - * Invokes: df.h - * Contents: - * Structure definitions: DFGRdr, DFGRrig - * Remarks: This is included with user programs which use general raster - *---------------------------------------------------------------------------*/ - -#ifndef DFGR_H /* avoid re-inclusion */ -#define DFGR_H - -/* description record: used to describe image data, palette data etc. */ -typedef struct - { - intn ncomponents; /* number of components */ - intn interlace; /* data ordering: chunky / planar etc */ - int32 xdim; /* X- dimension of data */ - int32 ydim; /* Y- dimensionsof data */ - DFdi nt; /* number type of data */ - DFdi compr; /* compression */ - /* ### Note: compression is currently uniquely described with a tag. - No data is attached to this tag/ref. But this capability is - provided for future expansion, when this tag/ref might point to - some data needed for decompression, such as the actual encodings */ - } -DFGRdr; - -/* structure to hold RIG info */ -typedef struct - { - char *cf; /* color format */ - int32 xpos; /* X position of image on screen */ - int32 ypos; /* Y position of image on screen */ - float32 aspectratio; /* ratio of pixel height to width */ - float32 ccngamma; /* gamma color correction parameter */ - float32 ccnred[3]; /* red color correction parameter */ - float32 ccngrren[3]; /* green color correction parameter */ - float32 ccnblue[3]; /* blue color correction parameter */ - float32 ccnwhite[3]; /* white color correction parameter */ - DFdi data[3]; /* image/lut/mattechannel */ - DFGRdr datadesc[3]; /* description of image/lut/mattechannel */ - } -DFGRrig; - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/* Library-developer functions */ - extern int32 DFGRIopen - (const char *filename, int acc_mode); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -#endif /* DFGR_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/dfi.h b/Utilities/CAI/cai_dll/inc/inc_hdf/dfi.h deleted file mode 100755 index ee3cf04bd0..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/dfi.h +++ /dev/null @@ -1,220 +0,0 @@ - -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: dfi.h - * Purpose: HDF internal header file - * Invokes: stdio.h, sys/file.h - * Contents: - * Compilation parameters - * Machine-dependent definitions - * Flexibility definitions: i/o buffering, dynamic memory, structure i/o - * Size parameters - * Remarks: To port to a new system, only dfi.h and Makefile need be modified. - * This file is included with user programs, but users do not see it. - *---------------------------------------------------------------------------*/ - -#ifndef DFI_H -#define DFI_H - -/*--------------------------------------------------------------------------*/ -/* Compilation Parameters for Flexibility and Portability */ - -/* modify this line for buffered/unbuffered i/o */ -#define DF_BUFFIO - -/* modify this line for dynamic/static memory allocation */ -#define DF_DYNAMIC - -/* modify this line if structures cannot be read/written as is */ -#undef DF_STRUCTOK /* leave it this way - hdfsh expects it */ - -/*--------------------------------------------------------------------------*/ -/* Machine dependencies */ -/*--------------------------------------------------------------------------*/ - -#ifdef IRIX -#undef DF_STRUCTOK -#include <sys/types.h> -#include <sys/file.h> /* for unbuffered i/o stuff */ -#ifndef DFmovmem -#define DFmovmem(from, to, len) bcopy(from, to, len) -#endif /* DFmovmem */ -#ifndef DF_STRUCTOK -#define UINT16READ(p, x) { x = ((*p++) & 255)<<8; x |= (*p++) & 255; } -#define INT16READ(p, x) { x = (*p++)<<8; x |= (*p++) & 255; } -#define INT32READ(p, x) { x = (*p++)<<24; x|=((*p++) & 255)<<16; \ - x|=((*p++) & 255)<<8; x|=(*p++) & 255; } -#define UINT16WRITE(p, x) { *p++ = (x>>8) & 255; *p++ = x & 255; } -#define INT16WRITE(p, x) { *p++ = (x>>8) & 255; *p++ = x & 255; } -#define INT32WRITE(p, x) { *p++ = (x>>24) & 255; *p++ = (x>>16) & 255; \ - *p++ = (x>>8) & 255; *p++ = x & 255; } -#endif /*DF_STRUCTOK */ -#define DF_CREAT(name, prot) creat(name, prot) -#ifndef DF_MT -#define DF_MT DFMT_IRIX -#endif /* DF_MT */ -#endif /*IRIX */ - -#ifdef IBM6000 /* NOTE: IBM6000 defines are same as for SUN */ -#if ! defined mc68010 && ! defined mc68020 && ! defined mc68030 -#undef DF_STRUCTOK -#endif -#include <sys/file.h> /* for unbuffered i/o stuff */ -#define DFmovmem(from, to, len) memcpy(to, from, len) -#ifndef DF_STRUCTOK -#define UINT16READ(p, x) { x = ((*p++) & 255)<<8; x |= (*p++) & 255; } -#define INT16READ(p, x) { x = (*p++)<<8; x |= (*p++) & 255; } -#define INT32READ(p, x) { x = (*p++)<<24; x|=((*p++) & 255)<<16; \ - x|=((*p++) & 255)<<8; x|=(*p++) & 255; } -#define UINT16WRITE(p, x) { *p++ = (x>>8) & 255; *p++ = x & 255; } -#define INT16WRITE(p, x) { *p++ = (x>>8) & 255; *p++ = x & 255; } -#define INT32WRITE(p, x) { *p++ = (x>>24) & 255; *p++ = (x>>16) & 255; \ - *p++ = (x>>8) & 255; *p++ = x & 255; } -#endif /*DF_STRUCTOK */ -#define DF_CREAT(name, prot) creat(name, prot) -#define DF_MT DFMT_IBM6000 -#endif /*IBM6000 */ - -#if defined (MAC) || defined (macintosh) || defined (SYMANTEC_C) -#undef DF_BUFFIO /* use unbuffered i/o */ -#include <memory.h> /* malloc stuff for MPW 3.0 */ -#include <fcntl.h> /* unbuffered IO stuff for MPW 3.0 */ -#ifdef SYMANTEC_C /* for LightSpeed C */ -#include <unix.h> -#else /*SYMANTEC_C MPW, possibly others */ -#include <Files.h> /* for unbuffered i/o stuff */ -#endif /*SYMANTEC_C */ -#define DF_CAPFNAMES /* fortran names are in all caps */ -#define DF_DYNAMIC /* use dynamic allocation */ -#ifdef SYMANTEC_C /* LightSpeed C does not have memcpy */ -#define DFmovmem(from, to, len) DFImemcopy(from, to, len) -#else /*SYMANTEC_C */ -#define DFmovmem(from, to, len) memcpy(to, from, len) -#endif /*SYMANTEC_C */ -#define malloc(x) NewPtr((Size) (x)) /* don't use malloc on the Mac */ -#define free(x) DisposPtr((Ptr) (x)) /* don't use free on the Nac */ -#undef DF_STRUCTOK -#define UINT16READ(p, x) { x = ((*p++) & 255)<<8; x |= (*p++) & 255; } -#define INT16READ(p, x) { x = (*p++)<<8; x |= (*p++) & 255; } -#define INT32READ(p, x) { x = (*p++)<<24; x|=((*p++) & 255)<<16; \ - x|=((*p++) & 255)<<8; x|=(*p++) & 255; } -#define UINT16WRITE(p, x) { *p++ = (x>>8) & 255; *p++ = x & 255; } -#define INT16WRITE(p, x) { *p++ = (x>>8) & 255; *p++ = x & 255; } -#define INT32WRITE(p, x) { *p++ = (x>>24) & 255; *p++ = (x>>16) & 255; \ - *p++ = (x>>8) & 255; *p++ = x & 255; } -#define DF_CREAT(name, prot) mopen(name, O_WRONLY|O_TRUNC|O_CREAT) -#define DF_MT DFMT_MAC -#endif /*MAC */ - -#ifdef VMS -/*#undef DF_BUFFIO should be buff !!!! */ - /* use only unbuff i/o - buff doesn't work! */ -#ifndef DFopen /* avoid double includes */ -/* #include "dfivms.h" */ -#endif /*DFopen */ -#undef DF_STRUCTOK -#define DF_CAPFNAMES /* fortran names are in all caps */ -#include <file.h> /* for unbuffered i/o stuff */ -#define DFmovmem(from, to, len) memcpy(to, from, len) -#ifndef DF_STRUCTOK -#define UINT16READ(p, x) { x = ((*p++) & 255)<<8; x |= (*p++) & 255; } -#define INT16READ(p, x) { x = (*p++)<<8; x |= (*p++) & 255; } -#define INT32READ(p, x) { x = (*p++)<<24; x|=((*p++) & 255)<<16; \ - x|=((*p++) & 255)<<8; x|=(*p++) & 255; } -#define UINT16WRITE(p, x) { *p++ = (x>>8) & 255; *p++ = x & 255; } -#define INT16WRITE(p, x) { *p++ = (x>>8) & 255; *p++ = x & 255; } -#define INT32WRITE(p, x) { *p++ = (x>>24) & 255; *p++ = (x>>16) & 255; \ - *p++ = (x>>8) & 255; *p++ = x & 255; } -#endif /*DF_STRUCTOK */ -#define DF_CREAT(name, prot) creat(name, prot) -#define DF_MT DFMT_VAX -#endif /*VMS */ - -#ifdef APOLLO -#if ! defined mc68010 && ! defined mc68020 && ! defined mc68030 -#undef DF_STRUCTOK -#endif -#include <sys/file.h> /* for unbuffered i/o stuff */ -#define int8 char -#define uint8 unsigned char -#define int16 short int -#define uint16 unsigned short int -#define int32 long int -#define uint32 unsigned long int -#define float32 float -#define DFmovmem(from, to, len) memcpy(to, from, len) -#ifndef DF_STRUCTOK -#define UINT16READ(p, x) { x = ((*p++) & 255)<<8; x |= (*p++) & 255; } -#define INT16READ(p, x) { x = (*p++)<<8; x |= (*p++) & 255; } -#define INT32READ(p, x) { x = (*p++)<<24; x|=((*p++) & 255)<<16; \ - x|=((*p++) & 255)<<8; x|=(*p++) & 255; } -#define UINT16WRITE(p, x) { *p++ = (x>>8) & 255; *p++ = x & 255; } -#define INT16WRITE(p, x) { *p++ = (x>>8) & 255; *p++ = x & 255; } -#define INT32WRITE(p, x) { *p++ = (x>>24) & 255; *p++ = (x>>16) & 255; \ - *p++ = (x>>8) & 255; *p++ = x & 255; } -#endif /*DF_STRUCTOK */ -#define DF_CREAT(name, prot) creat(name, prot) -#define DF_MT DFMT_APOLLO -#endif /*APOLLO */ - -/*--------------------------------------------------------------------------*/ -/* Flexibility parameters */ -#if defined (MAC) || defined (macintosh) || defined (SYMANTEC_C) /* MAC specific file manager calls */ -# define DF_OPEN(x,y) mopen(x,y) -# define DF_CLOSE(x) mclose(x) -# define DF_SEEK(x,y,z) mlseek(x,y,z) -# define DF_SKEND(x,y,z) mlseek(x,-1*y,z) -# define DF_TELL(x) mlseek(x,0L,1) -# define DF_READ(a,b,c,d) mread(d,a,b*c) -# define DF_WRITE(a,b,c,d) mwrite(d,a,b*c) -# define DF_FLUSH(a) /* no need to flush */ -# define DF_RDACCESS 0 /* dummy */ -# define DF_WRACCESS 0 /* dummy */ -# define DF_OPENERR(f) ((f) == -1) -#else /* !MAC */ -#ifdef DF_BUFFIO /* set all calls to do buffered I/O */ -#define DF_OPEN(x,y) fopen(x,y) -#define DF_CLOSE(x) fclose(x) -#define DF_SEEK(x,y,z) fseek(x,y,z) -#define DF_SKEND(x,y,z) fseek(x,y,z) -#define DF_TELL(x) ftell(x) -#define DF_READ(a,b,c,d) fread(a,b,c,d) -#define DF_WRITE(a,b,c,d) fwrite(a,b,c,d) -#define DF_FLUSH(a) fflush(a) -#define DF_OPENERR(f) (!(f)) -#define DF_RDACCESS "rb" -#define DF_WRACCESS "rb+" - -#else /*DF_BUFFIO unbuffered i/o */ -#define DF_OPEN(x,y) open(x,y) -#define DF_CLOSE(x) close(x) -#define DF_SEEK(x,y,z) lseek(x,y,z) -#define DF_SKEND(x,y,z) lseek(x,-1*y,z) -#define DF_TELL(x) lseek(x,0L,1) -#define DF_READ(a,b,c,d) read(d,a,b*c) -#define DF_WRITE(a,b,c,d) write(d,a,b*c) -#define DF_OPENERR(f) ((f) == -1) -#define DF_FLUSH(a) /* no need to flush */ -#define DF_RDACCESS O_RDONLY -#define DF_WRACCESS O_RDWR -#endif /* DF_BUFFIO */ -#endif /* !MAC */ - -#ifndef FILE -#include <stdio.h> -#endif /*FILE */ - -#endif /* DFI_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/dfrig.h b/Utilities/CAI/cai_dll/inc/inc_hdf/dfrig.h deleted file mode 100755 index 1070d851f7..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/dfrig.h +++ /dev/null @@ -1,73 +0,0 @@ - -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: dfrig.h - * Purpose: header file for the Raster Image set - * Invokes: df.h - * Contents: - * Structure definitions: DFRdr, DFRrig - * Remarks: This is included with user programs which use RIG - *---------------------------------------------------------------------------*/ - -#ifndef DFRIG /* avoid re-inclusion */ -#define DFRIG - -/* description record: used to describe image data, palette data etc. */ -typedef struct - { - int16 ncomponents; /* Number of components */ - int16 interlace; /* data ordering: chunky / planar etc */ - int32 xdim; /* X-dimension of data */ - int32 ydim; /* Y-dimensionsof data */ - DFdi nt; /* number type of data */ - DFdi compr; /* compression */ - /* ### Note: compression is currently uniquely described with a tag. - No data is attached to this tag/ref. But this capability is - provided for future expansion, when this tag/ref might point to - some data needed for decompression, such as the actual encodings */ - } -DFRdr; - -/* structure to hold RIG info */ -typedef struct - { - char *cf; /* color format */ - int32 xpos; /* X position of image on screen */ - int32 ypos; /* Y position of image on screen */ - float32 aspectratio; /* ratio of pixel height to width */ - float32 ccngamma; /* gamma color correction parameters */ - float32 ccnred[3]; /* red color correction parameters */ - float32 ccngrren[3]; /* green color correction parameters */ - float32 ccnblue[3]; /* blue color correction parameters */ - float32 ccnwhite[3]; /* white color correction parameters */ - DFdi image; /* image */ - DFRdr descimage; /* image data description */ - DFdi lut; /* color look-up table (palette) */ - DFRdr desclut; /* look-up table description */ - DFdi mattechannel; /* matte? */ - DFRdr descmattechannel; /* Description of matte? */ - } -DFRrig; - -/* dimensions of raster-8 image */ -typedef struct R8dim - { - uint16 xd; - uint16 yd; - } -R8dim; - -#endif /*DFRIG */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/dfsd.h b/Utilities/CAI/cai_dll/inc/inc_hdf/dfsd.h deleted file mode 100755 index 0e0cc7231a..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/dfsd.h +++ /dev/null @@ -1,136 +0,0 @@ - -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: dfsd.h - * Purpose: header file for the Scientific Data set - * Invokes: dfrig.h - * Contents: - * Structure definitions: DFSsdg - * Constant definitions: DFS_MAXLEN - * Remarks: This is included with user programs which use SDG - * Currently defined to be 2-D. Will later be increased to - * multiple dimensions - *---------------------------------------------------------------------------*/ - -#ifndef _DFSD_H /* avoid re-inclusion */ -#define _DFSD_H - -#include "hdf.h" - -/* include numbertype and aid for 3.2 S. Xu */ -/* structure to hold SDG info */ -typedef struct DFSsdg - { - DFdi data; /* tag/ref of data in file */ - intn rank; /* number of dimensions */ - int32 *dimsizes; /* dimensions of data */ - char *coordsys; - char *dataluf[3]; /* label/unit/format of data */ - char **dimluf[3]; /* label/unit/format for each dim */ - uint8 **dimscales; /* scales for each dimension */ - uint8 max_min[16]; /* max, min values of data, */ - /* currently atmost 8 bytes each */ - int32 numbertype; /* default is float32 */ - uint8 filenumsubclass; /* number format in the file, default is IEEE */ - int32 aid; /* access id */ - int32 compression; /* 0 -- not compressed */ - int32 isndg; /* 0 -- pure sdg, written by 3.1 else ndg */ - float64 cal, cal_err; /* calibration multiplier stuff */ - float64 ioff, ioff_err; /* calibration offset stuff */ - int32 cal_type; /* number type of data after calibration */ - uint8 fill_value[DFSD_MAXFILL_LEN]; /* fill value if any specified */ - intn fill_fixed; /* whether ther fill value is a fixed value, or it can change */ - } -DFSsdg; - -/* DFnsdgle is the internal structure which stores SDG or NDS and */ -/* related SDG in an HDF file. */ -/* It is a linked list. */ - -typedef struct DFnsdgle - { - DFdi nsdg; /* NDG from 3.2 or SDG from 3.1 */ - DFdi sdg; /* Only special NDF has values in this field */ - struct DFnsdgle *next; - } -DFnsdgle; - -typedef struct DFnsdg_t_hdr - { - uint32 size; - DFnsdgle *nsdg_t; - } -DFnsdg_t_hdr; - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - - extern int32 DFSDIopen - (const char * filename, int acc_mode); - - extern int DFSDIsdginfo - (int32 file_id); - - extern int DFSDIclear - (DFSsdg * sdg); - - extern int DFSDIclearNT - (DFSsdg * sdg); - - extern int DFSDIgetdata - (const char * filename, intn rank, int32 maxsizes[], VOIDP data, - int isfortran); - - extern int DFSDIputdata - (const char * filename, intn rank, int32 * dimsizes, VOIDP data, - int accmode, int isfortran); - - extern int DFSDIgetslice - (const char * filename, int32 winst[], int32 windims[], VOIDP data, - int32 dims[], int isfortran); - - extern int DFSDIputslice - (int32 windims[], VOIDP data, int32 dims[], int isfortran); - - extern int DFSDIendslice - (int isfortran); - - extern intn DFSDIrefresh - (char * filename); - - extern int DFSDIisndg - (intn * isndg); - - extern int DFSDIgetrrank - (intn * rank); - - extern int DFSDIgetwrank - (intn * rank); - - extern int DFSDIsetdimstrs - (int dim, const char * label, const char * unit, const char * format); - - extern int DFSDIsetdatastrs - (const char * label, const char * unit, const char * format, - const char * coordsys); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -#endif /* _DFSD_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/dfstubs.h b/Utilities/CAI/cai_dll/inc/inc_hdf/dfstubs.h deleted file mode 100755 index 2cd1931ea0..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/dfstubs.h +++ /dev/null @@ -1,75 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/* - ** FILE - ** dfstubs.h - ** PURPOSE - ** Header file for "dfstubs.c" HDF 3.1 emulation using new routines - ** from "hfile.c". - ** AUTHOR - ** Doug Ilg - */ - -#ifndef DFSTUBS_H /* avoid re-inclusion */ -#define DFSTUBS_H -/* This is the master HDF driver (taking the place of df.c), so... */ -#define DFMASTER -#undef PERM_OUT /* used to "comment out" code */ - -#include "df.h" -#undef DFMASTER - -#if !defined(__GNUC__) & !defined(CONVEX) & !defined(VMS) -#include <memory.h> -#endif /* !__GNUC__ & !CONVEX & !VMS */ - -#define DFACC_APPEND 8 -#define DFEL_ABSENT 0 -#define DFEL_RESIDENT 1 -#define DFSRCH_OLD 0 -#define DFSRCH_NEW 1 - -PRIVATE int32 DFid = 0; -PRIVATE int32 DFaid = 0; -PRIVATE int DFaccmode = 0; -PRIVATE int DFelaccmode = 0; -PRIVATE uint16 search_tag = 0; -PRIVATE uint16 search_ref = 0; -PRIVATE int search_stat = DFSRCH_NEW; -PRIVATE int32 search_aid = 0; -PRIVATE int DFelstat = DFEL_ABSENT; -PRIVATE int32 DFelsize = 0; -PRIVATE int32 DFelseekpos = 0; -PRIVATE uint16 acc_tag = 0; -PRIVATE uint16 acc_ref = 0; -PRIVATE char *DFelement = NULL; - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/* prototypes for internal routines */ - PRIVATE int DFIclearacc - (void); - - PRIVATE int DFIcheck - (DF * dfile); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -#endif /* DFSTUBS_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/dfufp2i.h b/Utilities/CAI/cai_dll/inc/inc_hdf/dfufp2i.h deleted file mode 100755 index 09fe5656a2..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/dfufp2i.h +++ /dev/null @@ -1,85 +0,0 @@ - -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -#ifndef DFUFP2IM_H /* avoid re-inclusion */ -#define DFUFP2IM_H - -/* Input structure */ -typedef struct - { - int32 hdim; /* horizontal dimension of input data */ - int32 vdim; /* vertical dimension of input data */ - intn is_pal; /* flag to tell whether there is a palette */ - intn is_vscale; /* flag telling whether vertical scale included */ - intn is_hscale; /* flag telling whether horizonatal scale included */ - intn ct_method; /* color transform method: EXPAND or INTERP */ - float32 max; /* max value of data */ - float32 min; /* min value of the data */ - float32 *hscale; /* horizontal scale */ - float32 *vscale; /* vertical scale */ - float32 *data; /* floating point data */ - } -Input; - -/* Output structure */ -typedef struct - { - int32 hres; /* horizontal resolution of image */ - int32 vres; /* vertical resolution of image */ - intn compress; /* compression scheme */ - char outfile[32]; /* output file name */ - uint8 *image; /* Image */ - uint8 *palette; /* Palette */ - } -Output; - -/*----------------------------------------------------------------------------*/ -/* Function Prototypes */ - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/* prototypes for dfufp2im.c */ - -#ifdef OLD_WAY - extern int duif2i_(int32 *hdim, int32 *vdim, float32 *max, float32 *min, - float32 hscale[], float32 vscale[], float32 data[], - _fcd palette, _fcd outfile, int *ct_method, int32 *hres, - int32 *vres, int *compress, int *lenfn); - extern int DFUfptoimage(int32 hdim, int32 vdim, float32 max, float32 min, - float32 *hscale, float32 *vscale, float32 *data, - uint8 *palette, char *outfile, int ct_method, - int32 hres, int32 vres, int compress); -#endif - extern int process - (Input * in, Output * out); - extern int generate_scale - (int32 dim, float32 *scale); - extern int convert_interp - (Input * in, Output * out); - extern int pixrep_scaled - (Input * in, Output * out); - extern int compute_offsets - (float32 *scale, int32 dim, int32 *offsets, int32 res); - extern int pixrep_simple - (Input * in, Output * out); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -#endif /* DFUFP2IM_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/dynarray.h b/Utilities/CAI/cai_dll/inc/inc_hdf/dynarray.h deleted file mode 100755 index 30f407e0a1..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/dynarray.h +++ /dev/null @@ -1,156 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: dynarray.h - * Purpose: header file for dynamic array API - * Dependencies: - * Invokes: - * Contents: - * Structure definitions: - * Constant definitions: - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef __DYNARRAY_H -#define __DYNARRAY_H - -#include "hdf.h" - -/* - Define the pointer to the dynarray without giving outside routines access - to the internal workings of the structure. -*/ -typedef struct dynarray_tag *dynarr_p; - -#if defined DYNARRAY_MASTER | defined DYNARRAY_TESTER -typedef struct dynarray_tag - { - intn num_elems; /* Number of elements in the array currently */ - intn incr_mult; /* Multiple to increment the array size by */ - VOIDP *arr; /* Pointer to the actual array of void *'s */ - }dynarr_t; - -#endif /* DYNARRAY_MASTER | DYNARRAY_TESTER */ - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/****************************************************************************** - NAME - DAcreate_array - Create a dynarray - - DESCRIPTION - Create a dynarray for later use. This routine allocates the dynarray - structure and creates a dynarray with the specified minimum size. - - RETURNS - Returns pointer to the dynarray created if successful and NULL otherwise - -*******************************************************************************/ -dynarr_p DAcreate_array(intn start_size, /* IN: Initial array size */ - intn incr_mult /* IN: multiple to create additional elements in */ -); - -/****************************************************************************** - NAME - DAdestroy_array - Destroy a dynarray - - DESCRIPTION - Destroy an existing dynarray from use. This routine de-allocates the - dynarray structure and deletes the current dynarray. - - RETURNS - Returns SUCCEED if successful and FAIL otherwise - -*******************************************************************************/ -intn DAdestroy_array(dynarr_p arr, /* IN: Array to destroy */ - intn free_elem /* IN: whether to free each element */ -); - -/****************************************************************************** - NAME - DAdestroy_array - Get the current size of a dynarray - - DESCRIPTION - Get the number of elements in use currently. - - RETURNS - Returns # of dynarray elements if successful and FAIL otherwise - -*******************************************************************************/ -intn DAsize_array(dynarr_p arr /* IN: Array to get size of */ -); - -/****************************************************************************** - NAME - DAget_elem - Get an element from a dynarray - - DESCRIPTION - Retrieve an element from a dynarray. If the element to be retrieved is - beyond the end of the currently allocated array elements, the array is - not extended, a NULL pointer is merely returned. - - RETURNS - Returns object ptr if successful and NULL otherwise - -*******************************************************************************/ -VOIDP DAget_elem(dynarr_p arr_ptr, /* IN: Array to access */ - intn elem /* IN: Array element to retrieve */ -); - -/****************************************************************************** - NAME - DAset_elem - Set an element pointer for a dynarray - - DESCRIPTION - Set an element pointer for a dynarray. If the element to be set is - beyond the end of the currently allocated array elements, the array is - extended by whatever multiple of the incr_mult is needed to expand the - # of array elements to include the array element to set. - - RETURNS - Returns SUCCEED if successful and NULL otherwise - -*******************************************************************************/ -intn DAset_elem(dynarr_p arr_ptr, /* IN: Array to access */ - intn elem, /* IN: Array element to set */ - VOIDP obj /* IN: Pointer to the object to store */ -); - -/***************************************************************************** - NAME - DAdel_elem - Delete an element from a dynarray - - DESCRIPTION - Retrieve an element from a dynarray & delete it from the dynarray. If the - element to be retrieved is beyond the end of the currently allocated array - elements, the array is not extended, a NULL pointer is merely returned. - - RETURNS - Returns object ptr if successful and NULL otherwise - -*******************************************************************************/ -VOIDP DAdel_elem(dynarr_p arr_ptr, /* IN: Array to access */ - intn elem /* IN: Array element to retrieve */ -); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -#endif /* __DYNARRAY_H */ - diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/hbitio.h b/Utilities/CAI/cai_dll/inc/inc_hdf/hbitio.h deleted file mode 100755 index 9ad8defdbc..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/hbitio.h +++ /dev/null @@ -1,85 +0,0 @@ - -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/* - ** hbitio.h - ** - ** Data structures and macros for bitfile access to HDF data objects. - ** These are mainly used for compression I/O and N-bit data objects. - */ - -#ifndef __HBITIO_H -#define __HBITIO_H - -/* Define the number of elements in the buffered array */ -#define BITBUF_SIZE 4096 -/* Macro to define the number of bits cached in the 'bits' variable */ -#define BITNUM (sizeof(uint8)*8) -/* Macro to define the number of bits able to be read/written at a time */ -#define DATANUM (sizeof(uint32)*8) - -typedef struct bitrec_t - { - int32 acc_id; /* Access ID for H layer I/O routines */ - int32 bit_id; /* Bitfile ID for internal use */ - /* Note that since HDF has signed 32bit offset limit we need to change this to signed - since the get passed to Hxxx calls which take signed 32bit arguments */ - int32 block_offset, /* offset of the current buffered block in the dataset */ - max_offset, /* offset of the last byte written to the dataset */ - byte_offset; /* offset of the current byte in the dataset */ - - intn count, /* bit count to next boundary */ - buf_read; /* number of bytes read into buffer (necessary for random I/O) */ - uint8 access; /* What the access on this file is ('r', 'w', etc..) */ - uint8 mode; /* how are we interacting with the data now ('r', 'w', etc) */ - uint8 bits; /* extra bit buffer, 0..BITNUM-1 bits */ - uint8 *bytep; /* current position in buffer */ - uint8 *bytez; /* end of buffer to compare */ - uint8 *bytea; /* byte buffer */ - } -bitrec_t; - -#ifndef BITMASTER -extern -#endif -const uint8 maskc[9] -#ifdef BITMASTER -= -{0, 1, 3, 7, 15, 31, 63, 127, 255} -#endif - ; - -#ifndef BITMASTER -extern -#endif -const uint32 maskl[33] -#ifdef BITMASTER -= -{0x00000000, - 0x00000001, 0x00000003, 0x00000007, 0x0000000f, - 0x0000001f, 0x0000003f, 0x0000007f, 0x000000ff, - 0x000001ff, 0x000003ff, 0x000007ff, 0x00000fff, - 0x00001fff, 0x00003fff, 0x00007fff, 0x0000ffff, - 0x0001ffff, 0x0003ffff, 0x0007ffff, 0x000fffff, - 0x001fffff, 0x003fffff, 0x007fffff, 0x00ffffff, - 0x01ffffff, 0x03ffffff, 0x07ffffff, 0x0fffffff, - 0x1fffffff, 0x3fffffff, 0x7fffffff, 0xffffffffUL} -#endif - ; - -/* Function-like Macros */ -#define Hputbit(bitid,bit) ((Hbitwrite(bitid,1,(uint32)bit)==FAIL) ? FAIL : SUCCEED) - -#endif /* __HBITIO_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/hchunks.h b/Utilities/CAI/cai_dll/inc/inc_hdf/hchunks.h deleted file mode 100755 index 6c42ea00e6..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/hchunks.h +++ /dev/null @@ -1,294 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: hchunks.h - * Purpose: Header file for Chunked elements - * Dependencies: tbbt.c mcache.c - * Invokes: none - * Contents: Structures & definitions for chunked elements - * Structure definitions: DIM_DEF, HCHUNK_DEF - * Constant definitions: - * Author: -GeorgeV - 9/3/96 - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef __HCHUNKS_H -#define __HCHUNKS_H - -/* required includes */ -#include "hfile.h" /* special info stuff */ - -#ifdef _HCHUNKS_MAIN_ -/* Private to 'hchunks.c' */ - -#include "tbbt.h" /* TBBT stuff */ -#include "mcache.h" /* caching routines */ -#include "hcomp.h" /* For Compression */ - -/* Define class, class version and name(partial) for chunk table i.e. Vdata */ -#if 0 /* moved definition of class of vdata to hlimits.h */ -#define _HDF_CHK_TBL_CLASS "_HDF_CHK_TBL_" /* 13 bytes */ -#define _HDF_CHK_TBL_CLASS_VER 0 /* zero version number for class */ -#endif /* moved definition of class of vdata to hlimits.h */ -#define _HDF_CHK_TBL_NAME "_HDF_CHK_TBL_" /* 13 bytes */ - -/* Define field name for each chunk record i.e. Vdata record */ -#define _HDF_CHK_FIELD_1 "origin" /* 6 bytes */ -#define _HDF_CHK_FIELD_2 "chk_tag" /* 7 bytes */ -#define _HDF_CHK_FIELD_3 "chk_ref" /* 7 bytes */ -#define _HDF_CHK_FIELD_NAMES "origin,chk_tag,chk_ref" /* 22 bytes */ - -/* Define version number for chunked header format */ -#define _HDF_CHK_HDR_VER 0 /* zero version for format header */ - -#endif /* _HCHUNKS_MAIN_ */ - -/* Public structures */ - -/* Structure for each Data array dimension Defintion */ -typedef struct dim_def_struct { - int32 dim_length; /* length of this dimension */ - int32 chunk_length; /* chunk length along this dimension */ - int32 distrib_type; /* Data distribution along this dimension */ -} DIM_DEF, * DIM_DEF_PTR; - -/* Structure for each Chunk Definition*/ -typedef struct hchunk_def_struct { - int32 chunk_size; /* size of this chunk*/ - int32 nt_size; /* number type size i.e. size of data type */ - int32 num_dims; /* number of actual dimensions */ - DIM_DEF *pdims; /* ptr to array of dimension records for this chunk*/ - int32 chunk_flag; /* multiply specialness? SPECIAL_COMP */ - - /* For Compression info */ - comp_coder_t comp_type; /* Compression type */ - comp_model_t model_type; /* Compression model type */ - comp_info *cinfo; /* Compression info struct */ - model_info *minfo; /* Compression model info struct */ -}HCHUNK_DEF, * HCHUNK_DEF_PTR; - -/* Private structues */ -#ifdef _HCHUNKS_MAIN_ -/* Private to 'hchunks.c' */ - -/* Structure for each Data array dimension */ -typedef struct dim_rec_struct { - /* fields stored in chunked header */ - int32 flag; /* distrib_type(low 8 bits 0-7) - - Data distribution along this dimension - other(medium low 8 bits 8-15) - - regular/unlimited dimension? */ - int32 dim_length; /* length of this dimension */ - int32 chunk_length; /* chunk length along this dimension */ - - /* info determined from 'flag' field */ - int32 distrib_type; /* Data distribution along this dimension */ - int32 unlimited; /* regular(0) or unlimited dimension(1) */ - - /* computed fields */ - int32 last_chunk_length; /* last chunk length along this dimension */ - int32 num_chunks; /* i.e. "dim_length / chunk_length" */ -} DIM_REC, * DIM_REC_PTR; - -/* Structure for each Chunk */ -typedef struct chunk_rec_struct { - int32 chunk_number; /* chunk number from coordinates i.e. origin */ - int32 chk_vnum; /* chunk vdata record number i.e. position in table*/ - - /* chunk record fields stored in Vdata Table */ - int32 *origin; /* origin -> position of chunk */ - uint16 chk_tag; /* DFTAG_CHUNK or another Chunked element? */ - uint16 chk_ref; /* reference number of this chunk */ -}CHUNK_REC, * CHUNK_REC_PTR; - -/* information on this special chunk data elt */ -typedef struct chunkinfo_t -{ - intn attached; /* how many access records refer to this elt */ - int32 aid; /* Access id of chunk table i.e. Vdata */ - - /* chunked element format header fields */ - int32 sp_tag_header_len; /* length of the special element header */ - uint8 version; /* Version of this Chunked element */ - int32 flag; /* flag for multiply specialness ...*/ - int32 length; /* the actual length of the data elt */ - int32 chunk_size; /* the logical size of the chunks */ - int32 nt_size; /* number type size i.e. size of data type */ - uint16 chktbl_tag; /* DFTAG_VH - Vdata header */ - uint16 chktbl_ref; /* ref of the first chunk table structure(VDATA) */ - uint16 sp_tag; /* For future use.. */ - uint16 sp_ref; /* For future use.. */ - int32 ndims; /* number of dimensions of chunk */ - DIM_REC *ddims; /* array of dimension records */ - int32 fill_val_len; /* fill value number of bytes */ - VOID *fill_val; /* fill value */ - /* For each specialness, only one for now SPECIAL_COMP */ - int32 comp_sp_tag_head_len; /* Compression header length */ - VOID *comp_sp_tag_header; /* compression header */ - - /* For Compression info */ - comp_coder_t comp_type; /* Compression type */ - comp_model_t model_type; /* Compression model type */ - comp_info *cinfo; /* Compression info struct */ - model_info *minfo; /* Compression model info struct */ - - /* additional memory resident data structures to be used */ - int32 *seek_chunk_indices; /* chunk array indicies relative - to the other chunks */ - int32 *seek_pos_chunk; /* postion within the current chunk */ - int32 *seek_user_indices; /* user postion within the element */ - TBBT_TREE *chk_tree; /* TBBT tree of all accessed table entries - i.e. CHUNK_REC's read/written/modified */ - MCACHE *chk_cache; /* chunk cache */ - int32 num_recs; /* number of Table(Vdata) records */ -} -chunkinfo_t; -#endif /* _HCHUNKS_MAIN_ */ - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/* -** from hchunks.c -*/ - -/* User Public */ - HDFLIBAPI int32 HMCcreate - (int32 file_id, /* IN: file to put linked chunk element in */ - uint16 tag, /* IN: tag of element */ - uint16 ref, /* IN: ref of element */ - uint8 nlevels, /* IN: number of levels of chunks */ - int32 fill_val_len, /* IN: fill value length in bytes */ - VOID *fill_val, /* IN: fill value */ - HCHUNK_DEF *chk_array /* IN: structure describing chunk distribution - can be an array? but we only handle 1 level */); - - HDFLIBAPI int32 HMCgetcompress - (accrec_t* access_rec, /* IN: access record */ - comp_coder_t* comp_type, /* OUT: compression type */ - comp_info* c_info /* OUT: retrieved compression info */); - - HDFLIBAPI int32 HMCsetMaxcache - (int32 access_id, /* IN: access aid to mess with */ - int32 maxcache, /* IN: max number of pages to cache */ - int32 flags /* IN: flags = 0, HMC_PAGEALL */); - - HDFLIBAPI int32 HMCwriteChunk - (int32 access_id, /* IN: access aid to mess with */ - int32 *origin, /* IN: origin of chunk to write */ - const VOID *datap /* IN: buffer for data */); - - HDFLIBAPI int32 HMCreadChunk - (int32 access_id, /* IN: access aid to mess with */ - int32 *origin, /* IN: origin of chunk to read */ - VOID *datap /* IN: buffer for data */); - - HDFLIBAPI int32 HMCPcloseAID - (accrec_t *access_rec /* IN: access record of file to close */); - -/* Library Private */ -#ifdef _HCHUNKS_MAIN_ - /* tbbt.h helper routines */ - intn chkcompare(void * k1, /* IN: first key */ - void * k2, /* IN: second key */ - intn cmparg /* IN: not sure? */); - void chkfreekey(void * key /*IN: chunk key */ ); - void chkdestroynode(void * n /* IN: chunk record */ ); - -/* Private to 'hchunks.c' */ - extern int32 HMCPstread - (accrec_t *access_rec /* IN: access record to fill in */); - - extern int32 HMCPstwrite - (accrec_t *access_rec /* IN: access record to fill in */); - - extern int32 HMCPseek - (accrec_t *access_rec, /* IN: access record to mess with */ - int32 offset, /* IN: seek offset */ - int origin /* IN: where we should calc the offset from */); - - extern int32 HMCPchunkread - (VOID *cookie, /* IN: access record to mess with */ - int32 chunk_num, /* IN: chunk to read */ - VOID *datap /* OUT: buffer for data */); - - extern int32 HMCPread - (accrec_t * access_rec, /* IN: access record to mess with */ - int32 length, /* IN: number of bytes to read */ - void * data /* OUT: buffer for data */); - - extern int32 HMCPchunkwrite - (VOID *cookie, /* IN: access record to mess with */ - int32 chunk_num, /* IN: chunk number */ - const VOID *datap /* IN: buffer for data */); - - extern int32 HMCPwrite - (accrec_t *access_rec, /* IN: access record to mess with */ - int32 length, /* IN: number of bytes to write */ - const void * data /* IN: buffer for data */); - - extern intn HMCPendaccess - (accrec_t *access_rec /* IN: access record to close */); - - extern int32 HMCPinfo - (accrec_t *access_rec, /* IN: access record of access elemement */ - sp_info_block_t *info_chunk /* OUT: information about the special element */); - - extern int32 HMCPinquire - (accrec_t * access_rec, /* IN: access record to return info about */ - int32 *pfile_id, /* OUT: file ID; */ - uint16 *ptag, /* OUT: tag of info record; */ - uint16 *pref, /* OUT: ref of info record; */ - int32 *plength, /* OUT: length of element; */ - int32 *poffset, /* OUT: offset of element -- meaningless */ - int32 *pposn, /* OUT: current position in element; */ - int16 *paccess, /* OUT: access mode; */ - int16 *pspecial /* OUT: special code; */); - - extern int32 HMCPgetnumrecs - (accrec_t * access_rec, /* IN: access record to return info about */ - int32 *num_recs /* OUT: length of the chunked elt */); - -#endif /* _HCHUNKS_MAIN_ */ - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -#ifndef _HCHUNKS_MAIN_ -/* not in master file hchunk.c */ -extern funclist_t chunked_funcs; /* functions to perform chunking */ - -#else /* in hchunks.c */ - -/* the accessing special function table for chunks */ -funclist_t chunked_funcs = -{ - HMCPstread, - HMCPstwrite, - HMCPseek, - HMCPinquire, - HMCPread, - HMCPwrite, - HMCPendaccess, - HMCPinfo, - NULL /* no routine registerd */ -}; - -#endif - -#endif /* __HCHUNKS_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/hcomp.h b/Utilities/CAI/cai_dll/inc/inc_hdf/hcomp.h deleted file mode 100755 index 35c38488b9..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/hcomp.h +++ /dev/null @@ -1,143 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: hcomp.h - * Purpose: header file for compression information & structures - * Dependencies: should be included after hdf.h - * Invokes: - * Contents: - * Structure definitions: comp_info - * Constant definitions: lots... - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef __HCOMP_H -#define __HCOMP_H - -/* For determining which type of modeling is being done */ -typedef enum - { - COMP_MODEL_STDIO = 0 /* for Standard C I/O model */ - } -comp_model_t; - -/* For determining which type of encoding is being done */ -typedef enum - { - COMP_CODE_NONE = 0, /* don't encode at all, just store */ - COMP_CODE_RLE, /* for simple RLE encoding */ - COMP_CODE_NBIT, /* for N-bit encoding */ - COMP_CODE_SKPHUFF, /* for Skipping huffman encoding */ - COMP_CODE_DEFLATE, /* for gzip 'deflate' encoding */ - COMP_CODE_SZIP, /* for szip encoding */ - COMP_CODE_INVALID, /* invalid last code, for range checking */ - COMP_CODE_JPEG /* _Ugly_ hack to allow JPEG images to be created with GRsetcompress */ - } -comp_coder_t; - -/* Compression types available */ -#define COMP_NONE 0 -#define COMP_JPEG 2 -#define COMP_RLE 11 -#define COMP_IMCOMP 12 - -/* Compression encoder/decoder configuration */ -#define COMP_DECODER_ENABLED 1 -#define COMP_ENCODER_ENABLED 2 - -#ifndef COMPRESS_MASTER -extern uint16 compress_map[]; -#else -uint16 compress_map[COMP_MAX_COMP + 1] = -{ /* Mapping from compression types to tags */ - 0, /* No corresponding tag for un-compressed data */ - 0, /* (1) */ - DFTAG_JPEG5, /* COMP_JPEG -> DFTAG_JPEG5 (for JPEG compression) */ - 0, /* (3) */ - 0, /* (4) */ - 0, /* (5) */ - 0, /* (6) */ - 0, /* (7) */ - 0, /* (8) */ - 0, /* (9) */ - 0, /* (10) */ - DFTAG_RLE, /* COMP_RLE -> DFTAG_RLE (for Run-length compression) */ - DFTAG_IMC /* COMP_IMCOMP -> DFTAG_IMC (for IMCOMP compression) */ -}; -#endif - -typedef union tag_model_info - { /* Union to contain modeling information */ - struct - { - int32 nt; /* number type */ - intn ndim; /* number of dimensions */ - int32 *dims; /* array of dimensions */ - } - dim; - } -model_info; - -typedef union tag_comp_info - { /* Union to contain compression information */ - struct - { /* Struct to contain information about how to compress */ - /* or decompress a JPEG encoded 24-bit image */ - intn quality; /* Quality factor for JPEG compression, should be from */ - /* 0 (terrible) to 100 (very good) */ - intn force_baseline; /* If force_baseline is set to TRUE then */ - /* quantization tables are limited to */ - /* 0..255 for JPEG baseline compability */ - /* This is only an issue for quality */ - /* settings below 24 */ - } - jpeg; - struct - { /* struct to contain information about how to compress */ - /* or decompress a N-bit encoded dataset */ - int32 nt; /* number type of the data to encode */ - intn sign_ext; /* whether to sign extend or not */ - intn fill_one; /* whether to fill with 1's or 0's */ - intn start_bit; /* offset of the start bit in the data */ - intn bit_len; /* number of bits to store */ - } - nbit; - struct - { /* struct to contain info about how to compress */ - /* or decompress a "skipping" huffman encoded dataset */ - intn skp_size; /* size of the individual elements when skipping */ - } - skphuff; - struct - { /* struct to contain info about how to compress */ - /* or decompress a gzip encoded dataset */ - intn level; /* how hard to work when compressing the data */ - } - deflate; - struct - { - int32 options_mask; /* IN */ - int32 pixels_per_block; /* IN */ - int32 pixels_per_scanline; /* OUT: computed */ - int32 bits_per_pixel; /* OUT: size of NT */ - int32 pixels; /* OUT: size of dataset or chunk */ - } - szip; /* for szip encoding */ - - } -comp_info; - -#endif /* __HCOMP_H */ - diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/hcompi.h b/Utilities/CAI/cai_dll/inc/inc_hdf/hcompi.h deleted file mode 100755 index 99606c46dc..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/hcompi.h +++ /dev/null @@ -1,114 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: hcompi.h - * Purpose: Internal library header file for compression information - * Dependencies: should be included after hdf.h - * Invokes: - * Contents: - * Structure definitions: - * Constant definitions: - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef __HCOMPI_H -#define __HCOMPI_H - -#include "hfile.h" - -/* Modeling information */ - -/* structure for storing modeling information */ -/* only allow modeling and master compression routines access */ - -#include "mstdio.h" /* stdio modeling header */ - -typedef struct comp_model_info_tag - { - comp_model_t model_type; /* model this stream is using */ - union - { /* union of all the different types of model information */ - comp_model_stdio_info_t stdio_info; /* stdio model info */ - } - model_info; - funclist_t model_funcs; /* functions to perform modeling */ - } -comp_model_info_t; - -/* Coding information */ - -/* structure for storing modeling information */ -/* only allow encoding and master compression routines access */ - -#include "cnone.h" /* no encoding header */ -#include "crle.h" /* run-length encoding header */ -#include "cnbit.h" /* N-bit encoding header */ -#include "cskphuff.h" /* Skipping huffman encoding header */ -#include "cdeflate.h" /* gzip 'deflate' encoding header */ -#include "cszip.h" /* szip encoding header */ - -typedef struct comp_coder_info_tag - { - comp_coder_t coder_type; /* coding scheme this stream is using */ - union - { /* union of all the different types of coding information */ - comp_coder_none_info_t none_info; /* "None" coding info */ - comp_coder_rle_info_t rle_info; /* RLE coding info */ - comp_coder_nbit_info_t nbit_info; /* N-bit coding info */ - comp_coder_skphuff_info_t skphuff_info; /* Skipping huffman coding info */ - comp_coder_deflate_info_t deflate_info; /* gzip 'deflate' coding info */ - comp_coder_szip_info_t szip_info; /* szip coding info */ - - } - coder_info; - funclist_t coder_funcs; /* functions to perform encoding */ - } -comp_coder_info_t; - -/* structure for storing a state */ -typedef struct comp_stateinfo_tag - { - uint32 d_offset; /* the offset of the state in the dataset */ - uint32 c_offset; /* offset of the state in the compressed data */ - comp_model_info_t minfo; /* modeling information */ - comp_coder_info_t cinfo; /* coding information */ - } -comp_stateinfo_t; - -/* structure for storing state caching information */ -typedef struct comp_state_cache_tag - { - intn num_states; /* the number of states cached */ - comp_stateinfo_t **comp_state; /* pointer to an array of pointers to - compression states */ - } -comp_state_cache_t; - -/* compinfo_t -- compressed element information structure */ -typedef struct compinfo_tag - { - intn attached; /* number of access records attached - to this information structure */ - int32 length; /* the actual length of the data elt */ - uint16 comp_ref; /* compressed info ref. number */ - int32 aid; /* AID of the compressed info */ - comp_model_info_t minfo; /* modeling information */ - comp_coder_info_t cinfo; /* coding information */ - intn caching; /* whether caching is turned on */ - comp_state_cache_t sinfo; /* state information for caching */ - } -compinfo_t; - -#endif /* __HCOMPI_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/hconv.h b/Utilities/CAI/cai_dll/inc/inc_hdf/hconv.h deleted file mode 100755 index ec9132441e..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/hconv.h +++ /dev/null @@ -1,272 +0,0 @@ - -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: hconv.h - * Purpose: header file for data conversion information & structures - * Invokes: - * Contents: - * Structure definitions: - * Constant definitions: lots... - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef _HCONV_H -#define _HCONV_H - -#ifndef VMS -#define DUFF -#else -#ifdef DUFF -#undef DUFF -#endif -#endif -#ifdef DUFF -#define DUFF_sb4b - -#define DUFF_ui2i -#define DUFF_ui2s -#define DUFF_uo2i -#define DUFF_ui4i -#define DUFF_ui4s -#define DUFF_uo4i -#define DUFF_ui4f -#define DUFF_uo4f -#define DUFF_ui8f -#define DUFF_uo8f - -#define DUFF_lui2i -#define DUFF_lui2s -#define DUFF_luo2i -#define DUFF_lui4i -#define DUFF_lui4s -#define DUFF_luo4i -#define DUFF_lui4f -#define DUFF_luo4f -#define DUFF_lui8f -#define DUFF_luo8f -#endif - -/*****************************************************************************/ -/* CONSTANT DEFINITIONS */ -/*****************************************************************************/ -/* Generally Big-Endian machines */ -#if !defined(VMS) && !defined(INTEL86) && !defined(MIPSEL) && !defined(DEC_ALPHA) && !defined(I860) && !defined(SUN386) && !defined(__ia64) && !defined(__x86_64__) -# if !defined(UNICOS) -# define UI8_IN DFKnb1b /* Unsigned Integer, 8 bits */ -# define UI8_OUT DFKnb1b -# if defined(CRAYMPP) -# define SI16_IN DFKmi2s -# define SI16_OUT DFKmo2b -# define UI16_IN DFKmi2i -# define UI16_OUT DFKmo2b -# else -# define SI16_IN DFKnb2b /* S = Signed */ -# define SI16_OUT DFKnb2b -# define UI16_IN DFKnb2b -# define UI16_OUT DFKnb2b -# endif -# define SI32_IN DFKnb4b -# define SI32_OUT DFKnb4b -# define UI32_IN DFKnb4b -# define UI32_OUT DFKnb4b -# if defined(CONVEXNATIVE) -# define F32_IN DFKci4f /* CONVEX stuff */ -# define F32_OUT DFKco4f -# define F64_IN DFKci8f -# define F64_OUT DFKco8f -# elif defined(VP) -# define F32_IN DFKpi4f /* Fujitsu VP stuff */ -# define F32_OUT DFKpo4f -# define F64_IN DFKpi8f -# define F64_OUT DFKpo8f -# else /* !CONVEXNATIVE */ -# define F32_IN DFKnb4b /* Float, 32 bits */ -# define F32_OUT DFKnb4b -# define F64_IN DFKnb8b -# define F64_OUT DFKnb8b -# endif /* CONVEXNATIVE */ - -# define LUI8_IN DFKnb1b /* Little Endian Unsigned Integer, 8 bits */ -# define LUI8_OUT DFKnb1b -# if defined(CRAYMPP) -# define LSI16_IN DFKlmi2s -# define LSI16_OUT DFKlmo2b -# define LUI16_IN DFKlmi2i -# define LUI16_OUT DFKlmo2b -# else -# define LSI16_IN DFKsb2b -# define LSI16_OUT DFKsb2b -# define LUI16_IN DFKsb2b -# define LUI16_OUT DFKsb2b -# endif -# define LSI32_IN DFKsb4b -# define LSI32_OUT DFKsb4b -# define LUI32_IN DFKsb4b -# define LUI32_OUT DFKsb4b -# if defined(CONVEXNATIVE) -# define LF32_IN DFKlci4f /* CONVEX little-endian routines */ -# define LF32_OUT DFKlco4f -# define LF64_IN DFKlci8f -# define LF64_OUT DFKlco8f -# elif defined(VP) -# define LF32_IN DFKlpi4f /* Fujitsu VP little-endian routines */ -# define LF32_OUT DFKlpo4f -# define LF64_IN DFKlpi8f -# define LF64_OUT DFKlpo8f -# else /* !CONVEXNATIVE */ -# define LF32_IN DFKsb4b -# define LF32_OUT DFKsb4b -# define LF64_IN DFKsb8b -# define LF64_OUT DFKsb8b -# endif /* CONVEXNATIVE */ - -# else /* UNICOS */ -# define UI8_IN DFKnb1b /* Big-Endian IEEE support */ -# define UI8_OUT DFKnb1b -# define SI16_IN DFKui2s -# define SI16_OUT DFKuo2s -# define UI16_IN DFKui2i -# define UI16_OUT DFKuo2i -# define SI32_IN DFKui4s -# define SI32_OUT DFKuo4s -# define UI32_IN DFKui4i -# define UI32_OUT DFKuo4i -# define F32_IN DFKui4f -# define F32_OUT DFKuo4f -# define F64_IN DFKui8f -# define F64_OUT DFKuo8f - -# define LUI8_IN DFKnb1b /* Little-endian IEEE support */ -# define LUI8_OUT DFKnb1b -# define LSI16_IN DFKlui2s -# define LSI16_OUT DFKluo2s -# define LUI16_IN DFKlui2i -# define LUI16_OUT DFKluo2i -# define LSI32_IN DFKlui4s -# define LSI32_OUT DFKluo4s -# define LUI32_IN DFKlui4i -# define LUI32_OUT DFKluo4i -# define LF32_IN DFKlui4f -# define LF32_OUT DFKluo4f -# define LF64_IN DFKlui8f -# define LF64_OUT DFKluo8f - -# endif /* !UNICOS */ -#else /* must be VMS || INTEL86 || MIPSEL || DEC_ALPHA || I860 || SUN386 || IA64 || Linux64 (Generally, little-endian machines */ -# define UI8_IN DFKnb1b /* Big-Endian IEEE support */ -# define UI8_OUT DFKnb1b /* The s in DFKsb2b is for swap */ -# define SI16_IN DFKsb2b -# define SI16_OUT DFKsb2b -# define UI16_IN DFKsb2b -# define UI16_OUT DFKsb2b -# define SI32_IN DFKsb4b -# define SI32_OUT DFKsb4b -# define UI32_IN DFKsb4b -# define UI32_OUT DFKsb4b -# if defined(VMS) -# define F32_IN DFKvi4f -# define F32_OUT DFKvo4f -# define F64_IN DFKvi8f -# define F64_OUT DFKvo8f -# else /* !VMS */ -# define F32_IN DFKsb4b -# define F32_OUT DFKsb4b -# define F64_IN DFKsb8b -# define F64_OUT DFKsb8b -# endif /* VMS */ - -# define LUI8_IN DFKnb1b /* Little-Endian IEEE support */ -# define LUI8_OUT DFKnb1b -# define LSI16_IN DFKnb2b -# define LSI16_OUT DFKnb2b -# define LUI16_IN DFKnb2b -# define LUI16_OUT DFKnb2b -# define LSI32_IN DFKnb4b -# define LSI32_OUT DFKnb4b -# define LUI32_IN DFKnb4b -# define LUI32_OUT DFKnb4b -# if defined(VMS) -# define LF32_IN DFKlvi4f -# define LF32_OUT DFKlvo4f -# define LF64_IN DFKlvi8f -# define LF64_OUT DFKlvo8f -# else /* !VMS */ -# define LF32_IN DFKnb4b -# define LF32_OUT DFKnb4b -# define LF64_IN DFKnb8b -# define LF64_OUT DFKnb8b -# endif /* VMS */ - -#endif /* !VMS && !INTEL86 && !MIPS && !DEC_ALPHA && !I860 && !SUN386 && !IA64 && !Linux64*/ - -/* All Machines (except the Cray) currently use the same routines */ -/* for Native mode "conversions" */ -#ifndef UNICOS -# define NUI8_IN DFKnb1b -# define NUI8_OUT DFKnb1b -# if defined(CRAYMPP) -# define NSI16_IN DFKmi2s -# define NSI16_OUT DFKmo2b -# define NUI16_IN DFKmi2i -# define NUI16_OUT DFKmo2b -# else -# define NSI16_IN DFKnb2b -# define NSI16_OUT DFKnb2b -# define NUI16_IN DFKnb2b -# define NUI16_OUT DFKnb2b -# endif -# define NSI32_IN DFKnb4b -# define NSI32_OUT DFKnb4b -# define NUI32_IN DFKnb4b -# define NUI32_OUT DFKnb4b -# define NF32_IN DFKnb4b -# define NF32_OUT DFKnb4b -# define NF64_IN DFKnb8b -# define NF64_OUT DFKnb8b -#else /* UNICOS */ -# define NUI8_IN DFKnb1b -# define NUI8_OUT DFKnb1b -# define NSI16_IN DFKnb8b -# define NSI16_OUT DFKnb8b -# define NUI16_IN DFKnb8b -# define NUI16_OUT DFKnb8b -# define NSI32_IN DFKnb8b -# define NSI32_OUT DFKnb8b -# define NUI32_IN DFKnb8b -# define NUI32_OUT DFKnb8b -# define NF32_IN DFKnb8b -# define NF32_OUT DFKnb8b -# define NF64_IN DFKnb8b -# define NF64_OUT DFKnb8b -#endif /* UNICOS */ - -/*****************************************************************************/ -/* STRUCTURE DEFINTIONS */ -/*****************************************************************************/ -union fpx - { - float f; - long l; - }; - -union float_uint_uchar - { - float32 f; - int32 i; - unsigned char c[4]; - }; - -#endif /* _HCONV_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/hdf2netcdf.h b/Utilities/CAI/cai_dll/inc/inc_hdf/hdf2netcdf.h deleted file mode 100755 index f0438d2b8e..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/hdf2netcdf.h +++ /dev/null @@ -1,56 +0,0 @@ -/* $Id$ */ - -/* If we disable the HDF version of the netCDF API (ncxxx interface) - (-DHAVE_NETCDF) we need to rename all the relevant function names - In this version we exclude renaming the netCDF fortran API so - the MFHDF side must be compilied without fortran support. */ -#ifdef HAVE_NETCDF -#define HNAME(x) sd_##x /* pre-append 'sd_' to all netCDF fcn names */ -#else /* !HAVE_NETCDF i.e USING HDF NETCDF */ -#define HNAME(x) x -#endif /* !HAVE_NETCDF i.e. USING HDF NETCDF */ - -/* If using the real netCDF library and API (use -DHAVE_NETCDF) - need to mangle the HDF versions of netCDF API function names - to not conflict w/ oriinal netCDF ones */ -#ifdef HAVE_NETCDF -#define ncerr HNAME(ncerr) -#define ncopts HNAME(ncopts) -#define nccreate HNAME(nccreate) -#define ncopen HNAME(ncopen) -#define ncredef HNAME(ncredef) -#define ncendef HNAME(ncendef) -#define ncclose HNAME(ncclose) -#define ncinquire HNAME(ncinquire) -#define ncsync HNAME(ncsync) -#define ncabort HNAME(ncabort) -#define ncdimdef HNAME(ncdimdef) -#define ncdimid HNAME(ncdimid) -#define ncdiminq HNAME(ncdiminq) -#define ncdimrename HNAME(ncdimrename) -#define ncvardef HNAME(ncvardef) -#define ncvarid HNAME(ncvarid) -#define ncvarinq HNAME(ncvarinq) -#define ncvarput1 HNAME(ncvarput1) -#define ncvarget1 HNAME(ncvarget1) -#define ncvarput HNAME(ncvarput) -#define ncvarget HNAME(ncvarget) -#define ncvarputs HNAME(ncvarputs) -#define ncvargets HNAME(ncvargets) -#define ncvarputg HNAME(ncvarputg) -#define ncvargetg HNAME(ncvargetg) -#define ncvarrename HNAME(ncvarrename) -#define ncattput HNAME(ncattput) -#define ncattinq HNAME(ncattinq) -#define ncattget HNAME(ncattget) -#define ncattcopy HNAME(ncattcopy) -#define ncattname HNAME(ncattname) -#define ncattrename HNAME(ncattrename) -#define ncattdel HNAME(ncattdel) -#define nctypelen HNAME(nctypelen) -#define ncsetfill HNAME(ncsetfill) -#define ncrecinq HNAME(ncrecinq) -#define ncrecget HNAME(ncrecget) -#define ncrecput HNAME(ncrecput) -#define ncnobuf HNAME(ncnobuf) /* no prototype for this one */ -#endif /* HAVE_NETCDF i.e NOT USING HDF version of netCDF API */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/herr.h b/Utilities/CAI/cai_dll/inc/inc_hdf/herr.h deleted file mode 100755 index 93d983d06f..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/herr.h +++ /dev/null @@ -1,457 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*+ herr.h - *** header file for using error routines - *** to be included by all ".c" files - + */ - -#ifndef __HERR_H -#define __HERR_H - -/* if these symbols are not provided by the compiler, we'll have to - fake them. These are used in HERROR for recording location of - error in code. */ - -#ifndef __FILE__ -# define __FILE__ "File name not supported" -#endif -#ifndef __LINE__ -# define __LINE__ 0 -#endif - -/* HERROR macro, used to facilitate error reporting. Assumes that - there's a variable called FUNC which holds the function name. - Assume that func and file are both stored in static space, or at - least be not corrupted in the meanwhile. */ - -#define HERROR(e) HEpush(e, FUNC, __FILE__, __LINE__) - -/* HRETURN_ERROR macro, used to facilitate error reporting. Makes - same assumptions as HERROR. IN ADDITION, this macro causes - a return from the calling routine */ - -#define HRETURN_ERROR(err, ret_val) {HERROR(err); return(ret_val);} - -/* HCLOSE_RETURN_ERROR macro, used to facilitate error reporting. Makes - same assumptions as HRETURN_ERROR. IN ADDITION, this macro causes - the file specified by the id "fid" to be closed */ - -#define HCLOSE_RETURN_ERROR(hfid, err, ret_val) {HERROR(err); Hclose(hfid); \ - return(ret_val);} - -/* HGOTO_ERROR macro, used to facilitate error reporting. Makes - same assumptions as HERROR. IN ADDITION, this macro causes - a jump to the label 'done' which should be in every fucntion - Also there is an assumption of a variable 'ret_value' */ - -#define HGOTO_ERROR(err, ret_val) {HERROR(err); ret_value = ret_val; \ - goto done;} - -/* HCLOSE_RETURN_ERROR macro, used to facilitate error reporting. Makes - same assumptions as HRETURN_ERROR. IN ADDITION, this macro causes - the file specified by the id "fid" to be closed - Also , this macro causes a jump to the label 'done' which should - be in every fucntion. There is an assumption of a variable 'ret_value' */ - -#define HCLOSE_GOTO_ERROR(hfid, err, ret_val) {HERROR(err); Hclose(hfid); \ - ret_value = ret_val; goto done;} - -/* HGOTO_DONE macro, used to facilitate the new error reporting model. - This macro is just a wrapper to set the return value and jump to the 'done' - label. Also assumption of a variable 'ret_value' */ - -#define HGOTO_DONE(ret_val) {ret_value = ret_val; goto done;} - -/* For further error reporting */ -#define HE_REPORT(msg) HEreport(msg) -#define HE_REPORT_RETURN(msg, ret_val) { HEreport(msg); return(ret_val); } -#define HE_CLOSE_REPORT_RETURN(hfid,msg, ret_val) { HEreport(msg); \ - Hclose(hfid); \ - return(ret_val);} - -#define HE_REPORT_GOTO(msg, ret_val) { HEreport(msg); ret_value = ret_val; \ - goto done;} -#define HE_CLOSE_REPORT_GOTO(hfid,msg, ret_val) { HEreport(msg); \ - Hclose(hfid); \ - ret_value = ret_val; \ - goto done;} - - -/* always points to the next available slot; the last error record is in slot (top-1) */ -#ifndef _H_ERR_MASTER_ -#if defined WIN32 && defined HDFAPDLL -__declspec(dllimport) -#else -extern -#endif -#else -#if defined WIN32 && defined HDFLIBDLL -__declspec(dllexport) -#endif -#endif /* _H_ERR_MASTER_ */ -int32 error_top -#ifdef _H_ERR_MASTER_ -= 0 -#endif /* _H_ERR_MASTER_ */ -; - -/* Macro to wrap around calls to HEPclear, so it doesn't get called zillions of times */ -#define HEclear() {if(error_top!=0) HEPclear(); } - -/* - ====================================================================== - Error codes - - NOTE: Remember to update the error_messages[] structure in herr.c - whenever errors are added/deleted from this list. - ====================================================================== - */ -/* Declare an enumerated type which holds all the valid HDF error codes */ -typedef enum - { - DFE_NONE = 0, /* special zero, no error */ -/* Low-level I/O errors */ - DFE_FNF, /* File not found */ - DFE_DENIED, /* Access to file denied */ - DFE_ALROPEN, /* File already open */ - DFE_TOOMANY, /* Too Many AID's or files open */ - DFE_BADNAME, /* Bad file name on open */ - DFE_BADACC, /* Bad file access mode */ - DFE_BADOPEN, /* Other open error */ - DFE_NOTOPEN, /* File can't be closed 'cause it isn't open */ - DFE_CANTCLOSE, /* fclose wouldn't work! */ - DFE_READERROR, /* There was a read error */ - DFE_WRITEERROR, /* There was a write error */ - DFE_SEEKERROR, /* There was a seek error */ - DFE_RDONLY, /* The DF is read only */ - DFE_BADSEEK, /* Attempt to seek past end of element */ - -/* Low-level HDF I/O errors */ - DFE_PUTELEM, /* Hputelement failed in some way */ - DFE_GETELEM, /* Hgetelement failed in some way */ - DFE_CANTLINK, /* Can't initialize link information */ - DFE_CANTSYNC, /* Cannot syncronize memory with file */ - -/* Old group interface errors */ - DFE_BADGROUP, /* Error from DFdiread in opening a group */ - DFE_GROUPSETUP, /* Error from DFdisetup in opening a group */ - DFE_PUTGROUP, /* Error when putting a tag/ref into a group */ - DFE_GROUPWRITE, /* Error when writing out a group */ - -/* Internal HDF errors */ - DFE_DFNULL, /* DF is a null pointer */ - DFE_ILLTYPE, /* DF has an illegal type: internal error */ - DFE_BADDDLIST, /* The DD list is non-existent: internal error */ - DFE_NOTDFFILE, /* This is not a DF file and it is not 0 length */ - DFE_SEEDTWICE, /* The DD list already seeded: internal error */ - DFE_NOSUCHTAG, /* No such tag in the file: search failed */ - DFE_NOFREEDD, /* There are no free DD's left: internal error */ - DFE_BADTAG, /* illegal WILDCARD tag */ - DFE_BADREF, /* illegal WILDCARD reference # */ - DFE_NOMATCH, /* No (more) DDs which match specified tag/ref */ - DFE_NOTINSET, /* Warning: Set contained unknown tag: ignored */ - DFE_BADOFFSET, /* Illegal offset specified */ - DFE_CORRUPT, /* File is corrupted */ - DFE_NOREF, /* no more reference numbers are available */ - DFE_DUPDD, /* the new tag/ref is already used */ - DFE_CANTMOD, /* old element not exist, cannot modify */ - DFE_DIFFFILES, /* Attempt to merge objs in diff files */ - DFE_BADAID, /* Got a bogus aid */ - DFE_OPENAID, /* There are still active AIDs */ - DFE_CANTFLUSH, /* Can't flush DD back to file */ - DFE_CANTUPDATE, /* Cannot update the DD block */ - DFE_CANTHASH, /* Cannot add a DD to the hash table */ - DFE_CANTDELDD, /* Cannot delete a DD in the file */ - DFE_CANTDELHASH, /* Cannot delete a DD from the hash table */ - DFE_CANTACCESS, /* Cannot access specified tag/ref */ - DFE_CANTENDACCESS, /* Cannot end access to data element */ - DFE_TABLEFULL, /* Access table is full */ - DFE_NOTINTABLE, /* Cannot find element in table */ - -/* Generic errors */ - DFE_UNSUPPORTED, /* Feature not currently supported */ - DFE_NOSPACE, /* Malloc failed */ - DFE_BADCALL, /* Calls in wrong order */ - DFE_BADPTR, /* NULL ptr argument */ - DFE_BADLEN, /* Invalid len specified */ - DFE_NOTENOUGH, /* space provided insufficient for size of data */ - DFE_NOVALS, /* Values not available */ - DFE_ARGS, /* bad arguments to routine */ - DFE_INTERNAL, /* serious internal error */ - DFE_NORESET, /* Too late to modify this value */ - DFE_GENAPP, /* Generic application,level error */ - -/* Generic interface errors */ - DFE_UNINIT, /* Interface was not initialized correctly */ - DFE_CANTINIT, /* Can't initialize an interface we depend on */ - DFE_CANTSHUTDOWN, /* Can't shut down an interface we depend on */ - -/* General Dataset errors */ - DFE_BADDIM, /* negative or zero dimensions specified */ - DFE_BADFP, /* File contained an illegal floating point num */ - DFE_BADDATATYPE, /* unknown or unavailable data type specified */ - DFE_BADMCTYPE, /* unknown or unavailable machine type specified */ - DFE_BADNUMTYPE, /* unknown or unavailable number type specified */ - DFE_BADORDER, /* unknown or illegal array order specified */ - DFE_RANGE, /* improper range for attempted acess */ - DFE_BADCONV, /* Don't know how to convert data type */ - DFE_BADTYPE, /* Incompatible types specified */ - -/* Compression errors */ - DFE_BADSCHEME, /* Unknown compression scheme specified */ - DFE_BADMODEL, /* Invalid compression model specified */ - DFE_BADCODER, /* Invalid compression encoder specified */ - DFE_MODEL, /* Error in modeling layer of compression */ - DFE_CODER, /* Error in encoding layer of compression */ - DFE_CINIT, /* Error in encoding initialization */ - DFE_CDECODE, /* Error in decoding compressed data */ - DFE_CENCODE, /* Error in encoding compressed data */ - DFE_CTERM, /* Error in encoding termination */ - DFE_CSEEK, /* Error seekging in encoded dataset */ - DFE_MINIT, /* Error in modeling initialization */ - DFE_COMPINFO, /* Invalid compression header */ - DFE_CANTCOMP, /* Can't compress an object */ - DFE_CANTDECOMP, /* Can't de-compress an object */ - DFE_NOENCODER, /* Encoder not available */ - -/* Raster errors */ - DFE_NODIM, /* No dimension record associated with image */ - DFE_BADRIG, /* Error processing a RIG */ - DFE_RINOTFOUND, /* Can't find raster image */ - DFE_BADATTR, /* Bad Attribute */ - DFE_LUTNOTFOUND, /* No palette information for RIG */ - -/* SDG/NDG errors */ - DFE_BADTABLE, /* the nsdg table is wrong */ - DFE_BADSDG, /* error processing an sdg */ - DFE_BADNDG, /* error processing an ndg */ - -/* Vset errors */ - DFE_VGSIZE, /* Too many elements in VGroup */ - DFE_VTAB, /* Elmt not in vtab[] */ - DFE_CANTADDELEM, /* Cannot add tag/ref to VGroup */ - DFE_BADVGNAME, /* Cannot set VGroup name */ - DFE_BADVGCLASS, /* Cannot set VGroup class */ - -/* Vdata errors */ - DFE_BADFIELDS, /* Bad fields string passed to Vset routine */ - DFE_NOVS, /* Counldn't find VS in file */ - DFE_SYMSIZE, /* Too many symbols in users table */ - DFE_BADATTACH, /* Cannot write to a previously attached VData */ - DFE_BADVSNAME, /* Cannot set VData name */ - DFE_BADVSCLASS, /* Cannot set VData class */ - DFE_VSWRITE, /* Error writing to VData */ - DFE_VSREAD, /* Error reading from VData */ - DFE_BADVH, /* Error in VData Header */ - DFE_FIELDSSET, /* Fields already set for vdata */ -/* High-level Vdata/Vset errors */ - DFE_VSCANTCREATE, /* Cannot create VData */ - DFE_VGCANTCREATE, /* Cannot create VGroup */ - -/* Generic Vdata/Vset errors */ - DFE_CANTATTACH, /* Cannot attach to a VData/Vset */ - DFE_CANTDETACH, /* Cannot detach a VData/Vset with access 'w' */ - -/* bit I/O errors */ - DFE_BITREAD, /* There was a bit-read error */ - DFE_BITWRITE, /* There was a bit-write error */ - DFE_BITSEEK, /* There was a bit-seek error */ - -/* tbbt interface errors */ - DFE_TBBTINS, /* Failed to insert element into tree */ - -/* bit-vector interface errors */ - DFE_BVNEW, /* Failed to create a bit-vector */ - DFE_BVSET, /* Failed when setting a bit in a bit-vector */ - DFE_BVGET, /* Failed when getting a bit in a bit-vector */ - DFE_BVFIND /* Failed when finding a bit in a bit-vector */ - } -hdf_err_code_t; - -#ifdef _H_ERR_MASTER_ - -/* error_messages is the list of error messages in the system, kept as - error_code-message pairs. To look up a message, a linear search is - required but efficiency should be okay. */ - -typedef struct error_messages_t - { - hdf_err_code_t error_code; - const char *str; - } -error_messages_t; - -PRIVATE const struct error_messages_t error_messages[] = -{ - {DFE_NONE, "No error"}, -/* Low-level I/O errors */ - {DFE_FNF, "File not found"}, - {DFE_DENIED, "Access to file denied"}, - {DFE_ALROPEN, "File already open"}, - {DFE_TOOMANY, "Too Many AID's or files open"}, - {DFE_BADNAME, "Bad file name on open"}, - {DFE_BADACC, "Bad file access mode"}, - {DFE_BADOPEN, "Error opening file"}, - {DFE_NOTOPEN, "File can't be closed; It isn't open"}, - {DFE_CANTCLOSE, "Unable to close file"}, - {DFE_READERROR, "Read error"}, - {DFE_WRITEERROR, "Write error"}, - {DFE_SEEKERROR, "Error performing seek operation"}, - {DFE_RDONLY, "Attempt to write to read-only HDF file"}, - {DFE_BADSEEK, "Attempt to seek past end of element"}, - -/* Low-level HDF I/O errors */ - {DFE_PUTELEM, "Hputelement failed in some way"}, - {DFE_GETELEM, "Hgetelement failed in some way"}, - {DFE_CANTLINK, "Can't initialize link information"}, - {DFE_CANTSYNC, "Cannot syncronize memory with file"}, - -/* Old group interface errors */ - {DFE_BADGROUP, "Error from DFdiread in opening a group"}, - {DFE_GROUPSETUP, "Error from DFdisetup in opening a group"}, - {DFE_PUTGROUP, "Error when putting a tag/ref into a group"}, - {DFE_GROUPWRITE, "Error when writing out a group"}, - -/* Internal HDF errors */ - {DFE_DFNULL, "DF has a null pointer"}, - {DFE_ILLTYPE, "Internal error: DF has an illegal type"}, - {DFE_BADDDLIST, "Internal error: The DD list is non-existent"}, - {DFE_NOTDFFILE, "This is not an HDF file"}, - {DFE_SEEDTWICE, "Internal error: The DD list is already seeded"}, - {DFE_NOSUCHTAG, "No such tag in the file: search failed"}, - {DFE_NOFREEDD, "There are no free DD's left"}, - {DFE_BADTAG, "Illegal WILDCARD tag"}, - {DFE_BADREF, "Illegal WILDCARD reference"}, - {DFE_NOMATCH, "No (more) DDs which match specified tag/ref"}, - {DFE_NOTINSET, "Set contained unknown tag: ignored"}, - {DFE_BADOFFSET, "Illegal offset specified"}, - {DFE_CORRUPT, "File is corrupted"}, - {DFE_NOREF, "No more reference numbers are available"}, - {DFE_DUPDD, "Tag/ref is already used"}, - {DFE_CANTMOD, "Old element does not exist, cannot modify"}, - {DFE_DIFFFILES, "Attempt to merge objects in different files"}, - {DFE_BADAID, "Unable to create a new AID"}, - {DFE_OPENAID, "There are still active AIDs"}, - {DFE_CANTFLUSH, "Cannot flush the changed DD back to the file"}, - {DFE_CANTUPDATE, "Cannot update the DD block"}, - {DFE_CANTHASH, "Cannot add a DD to the hash table"}, - {DFE_CANTDELDD, "Cannot delete a DD in the file"}, - {DFE_CANTDELHASH, "Cannot delete a DD from the hash table"}, - {DFE_CANTACCESS, "Cannot access specified tag/ref"}, - {DFE_CANTENDACCESS, "Cannot end access to data element"}, - {DFE_TABLEFULL, "Access table is full"}, - {DFE_NOTINTABLE, "Cannot find element in table"}, - -/* Generic errors */ - {DFE_UNSUPPORTED, "Feature not currently supported"}, - {DFE_NOSPACE, "Internal error: Out of space"}, - {DFE_BADCALL, "Calls in wrong order"}, - {DFE_BADPTR, "NULL ptr argument"}, - {DFE_BADLEN, "Invalid length specified"}, - {DFE_NOTENOUGH, "Space provided insufficient for size of data"}, - {DFE_NOVALS, "Values not available"}, - {DFE_ARGS, "Invalid arguments to routine"}, - {DFE_INTERNAL, "HDF Internal error"}, - {DFE_NORESET, "Can not reset this value"}, - {DFE_GENAPP, "Generic application-level error"}, - -/* Generic interface errors */ - {DFE_UNINIT, "Interface was not initialized correctly"}, - {DFE_CANTINIT, "Can't initialize an interface we depend on"}, - {DFE_CANTSHUTDOWN, "Can't shut down an interface we depend on"}, - -/* Dataset errors */ - {DFE_BADDIM, "Negative or zero dimensions specified"}, - {DFE_BADFP, "File contained an illegal floating point number"}, - {DFE_BADDATATYPE, "Unknown or unavailable data type specified"}, - {DFE_BADMCTYPE, "Unknown or unavailable machine type specified"}, - {DFE_BADNUMTYPE, "Unknown or unavailable number type specified"}, - {DFE_BADORDER, "Unknown or illegal array order specified"}, - {DFE_RANGE, "Improper range for attempted access"}, - {DFE_BADCONV, "Don't know how to convert data type"}, - {DFE_BADTYPE, "Incompatible type specified"}, - -/* Compression errors */ - {DFE_BADSCHEME, "Unknown compression scheme specified"}, - {DFE_BADMODEL, "Invalid compression model specified"}, - {DFE_BADCODER, "Invalid compression coder specified"}, - {DFE_MODEL, "Error in modeling layer of compression"}, - {DFE_CODER, "Error in encoding layer of compression"}, - {DFE_CINIT, "Error in encoding initialization"}, - {DFE_CDECODE, "Error in decoding compressed data"}, - {DFE_CENCODE, "Error in encoding compressed data"}, - {DFE_CTERM, "Error in encoding termination"}, - {DFE_CSEEK, "Error seeking in encoded dataset"}, - {DFE_MINIT, "Error in modeling initialization"}, - {DFE_COMPINFO, "Invalid compression header"}, - {DFE_CANTCOMP, "Can't compress an object"}, - {DFE_CANTDECOMP, "Can't de-compress an object"}, - {DFE_NOENCODER, "Encoder not available"}, - -/* Raster errors */ - {DFE_NODIM, "No dimension record associated with image"}, - {DFE_BADRIG, "Error processing a RIG"}, - {DFE_RINOTFOUND, "Can't find raster image"}, - {DFE_BADATTR, "Bad Attribute"}, - {DFE_LUTNOTFOUND, "No palette information for RIG"}, - -/* SDG/NDG errors */ - {DFE_BADTABLE, "The nsdg table is wrong"}, - {DFE_BADSDG, "Error processing an sdg"}, - {DFE_BADNDG, "Error processing an ndg"}, - -/* Vset errors */ - {DFE_VGSIZE, "No more elements will fit in this VGroup"}, - {DFE_VTAB, "Element is not in VSet tables"}, - {DFE_CANTADDELEM, "Cannot add tag/ref to VGroup"}, - {DFE_BADVGNAME, "Cannot set VGroup name"}, - {DFE_BADVGCLASS, "Cannot set VGroup class"}, - -/* Vdata errors */ - {DFE_BADFIELDS, "Unable to parse fields string correctly"}, - {DFE_NOVS, "Could not find specified VS or VG in file"}, - {DFE_SYMSIZE, "Too many symbols in table"}, - {DFE_BADATTACH, "Cannot write to a previously attached VData"}, - {DFE_BADVSNAME, "Cannot set VData name"}, - {DFE_BADVSCLASS, "Cannot set VData class"}, - {DFE_VSWRITE, "Error writing to VData"}, - {DFE_VSREAD, "Error reading from VData"}, - {DFE_FIELDSSET, "Fields already set for vdata"}, - -/* High-level Vdata/Vset errors */ - {DFE_VSCANTCREATE, "Cannot create VData"}, - {DFE_VGCANTCREATE, "Cannot create VGroup"}, - -/* Generic Vdata/Vset errors */ - {DFE_CANTATTACH, "Cannot attach to a VData"}, - {DFE_CANTDETACH, "Cannot detach a VData with access 'w'"}, - -/* bit I/O errors */ - {DFE_BITREAD, "There was a bit-read error"}, - {DFE_BITWRITE, "There was a bit-write error"}, - {DFE_BITSEEK, "There was a bit-seek error"}, - -/* tbbt interface errors */ - {DFE_TBBTINS, "Failed to insert element into tree"}, - -/* bit-vector interface errors */ - {DFE_BVNEW, "Failed to create a bit-vector"}, - {DFE_BVSET, "Failed when setting a bit in a bit-vector"}, - {DFE_BVGET, "Failed when getting a bit in a bit-vector"}, - {DFE_BVFIND, "Failed when finding a bit in a bit-vector"} -}; -#endif /* _H_ERR_MASTER_ */ - -#endif /* __HERR_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/hfile.h b/Utilities/CAI/cai_dll/inc/inc_hdf/hfile.h deleted file mode 100755 index ad7f25e933..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/hfile.h +++ /dev/null @@ -1,1015 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*+ hfile.h - *** Header for hfile.c, routines for low level data element I/O - + */ - -#ifndef HFILE_H -#define HFILE_H - -#include "tbbt.h" -#include "bitvect.h" -#include "atom.h" -#include "linklist.h" -#include "dynarray.h" - -/* Magic cookie for HDF data files */ -#define MAGICLEN 4 /* length */ -#define HDFMAGIC "\016\003\023\001" /* ^N^C^S^A */ - -/* sizes of elements in a file. This is necessary because - the size of variables need not be the same as in the file - (cannot use sizeof) */ -#define DD_SZ 12 /* 2+2+4+4 */ -#define NDDS_SZ 2 -#define OFFSET_SZ 4 - -/* invalid offset & length to indicate a partially defined element -* written to the HDF file i.e. can handle the case where the the -* element is defined but not written out */ -#define INVALID_OFFSET -1 -#define INVALID_LENGTH -1 - - -/* ----------------------------- Version Tags ----------------------------- */ -/* Library version numbers */ - -#define LIBVER_MAJOR 4 -#define LIBVER_MINOR 2 -#define LIBVER_RELEASE 1 -#define LIBVER_STRING "NCSA HDF Version 4.2 Release 1, February 17, 2005" -#define LIBVSTR_LEN 80 /* length of version string */ -#define LIBVER_LEN 92 /* 4+4+4+80 = 92 */ -/* end of version tags */ - -/* -------------------------- File I/O Functions -------------------------- */ -/* FILELIB -- file library to use for file access: 1 stdio, 2 fcntl - default to stdio library i.e. UNIX buffered I/O */ - -#ifndef FILELIB -# define FILELIB UNIXBUFIO /* UNIX buffered I/O is the default */ -#endif /* FILELIB */ - -#if (FILELIB == UNIXBUFIO) -/* using C buffered file I/O routines to access files */ -#include <stdio.h> -typedef FILE *hdf_file_t; -#ifdef VMS -/* For VMS, use "mbc=64" to improve performance */ -# define HI_OPEN(p, a) (((a) & DFACC_WRITE) ? \ - fopen((p), "r+", "mbc=64") : \ - fopen((p), "r", "mbc=64")) -# define HI_CREATE(p) (fopen((p), "w+", "mbc=64")) -#else /* !VMS */ -#if defined SUN && defined (__GNUC__) -# define HI_OPEN(p, a) (((a) & DFACC_WRITE) ? \ - fopen((p), "r+") : fopen((p), "r")) -# define HI_CREATE(p) (fopen((p), "w+")) -#else /* !SUN w/ GNU CC */ -# define HI_OPEN(p, a) (((a) & DFACC_WRITE) ? \ - fopen((p), "rb+") : fopen((p), "rb")) -# define HI_CREATE(p) (fopen((p), "wb+")) -#endif /* !SUN w/ GNU CC */ -#endif /* VMS */ -# define HI_READ(f, b, n) (((size_t)(n) == (size_t)fread((b), 1, (size_t)(n), (f))) ? \ - SUCCEED : FAIL) -# define HI_WRITE(f, b, n) (((size_t)(n) == (size_t)fwrite((b), 1, (size_t)(n), (f))) ? \ - SUCCEED : FAIL) -# define HI_CLOSE(f) (fclose(f)) -# define HI_FLUSH(f) (fflush(f)==0 ? SUCCEED : FAIL) -# define HI_SEEK(f,o) (fseek((f), (long)(o), SEEK_SET)==0 ? SUCCEED : FAIL) -# define HI_SEEK_CUR(f,o) (fseek((f), (long)(o), SEEK_CUR)==0 ? SUCCEED : FAIL) -# define HI_SEEKEND(f) (fseek((f), (long)0, SEEK_END)==0 ? SUCCEED : FAIL) -# define HI_TELL(f) (ftell(f)) -# define OPENERR(f) ((f) == (FILE *)NULL) -#endif /* FILELIB == UNIXBUFIO */ - -#if (FILELIB == UNIXUNBUFIO) -/* using UNIX unbuffered file I/O routines to access files */ -typedef int hdf_file_t; -# define HI_OPEN(p, a) (((a) & DFACC_WRITE) ? \ - open((p), O_RDWR) : open((p), O_RDONLY)) -# define HI_CREATE(p) (open((p), O_RDWR | O_CREAT | O_TRUNC, 0666)) -# define HI_CLOSE(f) (close(f)) -# define HI_FLUSH(f) (SUCCEED) -# define HI_READ(f, b, n) (((n)==read((f), (char *)(b), (n))) ? SUCCEED : FAIL) -# define HI_WRITE(f, b, n) (((n)==write((f), (char *)(b), (n))) ? SUCCEED : FAIL) -# define HI_SEEK(f, o) (lseek((f), (off_t)(o), SEEK_SET)!=(-1) ? SUCCEED : FAIL) -# define HI_SEEKEND(f) (lseek((f), (off_t)0, SEEK_END)!=(-1) ? SUCCEED : FAIL) -# define HI_TELL(f) (lseek((f), (off_t)0, SEEK_CUR)) -# define OPENERR(f) (f < 0) -#endif /* FILELIB == UNIXUNBUFIO */ - -#if (FILELIB == MACIO) -/* using special routines to redirect to Mac Toolkit I/O */ -typedef short hdf_file_t; -# define HI_OPEN(x,y) mopen(x,y) -# define HI_CREATE(name) mopen(name, DFACC_CREATE) -# define HI_CLOSE(x) mclose(x) -# define HI_FLUSH(a) (SUCCEED) -# define HI_READ(a,b,c) mread(a, (char *) b, (int32) c) -# define HI_WRITE(a,b,c) mwrite(a, (char *) b, (int32) c) -# define HI_SEEK(x,y) mlseek(x, (int32 )y, 0) -# define HI_SEEKEND(x) mlseek(x, 0L, 2) -# define HI_TELL(x) mlseek(x,0L,1) -# define DF_OPENERR(f) ((f) == -1) -# define OPENERR(f) (f < 0) -#endif /* FILELIB == MACIO */ - -#ifdef NOT_USED /* Deprecated routines, not supported any more */ -#if (FILELIB == PCIO) -/* using special PC functions to enable reading/writing large chunks */ -typedef FILE *hdf_file_t; -# define HI_OPEN(p, a) (((a) & DFACC_WRITE) ? \ - fopen((p), "rb+") : fopen((p), "rb")) -# define HI_CREATE(p) (fopen((p), "wb+")) -/* Alias the HI_READ and HI_WRITE macros to functions which can handle */ -/* 32-bits of data to read/write */ -# define HI_READ(f, b, n) (((int32)(n) == HDfreadbig((b), (n), (f))) ? \ - SUCCEED : FAIL) -# define HI_WRITE(f, b, n) (((int32)(n) == HDfwritebig((b), (n), (f))) ? \ - SUCCEED : FAIL) -# define HI_CLOSE(f) (fclose(f)) -# define HI_FLUSH(f) (fflush(f)==0 ? SUCCEED : FAIL) -# define HI_SEEK(f,o) (fseek((f), (long)(o), SEEK_SET)==0 ? SUCCEED : FAIL) -# define HI_SEEKEND(f) (fseek((f), (long)0, SEEK_END)==0 ? SUCCEED : FAIL) -# define HI_TELL(f) (ftell(f)) -# define OPENERR(f) ((f) == (FILE *)NULL) -#endif /* FILELIB == PCIO */ - -#if (FILELIB == WINIO) -/* using special MS Windows functions to enable reading/writing large chunks */ -typedef HFILE hdf_file_t; -# define HI_OPEN(p, a) (((a) & DFACC_WRITE) ? \ - _lopen((p), READ_WRITE) : _lopen((p), READ)) -# define HI_CREATE(p) (_lcreat((p), 0)) -/* Alias the HI_READ and HI_WRITE macros to functions which can handle */ -/* 32-bits of data to read/write */ -# define HI_READ(f, b, n) (((int32)(n) == HDfreadbig((b), (n), (f))) ? \ - SUCCEED : FAIL) -# define HI_WRITE(f, b, n) (((int32)(n) == HDfwritebig((b), (n), (f))) ? \ - SUCCEED : FAIL) -# define HI_CLOSE(f) (_lclose(f)) -# define HI_FLUSH(f) (0) -# define HI_SEEK(f, o) (_llseek((f), (long)(o), SEEK_SET)) -# define HI_SEEKEND(f) (_llseek((f), (long)0, SEEK_END)) -# define HI_TELL(f) (_llseek((f),0l,SEEK_CUR)) -# define OPENERR(f) ((f) == (HFILE)HFILE_ERROR) -#endif /* FILELIB == WINIO */ - -#if (FILELIB == WINNTIO) -/* using special Windows NT functions to enable reading/writing large chunks */ -typedef HFILE hdf_file_t; -# define HI_OPEN(p, a) (((a) & DFACC_WRITE) ? \ - _lopen((p), OF_READWRITE) : _lopen((p), OF_READ)) -# define HI_CREATE(p) (_lcreat((p), 0)) -# define HI_READ(f, b, n) (((int32)(n) == _hread((f), (b), (n))) ? \ - SUCCEED : FAIL) -# define HI_WRITE(f, b, n) (((int32)(n) == _hwrite((f), (b), (n))) ? \ - SUCCEED : FAIL) -# define HI_CLOSE(f) (_lclose(f)==0 ? SUCCEED : FAIL) -# define HI_FLUSH(f) (0) -# define HI_SEEK(f, o) (_llseek((f), (long)(o), 0)) -# define HI_SEEKEND(f) (_llseek((f), (long)0, 2)) -# define HI_TELL(f) (_llseek((f),0l,1)) -# define OPENERR(f) ((f) == (HFILE)HFILE_ERROR) -#endif /* FILELIB == WINNTIO */ -#endif /* NOT_USED */ - -#if (FILELIB == PAGEBUFIO) -#include "fmpio.h" -/* using page buffered file I/O routines to access files */ -typedef MPFILE *hdf_file_t; -# define HI_OPEN(p, a) (MPopen((p), (a))) -# define HI_CREATE(p) (MPopen((p), DFACC_CREATE)) -# define HI_CLOSE(f) (MPclose(f)) -# define HI_FLUSH(f) (MPflush(f)) -# define HI_READ(f, b, n) (MPread((f), (char *)(b), (n))) -# define HI_WRITE(f, b, n) (MPwrite((f), (char *)(b), (n))) -# define HI_SEEK(f, o) (MPseek((f), (off_t)(o), SEEK_SET)) -# define HI_SEEKEND(f) (MPseek((f), (off_t)0, SEEK_END)) -# define HI_TELL(f) (MPseek((f), (off_t)0, SEEK_CUR)) -# define OPENERR(f) ((f) == (MPFILE *)NULL) -#endif /* FILELIB == PAGEBUFIO */ - -/* ----------------------- Internal Data Structures ----------------------- */ -/* The internal structure used to keep track of the files opened: an - array of filerec_t structures, each has a linked list of ddblock_t. - Each ddblock_t struct points to an array of dd_t structs. - - File Header(4 bytes) - =================== - <--- 32 bits -----> - ------------------ - |HDF magic number | - ------------------ - - HDF magic number - 0x0e031301 (Hexadecimal) - - Data Descriptor(DD - 12 bytes) - ============================== - <- 16 bits -> <- 16 bits -> <- 32 bits -> <- 32 bits -> - -------------------------------------------------------- - | Tag | reference | Offset | Length | - | | number | | | - -------------------------------------------------------- - \____________/ - V - tag/ref (unique data indentifier in file) - - Tag -- identifies the type of data, 16 bit unsigned integer whose - value ranges from 1 - 65535. Tags are assigned by NCSA. - The HDF tag space is divided as follows based on the 2 highest bits: - - 00: NCSA reserved ordinary tags - 01: NCSA reserved special tags(i.e. regular tags made into - linked-block, external, - compressed or chunked.) - 10, 11: User tags. - - Current tag assingments are: - 00001 - 32767 - reserved for NCSA use - 00001 - 16383 - NCSA regular tags - 16384 - 32767 - NCSA special tags - 32768 - 64999 - user definable - 65000 - 65535 - reserved for expansion of format - - Refererence number - 16 bit unsigned integer whose assignment is not - gauranteed to be consecutive. Provides a way to distinguish - elements with the same tag in the file. - - Offset - Specifies the byte offset of the data element from the - beginning of the file - 32 bit unsigned integer - - Length - Indicates the byte length of the data element - 32 bit unsigned integer - - Data Descriptor Header(DDH - 6 bytes) - ==================================== - <- 16 bits -> <- 32 bits -> - ----------------------------- - | Block Size | Next Block | - ----------------------------- - - Block Size - Indicates the number of DD's in the DD Block, - 16 bit unsigned integer value - Next Block - Gives the offset of the next DD Block. The last DD Block has - a ZERO(0) in the "Next Block" field in the DDH. - 32 bit unsigned integer value - - Data Descriptor Block(DDB - variable size) - ========================================== - <- DD Header -> <--------------- DD's ---------------------> - --------------------------------------------------------...- - |Block | Next | DD | DD | DD | DD | DD | DD | DD | DD |...| - |Size | Block | | | | | | | | | | - --------------------------------------------------------...- - <-------------------------- DD Block ----------------------> - - Note: default number of DD's in a DD Block is 16 - - HDF file layout - ============================= - (one example) - --------------------------------------------------------------------- - | FH | DD Block | Data | DD Block | Data | DD Block | Data | ..... - --------------------------------------------------------------------- - -*/ - -/* record of each data decsriptor */ -typedef struct dd_t - { - uint16 tag; /* Tag number of element i.e. type of data */ - uint16 ref; /* Reference number of element */ - int32 length; /* length of data element */ - int32 offset; /* byte offset of data element from */ - struct ddblock_t *blk; /* Pointer to the block this dd is in */ - } /* beginning of file */ -dd_t; - -/* version tags */ -typedef struct version_t - { - uint32 majorv; /* major version number */ - uint32 minorv; /* minor version number */ - uint32 release; /* release number */ - char string[LIBVSTR_LEN + 1]; /* optional text description, len 80+1 */ - int16 modified; /* indicates file was modified */ - } -version_t; - -/* record of a block of data descriptors, mirrors structure of a HDF file. */ -typedef struct ddblock_t - { - uintn dirty; /* boolean: should this DD block be flushed? */ - int32 myoffset; /* offset of this DD block in the file */ - int16 ndds; /* number of dd's in this block */ - int32 nextoffset; /* offset to the next ddblock in the file */ - struct filerec_t *frec; /* Pointer to the filerec this block is in */ - struct ddblock_t *next; /* pointer to the next ddblock in memory */ - struct ddblock_t *prev; /* Pointer to previous ddblock. */ - struct dd_t *ddlist; /* pointer to array of dd's */ - } -ddblock_t; - -/* Tag tree node structure */ -typedef struct tag_info_str - { - uint16 tag; /* tag value for this node */ - /* Needs to be first in this structure */ - bv_ptr b; /* bit-vector to keep track of which refs are used */ - dynarr_p d; /* dynarray of the refs for this tag */ - }tag_info; - -/* For determining what the last file operation was */ -typedef enum - { - H4_OP_UNKNOWN = 0, /* Don't know what the last operation was (after fopen frex) */ - H4_OP_SEEK, /* Last operation was a seek */ - H4_OP_WRITE, /* Last operation was a write */ - H4_OP_READ /* Last operation was a read */ - } -fileop_t; - -/* File record structure */ -typedef struct filerec_t - { - char *path; /* name of file */ - hdf_file_t file; /* either file descriptor or pointer */ - uint16 maxref; /* highest ref in this file */ - intn access; /* access mode */ - intn refcount; /* reference count / times opened */ - intn attach; /* number of access elts attached */ - intn version_set; /* version tag stuff */ - version_t version; /* file version info */ - - /* Seek caching info */ - int32 f_cur_off; /* Current location in the file */ - fileop_t last_op; /* the last file operation performed */ - - /* DD block caching info */ - intn cache; /* boolean: whether caching is on */ - intn dirty; /* boolean: if dd list needs to be flushed */ - int32 f_end_off; /* offset of the end of the file */ - - /* DD list pointers */ - struct ddblock_t *ddhead; /* head of ddblock list */ - struct ddblock_t *ddlast; /* end of ddblock list */ - - /* NULL DD pointers (for fast lookup of DFTAG_NULL) */ - struct ddblock_t *ddnull; /* location of last ddblock with a DFTAG_NULL */ - int32 ddnull_idx; /* offset of the last location with DFTAG_NULL */ - - /* tag tree for file */ - TBBT_TREE *tag_tree; /* TBBT of the tags in the file */ - - /* annotation stuff for file */ - intn an_num[4]; /* Holds number of annotations found of each type */ - TBBT_TREE *an_tree[4]; /* tbbt trees for each type of annotation in file - * i.e. file/data labels and descriptions. - * This is done for faster searching of annotations - * of a particular type. */ - } -filerec_t; - -/* bits for filerec_t 'dirty' flag */ -#define DDLIST_DIRTY 0x01 /* mark whether to flush dirty DD blocks */ -#define FILE_END_DIRTY 0x02 /* indicate that the file needs to be extended */ - -/* Each access element is associated with a tag/ref to keep track of - the dd it is pointing at. To facilitate searching for next dd's, - instead of pointing directly to the dd, we point to the ddblock and - index into the ddlist of that ddblock. */ -typedef struct accrec_t - { - /* Flags for this access record */ - intn appendable; /* whether appends to the data are allowed */ - intn special; /* special element ? */ - intn new_elem; /* is a new element (i.e. no length set yet) */ - int32 block_size; /* size of the blocks for linked-block element*/ - int32 num_blocks; /* number blocks in the linked-block element */ - uint32 access; /* access codes */ - uintn access_type; /* I/O access type: serial/parallel/... */ - int32 file_id; /* id of attached file */ - atom_t ddid; /* DD id for the DD attached to */ - int32 posn; /* seek position with respect to start of element */ - void * special_info; /* special element info? */ - struct funclist_t *special_func; /* ptr to special function? */ - struct accrec_t *next; /* for free-list linking */ - } -accrec_t; - -#ifdef HFILE_MASTER -/* Pointer to the access record node free list */ -static accrec_t *accrec_free_list=NULL; -#endif /* HFILE_MASTER */ - -/* this type is returned to applications programs or other special - interfaces when they need to know information about a given - special element. This is all information that would not be returned - via Hinquire(). This should probably be a union of structures. */ -typedef struct sp_info_block_t - { - int16 key; /* type of special element this is */ - - /* external elements */ - int32 offset; /* offset in the file */ - char *path; /* file name - should not be freed by user */ - - /* linked blocks */ - int32 first_len; /* length of first block */ - int32 block_len; /* length of standard block */ - int32 nblocks; /* number of blocks per chunk */ - - /* compressed elements */ - int32 comp_type; /* compression type */ - int32 model_type; /* model type */ - int32 comp_size; /* size of compressed information */ - - /* variable-length linked blocks */ - int32 min_block; /* the minimum block size */ - - /* Chunked elements */ - int32 chunk_size; /* logical size of chunks */ - int32 ndims; /* number of dimensions */ - int32 *cdims; /* array of chunk lengths for each dimension */ - - /* Buffered elements */ - int32 buf_aid; /* AID of element buffered */ - } -sp_info_block_t; - -/* a function table record for accessing special data elements. - special data elements of a key could be accessed through the list - of functions in array pointed to by tab. */ -typedef struct funclist_t - { - int32 (*stread) (accrec_t * rec); - int32 (*stwrite) (accrec_t * rec); - int32 (*seek) (accrec_t * access_rec, int32 offset, intn origin); - int32 (*inquire) (accrec_t * access_rec, int32 *pfile_id, - uint16 *ptag, uint16 *pref, int32 *plength, - int32 *poffset, int32 *pposn, int16 *paccess, - int16 *pspecial); - int32 (*read) (accrec_t * access_rec, int32 length, void * data); - int32 (*write) (accrec_t * access_rec, int32 length, const void * data); - intn (*endaccess) (accrec_t * access_rec); - int32 (*info) (accrec_t * access_rec, sp_info_block_t * info); - int32 (*reset) (accrec_t * access_rec, sp_info_block_t * info); - } -funclist_t; - -typedef struct functab_t - { - int16 key; /* the key for this type of special elt */ - funclist_t *tab; /* table of accessing functions */ - } -functab_t; - -/* ---------------------- ID Types and Manipulation ----------------------- */ -/* each id, what ever the type, will be represented with a 32-bit word, - the most-significant 16 bits is a number unique for type. The less- - significant 16 bits is an id unique to each type; in this, we use the - internal slot number. */ - -#define FIDTYPE 1 -#define AIDTYPE 2 -#define GROUPTYPE 3 -#define SDSTYPE 4 -#define DIMTYPE 5 -#define CDFTYPE 6 -#define VGIDTYPE 8 /* also defined in vg.h for Vgroups */ -#define VSIDTYPE 9 /* also defined in vg.h for Vsets */ -#define BITTYPE 10 /* For bit-accesses */ -#define GRIDTYPE 11 /* for GR access */ -#define RIIDTYPE 12 /* for RI access */ - -#define BADFREC(r) ((r)==NULL || (r)->refcount==0) - -/* --------------------------- Special Elements --------------------------- */ -/* The HDF tag space is divided as follows based on the 2 highest bits: - 00: NCSA reserved ordinary tags - 01: NCSA reserved special tags(e.g. linked-block, external, compressed,..) - 10, 11: User tags. - - It is relatively cheap to operate with special tags within the NCSA - reserved tags range. For users to specify special tags and their - corresponding ordinary tag, the pair has to be added to the - special_table in hfile.c and SPECIAL_TABLE must be defined. */ - -#ifdef SPECIAL_TABLE -#define BASETAG(t) (HDbase_tag(t)) -#define SPECIALTAG(t) (HDis_special_tag(t)) -#define MKSPECIALTAG(t) (HDmake_special_tag(t)) -#else -/* This macro converts a (potentially) special tag into a normal tag */ -#define BASETAG(t) (uint16)((~(t) & 0x8000) ? ((t) & ~0x4000) : (t)) -/* This macro checks if a tag is special */ -#define SPECIALTAG(t) (uint16)((~(t) & 0x8000) && ((t) & 0x4000)) -/* This macro (potentially) converts a regular tag into a special tag */ -#define MKSPECIALTAG(t) (uint16)((~(t) & 0x8000) ? ((t) | 0x4000) : DFTAG_NULL) -#endif /*SPECIAL_TABLE */ - -/* -------------------------- H-Layer Prototypes -------------------------- */ -/* - ** Functions to get information of special elt from other access records. - ** defined in hfile.c - ** These should really be HD... routines, but they are only used within - ** the H-layer... - */ - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - - HDFLIBAPI accrec_t *HIget_access_rec - (void); - - HDFLIBAPI void HIrelease_accrec_node(accrec_t *acc); - - HDFLIBAPI void * HIgetspinfo - (accrec_t * access_rec); - - HDFLIBAPI intn HPcompare_filerec_path - (const void * obj, const void * key); - - HDFLIBAPI intn HPcompare_accrec_tagref - (const void * rec1, const void * rec2); - - HDFLIBAPI int32 HPgetdiskblock - (filerec_t * file_rec, int32 block_size, intn moveto); - - HDFLIBAPI intn HPfreediskblock - (filerec_t * file_rec, int32 block_offset, int32 block_size); - - HDFLIBAPI int32 HDcheck_empty - (int32 file_id, uint16 tag, uint16 ref, intn *emptySDS); - - HDFLIBAPI int32 HDget_special_info - (int32 access_id, sp_info_block_t * info_block); - - HDFLIBAPI int32 HDset_special_info - (int32 access_id, sp_info_block_t * info_block); - - HDFLIBAPI intn HP_read - (filerec_t *file_rec,void * buf,int32 bytes); - - HDFLIBAPI intn HPseek - (filerec_t *file_rec,int32 offset); - - HDFLIBAPI intn HP_write - (filerec_t *file_rec,const void * buf,int32 bytes); - - HDFLIBAPI intn tagcompare - (void * k1, void * k2, intn cmparg); - - HDFLIBAPI VOID tagdestroynode - (void * n); - -/* - ** from hblocks.c - */ - HDFLIBAPI int32 HLPstread - (accrec_t * access_rec); - - HDFLIBAPI int32 HLPstwrite - (accrec_t * access_rec); - - HDFLIBAPI int32 HLPseek - (accrec_t * access_rec, int32 offset, int origin); - - HDFLIBAPI int32 HLPread - (accrec_t * access_rec, int32 length, void * data); - - HDFLIBAPI int32 HLPwrite - (accrec_t * access_rec, int32 length, const void * data); - - HDFLIBAPI int32 HLPinquire - (accrec_t * access_rec, int32 *pfile_id, uint16 *ptag, uint16 *pref, - int32 *plength, int32 *poffset, int32 *pposn, int16 *paccess, - int16 *pspecial); - - HDFLIBAPI intn HLPendaccess - (accrec_t * access_rec); - - HDFLIBAPI int32 HLPcloseAID - (accrec_t * access_rec); - - HDFLIBAPI int32 HLPinfo - (accrec_t * access_rec, sp_info_block_t * info_block); - -/* - ** from hextelt.c - */ - HDFLIBAPI int32 HXPstread - (accrec_t * rec); - - HDFLIBAPI int32 HXPstwrite - (accrec_t * rec); - - HDFLIBAPI int32 HXPseek - (accrec_t * access_rec, int32 offset, int origin); - - HDFLIBAPI int32 HXPread - (accrec_t * access_rec, int32 length, void * data); - - HDFLIBAPI int32 HXPwrite - (accrec_t * access_rec, int32 length, const void * data); - - HDFLIBAPI int32 HXPinquire - (accrec_t * access_rec, int32 *pfile_id, uint16 *ptag, uint16 *pref, - int32 *plength, int32 *poffset, int32 *pposn, int16 *paccess, - int16 *pspecial); - - HDFLIBAPI intn HXPendaccess - (accrec_t * access_rec); - - HDFLIBAPI int32 HXPcloseAID - (accrec_t * access_rec); - - HDFLIBAPI int32 HXPinfo - (accrec_t * access_rec, sp_info_block_t * info_block); - - HDFLIBAPI int32 HXPreset - (accrec_t * access_rec, sp_info_block_t * info_block); - - HDFLIBAPI intn HXPsetaccesstype - (accrec_t * access_rec); - - HDFLIBAPI intn HXPshutdown - (void); - -/* - ** from hcomp.c - */ - - HDFLIBAPI int32 HCPstread - (accrec_t * rec); - - HDFLIBAPI int32 HCPstwrite - (accrec_t * rec); - - HDFLIBAPI int32 HCPseek - (accrec_t * access_rec, int32 offset, int origin); - - HDFLIBAPI int32 HCPinquire - (accrec_t * access_rec, int32 *pfile_id, uint16 *ptag, uint16 *pref, - int32 *plength, int32 *poffset, int32 *pposn, int16 *paccess, - int16 *pspecial); - - HDFLIBAPI int32 HCPread - (accrec_t * access_rec, int32 length, void * data); - - HDFLIBAPI int32 HCPwrite - (accrec_t * access_rec, int32 length, const void * data); - - HDFLIBAPI intn HCPendaccess - (accrec_t * access_rec); - - HDFLIBAPI int32 HCPcloseAID - (accrec_t * access_rec); - - HDFLIBAPI int32 HCPinfo - (accrec_t * access_rec, sp_info_block_t * info_block); - - HDFLIBAPI int32 get_comp_len - (accrec_t* access_rec); - -/* - ** from hchunks.c - should be the same as found in 'hchunks.h' - */ -#include "hchunks.h" - -#if defined (MAC) || defined (macintosh) || defined (SYMANTEC_C) - HDFLIBAPI hdf_file_t mopen - (char *filename, intn access); - - HDFLIBAPI int32 mclose - (hdf_file_t rn); - - HDFLIBAPI int32 mlseek - (hdf_file_t rn, int32 n, intn m); - - HDFLIBAPI int32 mread - (hdf_file_t rn, char *buf, int32 n); - - HDFLIBAPI int32 mwrite - (hdf_file_t rn, char *buf, int32 n); - HDFLIBAPI intn mstat - (char *path); - -#endif /* macintosh */ - -/* - ** from hbuffer.c - */ - - HDFLIBAPI int32 HBPstread - (accrec_t * rec); - - HDFLIBAPI int32 HBPstwrite - (accrec_t * rec); - - HDFLIBAPI int32 HBPseek - (accrec_t * access_rec, int32 offset, int origin); - - HDFLIBAPI int32 HBPinquire - (accrec_t * access_rec, int32 *pfile_id, uint16 *ptag, uint16 *pref, - int32 *plength, int32 *poffset, int32 *pposn, int16 *paccess, - int16 *pspecial); - - HDFLIBAPI int32 HBPread - (accrec_t * access_rec, int32 length, void * data); - - HDFLIBAPI int32 HBPwrite - (accrec_t * access_rec, int32 length, const void * data); - - HDFLIBAPI intn HBPendaccess - (accrec_t * access_rec); - - HDFLIBAPI int32 HBPcloseAID - (accrec_t * access_rec); - - HDFLIBAPI int32 HBPinfo - (accrec_t * access_rec, sp_info_block_t * info_block); - -/* - ** from hcompri.c - */ - - HDFLIBAPI int32 HRPstread - (accrec_t * rec); - - HDFLIBAPI int32 HRPstwrite - (accrec_t * rec); - - HDFLIBAPI int32 HRPseek - (accrec_t * access_rec, int32 offset, int origin); - - HDFLIBAPI int32 HRPinquire - (accrec_t * access_rec, int32 *pfile_id, uint16 *ptag, uint16 *pref, - int32 *plength, int32 *poffset, int32 *pposn, int16 *paccess, - int16 *pspecial); - - HDFLIBAPI int32 HRPread - (accrec_t * access_rec, int32 length, void * data); - - HDFLIBAPI int32 HRPwrite - (accrec_t * access_rec, int32 length, const void * data); - - HDFLIBAPI intn HRPendaccess - (accrec_t * access_rec); - - HDFLIBAPI int32 HRPcloseAID - (accrec_t * access_rec); - - HDFLIBAPI int32 HRPinfo - (accrec_t * access_rec, sp_info_block_t * info_block); - -/* - ** from hfiledd.c - */ -/****************************************************************************** - NAME - HTPstart - Initialize the DD list in memory - - DESCRIPTION - Reads the DD blocks from disk and creates the in-memory structures for - handling them. This routine should only be called once for a given - file and HTPend should be called when finished with the DD list (i.e. - when the file is being closed). - - RETURNS - Returns SUCCEED if successful and FAIL otherwise - -*******************************************************************************/ -intn HTPstart(filerec_t *file_rec /* IN: File record to store info in */ -); - -/****************************************************************************** - NAME - HTPinit - Create a new DD list in memory - - DESCRIPTION - Creates a new DD list in memory for a newly created file. This routine - should only be called once for a given file and HTPend should be called - when finished with the DD list (i.e. when the file is being closed). - - RETURNS - Returns SUCCEED if successful and FAIL otherwise - -*******************************************************************************/ -intn HTPinit(filerec_t *file_rec, /* IN: File record to store info in */ - int16 ndds /* IN: # of DDs to store in each block */ -); - -/****************************************************************************** - NAME - HTPsync - Flush the DD list in memory - - DESCRIPTION - Syncronizes the in-memory copy of the DD list with the copy on disk by - writing out the DD blocks which have changed to disk. - - RETURNS - Returns SUCCEED if successful and FAIL otherwise - -*******************************************************************************/ -intn HTPsync(filerec_t *file_rec /* IN: File record to store info in */ -); - -/****************************************************************************** - NAME - HTPend - Terminate the DD list in memory - - DESCRIPTION - Terminates access to the DD list in memory, writing the DD blocks out to - the disk (if they've changed). After this routine is called, no further - access to tag/refs (or essentially any other HDF objects) can be performed - on the file. - - RETURNS - Returns SUCCEED if successful and FAIL otherwise - -*******************************************************************************/ -intn HTPend(filerec_t *file_rec /* IN: File record to store info in */ -); - -/****************************************************************************** - NAME - HTPcreate - Create (and attach to) a tag/ref pair - - DESCRIPTION - Creates a new tag/ref pair in memory and inserts the tag/ref pair into the - DD list to be written out to disk. This routine returns a DD id which can - be used in the other tag/ref routines to modify the DD. - - RETURNS - Returns DD id if successful and FAIL otherwise - -*******************************************************************************/ -atom_t HTPcreate(filerec_t *file_rec, /* IN: File record to store info in */ - uint16 tag, /* IN: Tag to create */ - uint16 ref /* IN: ref to create */ -); - -/****************************************************************************** - NAME - HTPselect - Attach to an existing tag/ref pair - - DESCRIPTION - Attaches to an existing tag/ref pair. This routine returns a DD id which - can be used in the other tag/ref routines to modify the DD. - - RETURNS - Returns DD id if successful and FAIL otherwise - -*******************************************************************************/ -atom_t HTPselect(filerec_t *file_rec, /* IN: File record to store info in */ - uint16 tag, /* IN: Tag to select */ - uint16 ref /* IN: ref to select */ -); - -/****************************************************************************** - NAME - HTPendaccess - End access to an existing tag/ref pair - - DESCRIPTION - Ends access to an existing tag/ref pair. Any further access to the tag/ref - pair may result in incorrect information being recorded about the DD in - memory or on disk. - - RETURNS - Returns SUCCEED if successful and FAIL otherwise - -*******************************************************************************/ -intn HTPendaccess(atom_t ddid /* IN: DD id to end access to */ -); - -/****************************************************************************** - NAME - HTPdelete - Delete an existing tag/ref pair - - DESCRIPTION - Deletes a tag/ref from the file. Also ends access to the tag/ref pair. - Any further access to the tag/ref pair may result in incorrect information - being recorded about the DD in memory or on disk. - - RETURNS - Returns SUCCEED if successful and FAIL otherwise - -*******************************************************************************/ -intn HTPdelete(atom_t ddid /* IN: DD id to delete */ -); - -/****************************************************************************** - NAME - HTPupdate - Change the offset or length of an existing tag/ref pair - - DESCRIPTION - Updates a tag/ref in the file, allowing the length and/or offset to be - modified. Note: "INVALID_OFFSET" & "INVALID_LENGTH" are used to indicate - that the length or offset (respectively) is unchanged. - - RETURNS - Returns SUCCEED if successful and FAIL otherwise - -*******************************************************************************/ -intn HTPupdate(atom_t ddid, /* IN: DD id to update */ - int32 new_off, /* IN: new offset for DD */ - int32 new_len /* IN: new length for DD */ -); - -/****************************************************************************** - NAME - HTPinquire - Get the DD information for a DD (i.e. tag/ref/offset/length) - - DESCRIPTION - Get the DD information for a DD id from the DD block. Passing NULL for - any parameter does not try to update that parameter. - - RETURNS - Returns SUCCEED if successful and FAIL otherwise - -*******************************************************************************/ -intn HTPinquire(atom_t ddid, /* IN: DD id to inquire about */ - uint16 *tag, /* IN: tag of DD */ - uint16 *ref, /* IN: ref of DD */ - int32 *off, /* IN: offset of DD */ - int32 *len /* IN: length of DD */ -); - -/****************************************************************************** - NAME - HTPis_special - Check if a DD id is associated with a special tag - - DESCRIPTION - Checks if the tag for the DD id is a special tag. - - RETURNS - Returns TRUE(1)/FALSE(0) if successful and FAIL otherwise - -*******************************************************************************/ -intn HTPis_special(atom_t ddid /* IN: DD id to inquire about */ -); - -/****************************************************************************** - NAME - HTPdump_dds -- Dump out the dd information for a file - - DESCRIPTION - Prints out all the information (that you could _ever_ want to know) about - the dd blocks and dd list for a file. - - RETURNS - returns SUCCEED (0) if successful and FAIL (-1) if failed. - -*******************************************************************************/ -intn HTPdump_dds(int32 file_id, /* IN: file ID of HDF file to dump info for */ - FILE *fout /* IN: file stream to output to */ -); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -/* #define DISKBLOCK_DEBUG */ -#ifdef DISKBLOCK_DEBUG - -#ifndef HFILE_MASTER -extern -#endif /* HFILE_MASTER */ -const uint8 diskblock_header[4] -#ifdef HFILE_MASTER -={0xde, 0xad, 0xbe, 0xef} -#endif /* HFILE_MASTER */ -; - -#ifndef HFILE_MASTER -extern -#endif /* HFILE_MASTER */ -const uint8 diskblock_tail[4] -#ifdef HFILE_MASTER -={0xfe, 0xeb, 0xda, 0xed} -#endif /* HFILE_MASTER */ -; -#define DISKBLOCK_HSIZE sizeof(diskblock_header) -#define DISKBLOCK_TSIZE sizeof(diskblock_tail) - -#endif /* DISKBLOCK_DEBUG */ - -#endif /* HFILE_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/hkit.h b/Utilities/CAI/cai_dll/inc/inc_hdf/hkit.h deleted file mode 100755 index bea56f142e..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/hkit.h +++ /dev/null @@ -1,171 +0,0 @@ - -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*+ hkit.h - *** private header file for hkit routines - + */ - -#ifndef __HKIT_H -#include "hdf.h" -#include "hfile.h" - -/* tag_messages is the list of tag descriptions in the system, kept as - tag-description pairs. To look up a description, a linear search is - required but efficiency should be okay. */ -typedef struct tag_descript_t - { - uint16 tag; /* tag for description ? */ - const char *desc; /* tag description ? */ - const char *name; /* tag name ? */ - } -tag_descript_t; - -/* stringizing macro */ -#if defined MIPSEL | defined KNRSUN | defined __SUNPRO_C -#define string(x) #x -#else -#define string(x) "x" -#endif /* MIPSEL */ - -/* NOTE: - * Please keep tag descriptions <= 30 characters - a - * lot of pretty-printing code depends on it. - */ -PRIVATE const tag_descript_t tag_descriptions[] = -{ -/* low-level set */ - {DFTAG_NULL, string(DFTAG_NULL), "No Data"}, - {DFTAG_LINKED, string(DFTAG_LINKED), "Linked Blocks Indicator"}, - {DFTAG_VERSION, string(DFTAG_VERSION), "Version Descriptor"}, - {DFTAG_COMPRESSED, string(DFTAG_COMPRESSED), "Compressed Data Indicator"}, - {DFTAG_CHUNK, string(DFTAG_CHUNK), "Data Chunk"}, - -/* utility set */ - {DFTAG_FID, string(DFTAG_FID), "File Identifier"}, - {DFTAG_FD, string(DFTAG_FD), "File Description"}, - {DFTAG_TID, string(DFTAG_TID), "Tag Identifier"}, - {DFTAG_TD, string(DFTAG_TD), "Tag Description"}, - {DFTAG_DIL, string(DFTAG_DIL), "Data Id Label"}, - {DFTAG_DIA, string(DFTAG_DIA), "Data Id Annotation"}, - {DFTAG_NT, string(DFTAG_NT), "Number type"}, - {DFTAG_MT, string(DFTAG_MT), "Machine type"}, - {DFTAG_FREE, string(DFTAG_FREE), "Free space"}, - - /* raster-8 Tags */ - {DFTAG_ID8, string(DFTAG_ID8), "Image Dimensions-8"}, - {DFTAG_IP8, string(DFTAG_IP8), "Image Palette-8"}, - {DFTAG_RI8, string(DFTAG_RI8), "Raster Image-8"}, - {DFTAG_CI8, string(DFTAG_CI8), "RLE Compressed Image-8"}, - {DFTAG_II8, string(DFTAG_II8), "Imcomp Image-8"}, - - /* Raster Image Tags */ - {DFTAG_ID, string(DFTAG_ID), "Image Dimensions"}, - {DFTAG_LUT, string(DFTAG_LUT), "Image Palette"}, - {DFTAG_RI, string(DFTAG_RI), "Raster Image Data"}, - {DFTAG_CI, string(DFTAG_CI), "Compressed Image"}, - {DFTAG_RIG, string(DFTAG_RIG), "Raster Image Group"}, - {DFTAG_LD, string(DFTAG_LD), "Palette Dimension"}, - {DFTAG_MD, string(DFTAG_MD), "Matte Dimension"}, - {DFTAG_MA, string(DFTAG_MA), "Matte Data"}, - {DFTAG_CCN, string(DFTAG_CCN), "Color Correction"}, - {DFTAG_CFM, string(DFTAG_CFM), "Color Format"}, - {DFTAG_AR, string(DFTAG_AR), "Aspect Ratio"}, - {DFTAG_DRAW, string(DFTAG_DRAW), "Sequenced images"}, - {DFTAG_RUN, string(DFTAG_RUN), "Runable program / script"}, - {DFTAG_XYP, string(DFTAG_XYP), "X-Y position"}, - {DFTAG_MTO, string(DFTAG_MTO), "M/c-Type override"}, - - /* Tektronix */ - {DFTAG_T14, string(DFTAG_T14), "TEK 4014 Data"}, - {DFTAG_T105, string(DFTAG_T105), "TEK 4105 data"}, - - /* Scientific / Numeric Data Sets */ - {DFTAG_SDG, string(DFTAG_SDG), "Scientific Data Group"}, - {DFTAG_SDD, string(DFTAG_SDD), "SciData dimension record"}, - {DFTAG_SD, string(DFTAG_SD), "Scientific Data"}, - {DFTAG_SDS, string(DFTAG_SDS), "SciData scales"}, - {DFTAG_SDL, string(DFTAG_SDL), "SciData labels"}, - {DFTAG_SDU, string(DFTAG_SDU), "SciData units"}, - {DFTAG_SDF, string(DFTAG_SDF), "SciData formats"}, - {DFTAG_SDM, string(DFTAG_SDM), "SciData max/min"}, - {DFTAG_SDC, string(DFTAG_SDC), "SciData coordsys"}, - {DFTAG_SDT, string(DFTAG_SDT), "Transpose"}, - {DFTAG_SDLNK, string(DFTAG_SDLNK), "Links related to the dataset"}, - {DFTAG_NDG, string(DFTAG_NDG), "Numeric Data Group"}, - {DFTAG_CAL, string(DFTAG_CAL), "Calibration information"}, - {DFTAG_FV, string(DFTAG_FV), "Fill value information"}, - - /* V Group Tags */ - {DFTAG_VG, string(DFTAG_VG), "Vgroup"}, - {DFTAG_VH, string(DFTAG_VH), "Vdata"}, - {DFTAG_VS, string(DFTAG_VS), "Vdata Storage"}, - - /* Compression Schemes */ - {DFTAG_RLE, string(DFTAG_RLE), "Run Length Encoding"}, - {DFTAG_IMCOMP, string(DFTAG_IMCOMP), "IMCOMP Encoding"}, - {DFTAG_JPEG, string(DFTAG_JPEG), "24-bit JPEG Encoding"}, - {DFTAG_GREYJPEG, string(DFTAG_GREYJPEG), "8-bit JPEG Encoding"}, - {DFTAG_JPEG5, string(DFTAG_JPEG5), "24-bit JPEG Encoding"}, - {DFTAG_GREYJPEG5, string(DFTAG_GREYJPEG5), "8-bit JPEG Encoding"} - -}; - -/* nt_message is the list of NT descriptions in the system, kept as - NT-description pairs. To look up a description, a linear search is - required but efficiency should be okay. */ -typedef struct nt_descript_t - { - int32 nt; /* nt for description */ - const char *name; /* nt name */ - const char *desc; /* nt description */ - } -nt_descript_t; - -PRIVATE const nt_descript_t nt_descriptions[] = -{ - -/* Masks for types */ - {DFNT_NATIVE, string(DFNT_NATIVE), "native format"}, - {DFNT_CUSTOM, string(DFNT_CUSTOM), "custom format"}, - {DFNT_LITEND, string(DFNT_LITEND), "little-endian format"}, - - {DFNT_NONE, string(DFNT_NONE), "number-type not set"}, - -/* Floating point types */ - {DFNT_FLOAT32, string(DFNT_FLOAT32), "32-bit floating point"}, - {DFNT_FLOAT64, string(DFNT_FLOAT64), "64-bit floating point"}, - {DFNT_FLOAT128, string(DFNT_FLOAT128), "128-bit floating point"}, - -/* Integer types */ - {DFNT_INT8, string(DFNT_INT8), "8-bit signed integer"}, - {DFNT_UINT8, string(DFNT_UINT8), "8-bit unsigned integer"}, - {DFNT_INT16, string(DFNT_INT16), "16-bit signed integer"}, - {DFNT_UINT16, string(DFNT_UINT16), "16-bit unsigned integer"}, - {DFNT_INT32, string(DFNT_INT32), "32-bit signed integer"}, - {DFNT_UINT32, string(DFNT_UINT32), "32-bit unsigned integer"}, - {DFNT_INT64, string(DFNT_INT64), "64-bit signed integer"}, - {DFNT_UINT64, string(DFNT_UINT64), "64-bit unsigned integer"}, - {DFNT_INT128, string(DFNT_INT128), "128-bit signed integer"}, - {DFNT_UINT128, string(DFNT_UINT128), "128-bit unsigned integer"}, - -/* Character types */ - {DFNT_CHAR8, string(DFNT_CHAR8), "8-bit signed char"}, - {DFNT_UCHAR8, string(DFNT_UCHAR8), "8-bit unsigned char"}, - {DFNT_CHAR16, string(DFNT_CHAR16), "16-bit signed char"}, - {DFNT_UCHAR16, string(DFNT_UCHAR16), "16-bit unsigned char"} - -}; - -#endif /* __HKIT_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/hntdefs.h b/Utilities/CAI/cai_dll/inc/inc_hdf/hntdefs.h deleted file mode 100755 index 64a2770985..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/hntdefs.h +++ /dev/null @@ -1,275 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*+ hnt.h - *** This file contains all the number-type definitions for HDF - + */ - -#ifndef _HNT_H -#define _HNT_H - -/* masks for types */ -#define DFNT_HDF 0x00000000 /* standard HDF format */ -#define DFNT_NATIVE 0x00001000 /* native format */ -#define DFNT_CUSTOM 0x00002000 /* custom format */ -#define DFNT_LITEND 0x00004000 /* Little Endian format */ -#define DFNT_MASK 0x00000fff /* format mask */ - -/* type info codes */ - -#define DFNT_NONE 0 /* indicates that number type not set */ -#define DFNT_QUERY 0 /* use this code to find the current type */ -#define DFNT_VERSION 1 /* current version of NT info */ - -#define DFNT_FLOAT32 5 -#define DFNT_FLOAT 5 /* For backward compat; don't use */ -#define DFNT_FLOAT64 6 -#define DFNT_DOUBLE 6 /* For backward compat; don't use */ -#define DFNT_FLOAT128 7 /* No current plans for support */ - -#define DFNT_INT8 20 -#define DFNT_UINT8 21 - -#define DFNT_INT16 22 -#define DFNT_UINT16 23 -#define DFNT_INT32 24 -#define DFNT_UINT32 25 -#define DFNT_INT64 26 -#define DFNT_UINT64 27 -#define DFNT_INT128 28 /* No current plans for support */ -#define DFNT_UINT128 30 /* No current plans for support */ - -#define DFNT_UCHAR8 3 /* 3 chosen for backward compatibility */ -#define DFNT_UCHAR 3 /* uchar=uchar8 for backward combatibility */ -#define DFNT_CHAR8 4 /* 4 chosen for backward compatibility */ -#define DFNT_CHAR 4 /* uchar=uchar8 for backward combatibility */ -#define DFNT_CHAR16 42 /* No current plans for support */ -#define DFNT_UCHAR16 43 /* No current plans for support */ - -/* Type info codes for Native Mode datasets */ -#define DFNT_NFLOAT32 (DFNT_NATIVE | DFNT_FLOAT32) -#define DFNT_NFLOAT64 (DFNT_NATIVE | DFNT_FLOAT64) -#define DFNT_NFLOAT128 (DFNT_NATIVE | DFNT_FLOAT128) /* Unsupported */ - -#define DFNT_NINT8 (DFNT_NATIVE | DFNT_INT8) -#define DFNT_NUINT8 (DFNT_NATIVE | DFNT_UINT8) -#define DFNT_NINT16 (DFNT_NATIVE | DFNT_INT16) -#define DFNT_NUINT16 (DFNT_NATIVE | DFNT_UINT16) -#define DFNT_NINT32 (DFNT_NATIVE | DFNT_INT32) -#define DFNT_NUINT32 (DFNT_NATIVE | DFNT_UINT32) -#define DFNT_NINT64 (DFNT_NATIVE | DFNT_INT64) -#define DFNT_NUINT64 (DFNT_NATIVE | DFNT_UINT64) -#define DFNT_NINT128 (DFNT_NATIVE | DFNT_INT128) /* Unsupported */ -#define DFNT_NUINT128 (DFNT_NATIVE | DFNT_UINT128) /* Unsupported */ - -#define DFNT_NCHAR8 (DFNT_NATIVE | DFNT_CHAR8) -#define DFNT_NCHAR (DFNT_NATIVE | DFNT_CHAR8) /* backward compat */ -#define DFNT_NUCHAR8 (DFNT_NATIVE | DFNT_UCHAR8) -#define DFNT_NUCHAR (DFNT_NATIVE | DFNT_UCHAR8) /* backward compat */ -#define DFNT_NCHAR16 (DFNT_NATIVE | DFNT_CHAR16) /* Unsupported */ -#define DFNT_NUCHAR16 (DFNT_NATIVE | DFNT_UCHAR16) /* Unsupported */ - -/* Type info codes for Little Endian data */ -#define DFNT_LFLOAT32 (DFNT_LITEND | DFNT_FLOAT32) -#define DFNT_LFLOAT64 (DFNT_LITEND | DFNT_FLOAT64) -#define DFNT_LFLOAT128 (DFNT_LITEND | DFNT_FLOAT128) /* Unsupported */ - -#define DFNT_LINT8 (DFNT_LITEND | DFNT_INT8) -#define DFNT_LUINT8 (DFNT_LITEND | DFNT_UINT8) -#define DFNT_LINT16 (DFNT_LITEND | DFNT_INT16) -#define DFNT_LUINT16 (DFNT_LITEND | DFNT_UINT16) -#define DFNT_LINT32 (DFNT_LITEND | DFNT_INT32) -#define DFNT_LUINT32 (DFNT_LITEND | DFNT_UINT32) -#define DFNT_LINT64 (DFNT_LITEND | DFNT_INT64) -#define DFNT_LUINT64 (DFNT_LITEND | DFNT_UINT64) -#define DFNT_LINT128 (DFNT_LITEND | DFNT_INT128) /* Unsupported */ -#define DFNT_LUINT128 (DFNT_LITEND | DFNT_UINT128) /* Unsupported */ - -#define DFNT_LCHAR8 (DFNT_LITEND | DFNT_CHAR8) -#define DFNT_LCHAR (DFNT_LITEND | DFNT_CHAR8) /* backward compat */ -#define DFNT_LUCHAR8 (DFNT_LITEND | DFNT_UCHAR8) -#define DFNT_LUCHAR (DFNT_LITEND | DFNT_UCHAR8) /* backward compat */ -#define DFNT_LCHAR16 (DFNT_LITEND | DFNT_CHAR16) /* Unsupported */ -#define DFNT_LUCHAR16 (DFNT_LITEND | DFNT_UCHAR16) /* Unsupported */ - -/* class info codes for int */ -#define DFNTI_MBO 1 /* Motorola byte order 2's compl */ -#define DFNTI_VBO 2 /* Vax byte order 2's compl */ -#define DFNTI_IBO 4 /* Intel byte order 2's compl */ - -/* class info codes for float */ -#define DFNTF_NONE 0 /* indicates subclass is not set */ -#define DFNTF_HDFDEFAULT 1 /* hdf default float format is ieee */ -#define DFNTF_IEEE 1 /* IEEE format */ -#define DFNTF_VAX 2 /* Vax format */ -#define DFNTF_CRAY 3 /* Cray format */ -#define DFNTF_PC 4 /* PC floats - flipped IEEE */ -#define DFNTF_CONVEX 5 /* CONVEX native format */ -#define DFNTF_VP 6 /* Fujitsu VP native format */ -#define DFNTF_CRAYMPP 7 /* Cray MPP format */ - -/* class info codes for char */ -#define DFNTC_BYTE 0 /* bitwise/numeric field */ -#define DFNTC_ASCII 1 /* ASCII */ -#define DFNTC_EBCDIC 5 /* EBCDIC */ - -/* array order */ -#define DFO_FORTRAN 1 /* column major order */ -#define DFO_C 2 /* row major order */ - -/*******************************************************************/ -/* Sizes of number types */ -/*******************************************************************/ - -/* first the standard sizes of number types */ - -# define SIZE_FLOAT32 4 -# define SIZE_FLOAT64 8 -# define SIZE_FLOAT128 16 /* No current plans for support */ - -# define SIZE_INT8 1 -# define SIZE_UINT8 1 -# define SIZE_INT16 2 -# define SIZE_UINT16 2 -# define SIZE_INT32 4 -# define SIZE_UINT32 4 -# define SIZE_INT64 8 -# define SIZE_UINT64 8 -# define SIZE_INT128 16 /* No current plans for support */ -# define SIZE_UINT128 16 /* No current plans for support */ - -# define SIZE_CHAR8 1 -# define SIZE_CHAR 1 /* For backward compat char8 == char */ -# define SIZE_UCHAR8 1 -# define SIZE_UCHAR 1 /* For backward compat uchar8 == uchar */ -# define SIZE_CHAR16 2 /* No current plans for support */ -# define SIZE_UCHAR16 2 /* No current plans for support */ - -/* then the native sizes of number types */ - -/* Unusual number sizes */ -/* Cray (UNICOS) native number sizes: - Char = 8 bits, unsigned - Short=64 int=64 long=64 float=64 double=64 bits - Long double=128 bits - Char pointers = 64 bits - Int pointers = 64 bits -*/ -/* T3D/T3E (CRAYMPP) native number sizes: - Char = 8 bits, unsigned - Short=32 int=64 long=64 float=32 double=64 bits - Long double=64 bits - Char pointers = 64 bits - Int pointers = 64 bits - Big endian, IEEE floating point -*/ -/* IA64 (IA64) native number sizes: - Char = 8 bits, signed - Short=16 int=32 long=64 float=32 double=64 bits - Long double=64 bits - Char pointers = 64 bits - Int pointers = 64 bits - Little endian, IEEE floating point -*/ - -#if !defined(UNICOS) -# define SIZE_NFLOAT32 4 -# define SIZE_NFLOAT64 8 -# define SIZE_NFLOAT128 16 /* No current plans for support */ - -# define SIZE_NINT8 1 -# define SIZE_NUINT8 1 -#if defined(CRAYMPP) -# define SIZE_NINT16 4 -# define SIZE_NUINT16 4 -#else -# define SIZE_NINT16 2 -# define SIZE_NUINT16 2 -#endif -# define SIZE_NINT32 4 -# define SIZE_NUINT32 4 -# define SIZE_NINT64 8 -# define SIZE_NUINT64 8 -# define SIZE_NINT128 16 /* No current plans for support */ -# define SIZE_NUINT128 16 /* No current plans for support */ - -# define SIZE_NCHAR8 1 -# define SIZE_NCHAR 1 /* For backward compat char8 == char */ -# define SIZE_NUCHAR8 1 -# define SIZE_NUCHAR 1 /* For backward compat uchar8 == uchar */ -#if defined(CRAYMPP) -# define SIZE_NCHAR16 4 /* No current plans for support */ -# define SIZE_NUCHAR16 4 /* No current plans for support */ -#else -# define SIZE_NCHAR16 2 /* No current plans for support */ -# define SIZE_NUCHAR16 2 /* No current plans for support */ -#endif -#else /* !!!!!! SOMEBODY NEEDS TO CHECK THESE !!!!! */ -# define SIZE_NFLOAT32 8 -# define SIZE_NFLOAT64 8 -# define SIZE_NFLOAT128 16 /* No current plans for support */ - -# define SIZE_NINT8 1 -# define SIZE_NUINT8 1 -# define SIZE_NINT16 8 -# define SIZE_NUINT16 8 -# define SIZE_NINT32 8 -# define SIZE_NUINT32 8 -# define SIZE_NINT64 8 -# define SIZE_NUINT64 8 -# define SIZE_NINT128 16 /* No current plans for support */ -# define SIZE_NUINT128 16 /* No current plans for support */ -# define SIZE_NCHAR8 1 -# define SIZE_NCHAR 1 -# define SIZE_NCHAR 1 /* For backward compat char8 == char */ -# define SIZE_NUCHAR8 1 -# define SIZE_NUCHAR 1 /* For backward compat uchar8 == uchar */ -# define SIZE_NCHAR16 2 /* No current plans for support */ -# define SIZE_NUCHAR16 2 /* No current plans for support */ -#endif /* UNICOS */ - -/* then the sizes of little-endian number types */ -# define SIZE_LFLOAT32 4 -# define SIZE_LFLOAT64 8 -# define SIZE_LFLOAT128 16 /* No current plans for support */ - -# define SIZE_LINT8 1 -# define SIZE_LUINT8 1 -# define SIZE_LINT16 2 -# define SIZE_LUINT16 2 -# define SIZE_LINT32 4 -# define SIZE_LUINT32 4 -# define SIZE_LINT64 8 -# define SIZE_LUINT64 8 -# define SIZE_LINT128 16 /* No current plans for support */ -# define SIZE_LUINT128 16 /* No current plans for support */ - -# define SIZE_LCHAR8 1 -# define SIZE_LCHAR 1 /* For backward compat char8 == char */ -# define SIZE_LUCHAR8 1 -# define SIZE_LUCHAR 1 /* For backward compat uchar8 == uchar */ -# define SIZE_LCHAR16 2 /* No current plans for support */ -# define SIZE_LUCHAR16 2 /* No current plans for support */ - - /* sizes of different number types */ -# define MACHINE_I8_SIZE 1 -# define MACHINE_I16_SIZE 2 -# define MACHINE_I32_SIZE 4 -# define MACHINE_F32_SIZE 4 -# define MACHINE_F64_SIZE 8 - - /* maximum size of the atomic data types */ -# define MAX_NT_SIZE 16 -#endif /* _HNT_H */ - diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/hproto.h b/Utilities/CAI/cai_dll/inc/inc_hdf/hproto.h deleted file mode 100755 index 0a37068a1e..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/hproto.h +++ /dev/null @@ -1,4221 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -#ifndef _H_PROTO -#define _H_PROTO - -/* Usefull macros, which someday might become actual functions */ -/* Wrappers for Hinquire. feb-2-92 */ -#define HQueryfileid(aid, fileid) \ - (Hinquire ((int32) aid, (int32*) fileid, (uint16*) NULL,\ - (uint16*) NULL, (int32*) NULL, (int32*) NULL,\ - (int32*) NULL, (int16*) NULL, (int16*) NULL)) - -#define HQuerytagref(aid, tag, ref) \ - (Hinquire ((int32) aid, (int32*) NULL, (uint16*) tag,\ - (uint16*) ref, (int32*) NULL, (int32*) NULL,\ - (int32*) NULL, (int16*) NULL, (int16*) NULL)) - -#define HQuerylength(aid, length) \ - (Hinquire ((int32) aid, (int32*) NULL, (uint16*) NULL, \ - (uint16*) NULL, (int32*) length, (int32*) NULL, \ - (int32*) NULL, (int16*) NULL, (int16*) NULL)) - -#define HQueryoffset(aid, offset) \ - (Hinquire ((int32) aid, (int32*) NULL, (uint16*) NULL, \ - (uint16*) NULL, (int32*) NULL, (int32*) offset, \ - (int32*) NULL, (int16*) NULL, (int16*) NULL)) - -#define HQueryposition(aid, position) \ - (Hinquire ((int32) aid, (int32*) NULL, (uint16*) NULL, \ - (uint16*) NULL, (int32*) NULL, (int32*) NULL, \ - (int32*) position, (int16*) NULL, (int16*) NULL)) - -#define HQueryaccess(aid, access) \ - (Hinquire ((int32) aid, (int32*) NULL, (uint16*) NULL, \ - (uint16*) NULL, (int32*) NULL, (int32*) NULL, \ - (int32*) NULL, (int16*) access, (int16*) NULL)) - -#define HQueryspecial(aid, special) \ - (Hinquire ((int32) aid, (int32*) NULL, (uint16*) NULL, \ - (uint16*) NULL, (int32*) NULL, (int32*) NULL, \ - (int32*) NULL, (int16*) NULL, (int16*) special)) - - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/* - ** from hfile.c - */ - HDFLIBAPI int32 Hopen - (const char *path, intn acc_mode, int16 ndds); - - HDFLIBAPI intn Hclose - (int32 file_id); - - HDFLIBAPI int32 Hstartread - (int32 file_id, uint16 tag, uint16 ref); - - HDFLIBAPI intn Hnextread - (int32 access_id, uint16 tag, uint16 ref, intn origin); - - HDFLIBAPI intn Hexist - (int32 file_id, uint16 search_tag, uint16 search_ref); - - HDFLIBAPI intn Hinquire - (int32 access_id, int32 * pfile_id, uint16 * ptag, - uint16 * pref, int32 * plength, int32 * poffset, - int32 * pposn, int16 * paccess, int16 * pspecial); - - HDFLIBAPI int32 Hstartwrite - (int32 file_id, uint16 tag, uint16 ref, int32 length); - - HDFLIBAPI int32 Hstartaccess - (int32 file_id, uint16 tag, uint16 ref, uint32 flags); - - HDFLIBAPI intn Hsetlength - (int32 file_id, int32 length); - - HDFLIBAPI intn Happendable - (int32 aid); - - HDFLIBAPI intn HPisappendable - (int32 aid); - - HDFLIBAPI intn HPregister_term_func - (hdf_termfunc_t term_func); - - HDFLIBAPI intn Hseek - (int32 access_id, int32 offset, intn origin); - - HDFLIBAPI int32 Htell - (int32 access_id); - - HDFLIBAPI int32 Hread - (int32 access_id, int32 length, void * data); - - HDFLIBAPI int32 Hwrite - (int32 access_id, int32 length, const void * data); - - HDFLIBAPI int32 Htrunc - (int32 access_id, int32 trunc_len); - - HDFLIBAPI intn Hendaccess - (int32 access_id); - - HDFLIBAPI intn HDgetc - (int32 access_id); - - HDFLIBAPI intn HDputc - (uint8 c, int32 access_id); - - HDFLIBAPI int32 Hgetelement - (int32 file_id, uint16 tag, uint16 ref, uint8 * data); - - HDFLIBAPI int32 Hputelement - (int32 file_id, uint16 tag, uint16 ref, const uint8 * data, int32 length); - - HDFLIBAPI int32 Hlength - (int32 file_id, uint16 tag, uint16 ref); - - HDFLIBAPI int32 Hoffset - (int32 file_id, uint16 tag, uint16 ref); - - HDFLIBAPI intn Hsync - (int32 file_id); - - HDFLIBAPI intn Hcache - (int32 file_id, intn cache_on); - - HDFLIBAPI intn Hgetlibversion - (uint32 * majorv, uint32 * minorv, - uint32 * releasev, char * string); - - HDFLIBAPI intn Hgetfileversion - (int32 file_id, uint32 * majorv, uint32 * minorv, - uint32 * release, char * string); - - HDFLIBAPI intn Hsetaccesstype(int32 access_id, uintn accesstype); - - HDFLIBAPI uint16 HDmake_special_tag - (uint16 tag); - - HDFLIBAPI intn HDis_special_tag - (uint16 tag); - - HDFLIBAPI uint16 HDbase_tag - (uint16 tag); - - HDFLIBAPI int HDerr - (int32 file_id); - - HDFLIBAPI intn HDvalidfid - (int32 file_id); - - HDFLIBAPI const char *HDgettagdesc - (uint16 tag); - - HDFLIBAPI char *HDgettagsname - (uint16 tag); - - HDFLIBAPI intn HDgettagnum - (const char *tag_name); - - HDFLIBAPI char *HDgetNTdesc - (int32 nt); - - HDFLIBAPI const char *HDfidtoname - (int32 fid); - - HDFLIBAPI intn Hishdf - (const char * filename); - - HDFLIBAPI intn Hfidinquire - (int32 file_id, char ** fname, intn * acc_mode, - intn * attach); - - HDFLIBAPI intn Hshutdown(void); - - HDFLIBAPI void HPend(void); - - HDFLIBAPI intn HDdont_atexit(void); - -/* - ** from hfiledd.c - */ -/****************************************************************************** - NAME - Hdupdd - Duplicate a data descriptor - - DESCRIPTION - Duplicates a data descriptor so that the new tag/ref points to the - same data element pointed to by the old tag/ref. Return FAIL if - the given tag/ref are already in use. - - RETURNS - returns SUCCEED (0) if successful, FAIL (-1) otherwise - -*******************************************************************************/ -HDFLIBAPI intn Hdupdd(int32 file_id, /* IN: File ID the tag/refs are in */ - uint16 tag, /* IN: Tag of new tag/ref */ - uint16 ref, /* IN: Ref of new tag/ref */ - uint16 old_tag, /* IN: Tag of old tag/ref */ - uint16 old_ref /* IN: Ref of old tag/ref */ -); - -/****************************************************************************** - NAME - Hnumber - Determine the number of objects of a given type - - DESCRIPTION - Determine how many objects of the given tag are in the file. - tag may be set to DFTAG_WILDCARD to get back the total number - of objects in the file. - - Note, a return value of zero is not a fail condition. - - RETURNS - the number of objects of type 'tag' else FAIL - -*******************************************************************************/ -HDFLIBAPI int32 Hnumber(int32 file_id, /* IN: File ID the tag/refs are in */ - uint16 tag /* IN: Tag to count */ -); - -/****************************************************************************** - NAME - Hnewref - Returns a ref that is guaranteed to be unique in the file - - DESCRIPTION - Returns a ref number that can be used with any tag to produce a - unique tag/ref. Successive calls to Hnewref will generate a - strictly increasing sequence until the highest possible ref had been - returned, then Hnewref will return unused ref's starting from 1. - - RETURNS - returns the ref number, 0 otherwise - -*******************************************************************************/ -HDFLIBAPI uint16 Hnewref(int32 file_id /* IN: File ID the tag/refs are in */ -); - -/****************************************************************************** - NAME - Htagnewref - returns a ref that is unique in the file for a given tag - - DESCRIPTION - Returns a ref number that can be used with any tag to produce a - unique tag/ref. Successive calls to Hnewref will generate a - strictly increasing sequence until the highest possible ref had been - returned, then Hnewref will return unused ref's starting from 1. - - RETURNS - returns the ref number, 0 otherwise - -*******************************************************************************/ -HDFLIBAPI uint16 Htagnewref(int32 file_id, /* IN: File ID the tag/refs are in */ - uint16 tag /* IN: Tag to search for a new ref for */ -); - -/****************************************************************************** - NAME - Hfind - locate the next object of a search in an HDF file - - DESCRIPTION - Searches for the `next' DD that fits the search tag/ref. Wildcards - apply. If origin is DF_FORWARD, search from current position forwards - in the file, otherwise DF_BACKWARD searches backward from the current - position in the file. If *find_tag and *find_ref are both set to - 0, this indicates the beginning of a search, and the search will - start from the beginning of the file if the direction is DF_FORWARD - and from the and of the file if the direction is DF_BACKWARD. - - RETURNS - returns SUCCEED (0) if successful and FAIL (-1) otherwise - -*******************************************************************************/ -HDFLIBAPI intn Hfind(int32 file_id, /* IN: file ID to search in */ - uint16 search_tag, /* IN: the tag to search for (can be DFTAG_WILDCARD) */ - uint16 search_ref, /* IN: ref to search for (can be DFREF_WILDCARD) */ - uint16 *find_tag, /* IN: if (*find_tag==0) and (*find_ref==0) then start search */ - /* OUT: tag matching the search tag */ - uint16 *find_ref, /* IN: if (*find_tag==0) and (*find_ref==0) then start search */ - /* OUT: ref matching the search ref */ - int32 *find_offset, /* OUT: offset of the data element found */ - int32 *find_length, /* OUT: length of the data element found */ - intn direction /* IN: Direction to search in: */ - /* DF_FORWARD searches forward from the current location */ - /* DF_BACKWARD searches backward from the current location */ -); - - -/****************************************************************************** - NAME - HDcheck_tagref - Checks to see if tag/ref is in DD list i.e. created already - - DESCRIPTION - Routine checks to see if tag/ref exists in the DD list i.e. has - been created. - - RETURNS - 0-> tag/ref does not exist - 1-> tag/ref exists - -1-> function failed - -*******************************************************************************/ -HDFLIBAPI intn -HDcheck_tagref(int32 file_id, /* IN: id of file */ - uint16 tag, /* IN: Tag to check */ - uint16 ref /* IN: ref to check */); - -/************************************************************************ -NAME - HDreuse_tagref -- reuse a data descriptor preserving tag/ref - -DESCRIPTION - Reuses the data descriptor of tag/ref in the dd list of the file. - The tag/ref must already exist in the DD list. - This routine is unsafe and may leave a file in a condition that is - not usable by some routines. Use with care. Not valid for - special elments right now. Used for allowing the data to change - and move somewhere else in the file for non-special elements. - Must be carefully if apply to higher-level objects like GR's and SDS - that are comprised of other objects. - Usefull when re-writing simple elements whose size changes while - preserving the original tag/ref of the element since other elements - might refer to this element by tag/ref e.g. in a Vgroup. - -RETURNS - returns SUCCEED (0) if successful, FAIL (-1) otherwise -************************************************************************/ -HDFLIBAPI intn -HDreuse_tagref(int32 file_id, /* IN: id of file */ - uint16 tag, /* IN: tag of data descriptor to reuse */ - uint16 ref /* IN: ref of data descriptor to reuse */ ); - -/****************************************************************************** - NAME - Hdeldd - Delete a data descriptor - - DESCRIPTION - Deletes a data descriptor of tag/ref from the dd list of the file. - This routine is unsafe and may leave a file in a condition that is - not usable by some routines. Use with care. - For example, if this element is contained in a Vgroup, that group - will *NOT* get updated to reflect that this element has been deleted. - - RETURNS - returns SUCCEED (0) if successful, FAIL (-1) otherwise - -*******************************************************************************/ -HDFLIBAPI intn Hdeldd(int32 file_id, /* IN: File ID the tag/refs are in */ - uint16 tag, /* IN: Tag of tag/ref to delete */ - uint16 ref /* IN: Ref of tag/ref to delete */ -); - -/* - ** from hdfalloc.c - */ - - HDFLIBAPI void * HDmemfill - (void * dest, const void * src, uint32 item_size, uint32 num_items); - - HDFLIBAPI char *HIstrncpy - (char * dest, const char * source, int32 len); - - HDFLIBAPI int32 HDspaceleft - (void); - -#if defined(MALLOC_CHECK) || defined(_HDFDLL_) - HDFPUBLIC extern void * HDmalloc - (uint32 qty); - - HDFPUBLIC extern void * HDrealloc - (void * where, uint32 qty); - - HDFPUBLIC extern void * HDcalloc - (uint32 n, uint32 size); - - HDFPUBLIC extern void HDfree - (void * ptr); - -#endif /* defined MALLOC_CHECK */ - -#if defined VMS || defined macintosh || defined MAC || defined SYMANTEC_C || defined MIPSEL || defined NEXT || defined CONVEX || defined IBM6000 || defined SUN || defined IRIX || defined _HDFDLL_ - HDFPUBLIC extern char *HDstrdup - (const char *s); - -#endif - - HDFLIBAPI intn HDc2fstr - (char * str, intn len); - - HDFLIBAPI char *HDf2cstring - (_fcd fdesc, intn len); - - HDFLIBAPI intn HDflush - (int32 file_id); - - HDFLIBAPI intn HDpackFstring - (char * src, char * dest, intn len); - -/* - ** from hblocks.c - */ - HDFLIBAPI int32 HLcreate - (int32 file_id, uint16 tag, uint16 ref, int32 block_length, - int32 number_blocks); - - HDFLIBAPI intn HLconvert - (int32 aid, int32 block_length, int32 number_blocks); - - HDFLIBAPI int HDinqblockinfo - (int32 aid, int32 *length, int32 *first_length, int32 *block_length, - int32 *number_blocks); - - HDFLIBAPI intn HLsetblockinfo - (int32 aid, int32 block_size, int32 num_blocks); - - HDFLIBAPI intn HLgetblockinfo - (int32 aid, int32* block_size, int32* num_blocks); - -/* - ** from hextelt.c - */ - HDFLIBAPI int32 HXcreate - (int32 file_id, uint16 tag, uint16 ref, const char * extern_file_name, - int32 offset, int32 start_len); - - HDFLIBAPI intn HXsetcreatedir - (const char *dir); - - HDFLIBAPI intn HXsetdir - (const char *dir); - -/* - ** from hcomp.c - */ - HDFLIBAPI int32 HCcreate - (int32 file_id, uint16 tag, uint16 ref, - comp_model_t model_type, model_info * m_info, - comp_coder_t coder_type, comp_info * c_info); - - HDFLIBAPI intn HCPgetcompress - (int32 file_id, uint16 data_tag, uint16 data_ref, - comp_coder_t *coder_type, comp_info * c_info); - - HDFPUBLIC intn HCget_config_info ( comp_coder_t coder_type, uint32 *compression_config_info); - - HDFLIBAPI int32 HCPquery_encode_header(comp_model_t model_type, model_info * m_info, - comp_coder_t coder_type, comp_info * c_info); - - HDFLIBAPI intn HCPencode_header(uint8 *p, comp_model_t model_type, model_info * m_info, - comp_coder_t coder_type, comp_info * c_info); - - HDFLIBAPI intn HCPdecode_header(uint8 *p, comp_model_t *model_type, model_info * m_info, - comp_coder_t *coder_type, comp_info * c_info); - -/* - ** from cszip.c - */ - - HDFLIBAPI intn HCPsetup_szip_parms ( comp_info *c_info, int32 nt, int32 ncomp, int32 ndims, int32 *dims, int32 *cdims); -/* - ** from hbuffer.c - */ - HDFLIBAPI intn HBconvert - (int32 aid); - -/* - ** from hcompri.c - */ - HDFLIBAPI int32 HRPconvert - (int32 fid, uint16 tag, uint16 ref, int32 xdim, int32 ydim,int16 scheme, comp_info *cinfo, uintn pixel_size); - -/* - ** from herr.c - */ - HDFLIBAPI const char *HEstring - (hdf_err_code_t error_code); - - HDFLIBAPI void HEpush - (hdf_err_code_t error_code, const char * function_name, - const char * file_name, intn line); - - HDFLIBAPI void HEreport - (const char *,...); - - HDFLIBAPI void HEprint - (FILE * stream, int32 print_level); - - HDFLIBAPI int16 HEvalue - (int32 level); - - HDFLIBAPI void HEPclear - (void); - - HDFLIBAPI intn HEshutdown(void); - -/* - ** from hbitio.c - */ - HDFLIBAPI int32 Hstartbitread - (int32 file_id, uint16 tag, uint16 ref); - - HDFLIBAPI int32 Hstartbitwrite - (int32 file_id, uint16 tag, uint16 ref, int32 length); - - HDFLIBAPI intn Hbitappendable - (int32 bitid); - - HDFLIBAPI intn Hbitwrite - (int32 bitid, intn count, uint32 data); - - HDFLIBAPI intn Hbitread - (int32 bitid, intn count, uint32 *data); - - HDFLIBAPI intn Hbitseek - (int32 bitid, int32 byte_offset, intn bit_offset); - - HDFLIBAPI intn Hgetbit - (int32 bitid); - - HDFLIBAPI int32 Hendbitaccess - (int32 bitfile_id, intn flushbit); - - HDFLIBAPI intn HPbitshutdown(void); - -/* - ** from dfcomp.c - */ - HDFLIBAPI intn DFputcomp - (int32 file_id, uint16 tag, uint16 ref, const uint8 * image, - int32 xdim, int32 ydim, uint8 * palette, uint8 * newpal, - int16 scheme, comp_info * cinfo); - - HDFLIBAPI int DFgetcomp - (int32 file_id, uint16 tag, uint16 ref, uint8 * image, - int32 xdim, int32 ydim, uint16 scheme); - -/* - ** from dfrle.c - */ - HDFLIBAPI int32 DFCIrle - (const void * buf, void * bufto, int32 len); - - HDFLIBAPI int32 DFCIunrle - (uint8 * buf, uint8 *bufto, int32 outlen, int resetsave); - -/* - ** from dfimcomp.c - */ - HDFLIBAPI void DFCIimcomp - (int32 xdim, int32 ydim, const uint8 *in, uint8 out[], - uint8 in_pal[], uint8 out_pal[], int mode); - - HDFLIBAPI void DFCIunimcomp - (int32 xdim, int32 ydim, uint8 in[], uint8 out[]); - -/* - ** from dfjpeg.c - */ - - HDFLIBAPI intn DFCIjpeg - (int32 file_id, uint16 tag, uint16 ref, int32 xdim, int32 ydim, - const void * image, int16 scheme, comp_info * scheme_info); - -/* - ** from dfunjpeg.c - */ - - HDFLIBAPI intn DFCIunjpeg - (int32 file_id, uint16 tag, uint16 ref, void * image, int32 xdim, - int32 ydim, int16 scheme); - -/* - ** from dfgroup.c - */ - HDFLIBAPI int32 DFdiread - (int32 file_id, uint16 tag, uint16 ref); - - HDFLIBAPI intn DFdiget - (int32 list, uint16 * ptag, uint16 * pref); - - HDFLIBAPI intn DFdinobj - (int32 list); - - HDFLIBAPI int32 DFdisetup - (int maxsize); - - HDFLIBAPI intn DFdiput - (int32 list, uint16 tag, uint16 ref); - - HDFLIBAPI intn DFdiwrite - (int32 file_id, int32 list, uint16 tag, uint16 ref); - - HDFLIBAPI void DFdifree - (int32 groupID); - -/* - ** from dfp.c - */ - HDFLIBAPI intn DFPgetpal - (const char * filename, void * palette); - - HDFLIBAPI intn DFPputpal - (const char * filename, const void * palette, intn overwrite, const char * filemode); - - HDFLIBAPI intn DFPaddpal - (const char * filename, const void * palette); - - HDFLIBAPI intn DFPnpals - (const char * filename); - - HDFLIBAPI intn DFPreadref - (const char * filename, uint16 ref); - - HDFLIBAPI intn DFPwriteref - (const char * filename, uint16 ref); - - HDFLIBAPI intn DFPrestart - (void); - - HDFLIBAPI uint16 DFPlastref - (void); - -/* - ** from dfr8.c - */ - HDFLIBAPI int DFR8setcompress - (int32 scheme, comp_info * cinfo); - - HDFLIBAPI intn DFR8getdims - (const char * filename, int32 * pxdim, int32 * pydim, - int * pispal); - - HDFLIBAPI intn DFR8getimage - (const char * filename, uint8 * image, int32 xdim, int32 ydim, - uint8 * pal); - - HDFLIBAPI intn DFR8setpalette - (uint8 * pal); - - HDFLIBAPI intn DFR8putimage - (const char * filename, const void * image, int32 xdim, int32 ydim, uint16 compress); - - HDFLIBAPI intn DFR8addimage - (const char * filename, const void * image, int32 xdim, int32 ydim, uint16 compress); - - HDFLIBAPI intn DFR8nimages - (const char * filename); - - HDFLIBAPI intn DFR8readref - (const char * filename, uint16 ref); - - HDFLIBAPI intn DFR8writeref - (const char * filename, uint16 ref); - - HDFLIBAPI intn DFR8restart - (void); - - HDFLIBAPI uint16 DFR8lastref - (void); - - HDFLIBAPI intn DFR8getpalref(uint16 *pal_ref); - - HDFLIBAPI intn DFR8Pshutdown(void); - -/* - ** from dfgr.c - */ - HDFLIBAPI intn DFGRgetlutdims - (const char * filename, int32 * pxdim, int32 * pydim, - intn * pncomps, intn * pil); - - HDFLIBAPI intn DFGRreqlutil - (intn il); - - HDFLIBAPI intn DFGRgetlut - (const char * filename, void * lut, int32 xdim, int32 ydim); - - HDFLIBAPI intn DFGRgetimdims - (const char * filename, int32 * pxdim, int32 * pydim, - intn * pncomps, intn * pil); - - HDFLIBAPI intn DFGRreqimil - (intn il); - - HDFLIBAPI intn DFGRgetimage - (const char * filename, void * image, int32 xdim, int32 ydim); - - HDFLIBAPI intn DFGRsetcompress - (int32 scheme, comp_info * cinfo); - - HDFLIBAPI intn DFGRsetlutdims - (int32 xdim, int32 ydim, intn ncomps, intn il); - - HDFLIBAPI intn DFGRsetlut - (void * lut, int32 xdim, int32 ydim); - - HDFLIBAPI intn DFGRaddlut - (const char * filename, void * lut, int32 xdim, int32 ydim); - - HDFLIBAPI intn DFGRsetimdims - (int32 xdim, int32 ydim, intn ncomps, intn il); - - HDFLIBAPI intn DFGRaddimage - (const char * filename, void * image, int32 xdim, int32 ydim); - - HDFLIBAPI intn DFGRputimage - (const char * filename, void * image, int32 xdim, int32 ydim); - - HDFLIBAPI intn DFGRreadref - (const char * filename, uint16 ref); - - HDFLIBAPI uint16 DFGRIlastref - (void); - - HDFLIBAPI intn DFGRIgetdims - (const char * filename, int32 * pxdim, int32 * pydim, - intn * pncomps, intn * pil, intn type); - - HDFLIBAPI intn DFGRIreqil - (intn il, intn type); - - HDFLIBAPI intn DFGRIgetimlut - (const char * filename, void * imlut, int32 xdim, int32 ydim, intn type, - intn isfortran, int *compressed, uint16 *compr_type, int *has_pal); - - HDFLIBAPI intn DFGRIsetdims - (int32 xdim, int32 ydim, intn ncomps, intn type); - - HDFLIBAPI intn DFGRIsetil - (intn il, intn type); - - HDFLIBAPI intn DFGRIrestart - (void); - - HDFLIBAPI intn DFGRIaddimlut - (const char * filename, const void * imlut, int32 xdim, int32 ydim, intn type, - intn isfortran, intn newfile); - - HDFLIBAPI intn DFGRPshutdown(void); - -/* - ** from df24.c - */ - HDFLIBAPI intn DF24getdims - (const char * filename, int32 * pxdim, int32 * pydim, - intn * pil); - - HDFLIBAPI intn DF24reqil - (intn il); - - HDFLIBAPI intn DF24getimage - (const char * filename, void * image, int32 xdim, int32 ydim); - - HDFLIBAPI intn DF24setdims - (int32 xdim, int32 ydim); - - HDFLIBAPI intn DF24setil - (intn il); - - HDFLIBAPI intn DF24setcompress - (int32 type, comp_info * cinfo); - - HDFLIBAPI intn DF24restart - (void); - - HDFLIBAPI intn DF24addimage - (const char * filename, const void * image, int32 xdim, int32 ydim); - - HDFLIBAPI intn DF24putimage - (const char * filename, const void * image, int32 xdim, int32 ydim); - - HDFLIBAPI intn DF24nimages - (const char * filename); - - HDFLIBAPI intn DF24readref - (const char * filename, uint16 ref); - - HDFLIBAPI uint16 DF24lastref - (void); - -/* - ** from dfan.c - */ - - HDFLIBAPI int32 DFANgetlablen - (const char * filename, uint16 tag, uint16 ref); - - HDFLIBAPI intn DFANgetlabel - (const char * filename, uint16 tag, uint16 ref, char * label, - int32 maxlen); - - HDFLIBAPI int32 DFANgetdesclen - (const char * filename, uint16 tag, uint16 ref); - - HDFLIBAPI intn DFANgetdesc - (const char * filename, uint16 tag, uint16 ref, char * desc, - int32 maxlen); - - HDFLIBAPI int32 DFANgetfidlen - (int32 file_id, intn isfirst); - - HDFLIBAPI int32 DFANgetfid - (int32 file_id, char * id, int32 maxlen, intn isfirst); - - HDFLIBAPI int32 DFANgetfdslen - (int32 file_id, intn isfirst); - - HDFLIBAPI int32 DFANgetfds - (int32 file_id, char * desc, int32 maxlen, intn isfirst); - - HDFLIBAPI intn DFANputlabel - (const char * filename, uint16 tag, uint16 ref, char * label); - - HDFLIBAPI intn DFANputdesc - (const char * filename, uint16 tag, uint16 ref, char * desc, - int32 desclen); - - HDFLIBAPI intn DFANaddfid - (int32 file_id, char * id); - - HDFLIBAPI intn DFANaddfds - (int32 file_id, char * desc, int32 desclen); - - HDFLIBAPI uint16 DFANlastref - (void); - - HDFLIBAPI intn DFANlablist - (const char * filename, uint16 tag, uint16 reflist[], - char * labellist, intn listsize, intn maxlen, intn startpos); - - HDFLIBAPI intn DFANclear - (void); - - HDFLIBAPI intn DFANIclear - (void); - - HDFLIBAPI uint16 DFANIlocate - (int32 file_id, int type, uint16 tag, uint16 ref); - - HDFLIBAPI int DFANIaddentry - (int type, uint16 annref, uint16 datatag, uint16 dataref); - - HDFLIBAPI int32 DFANIgetannlen - (const char * filename, uint16 tag, uint16 ref, int type); - - HDFLIBAPI intn DFANIgetann - (const char * filename, uint16 tag, uint16 ref, uint8 * ann, - int32 maxlen, int type); - - HDFLIBAPI intn DFANIputann - (const char * filename, uint16 tag, uint16 ref, uint8 * ann, - int32 annlen, int type); - - HDFLIBAPI int DFANIlablist - (const char * filename, uint16 tag, uint16 reflist[], - uint8 * labellist, int listsize, int maxlen, int startpos, - int isfortran); - - HDFLIBAPI int DFANIaddfann - (int32 file_id, char * ann, int32 annlen, int type); - - HDFLIBAPI int32 DFANIgetfannlen - (int32 file_id, int type, int isfirst); - - HDFLIBAPI int32 DFANIgetfann - (int32 file_id, char * ann, int32 maxlen, int type, int isfirst); - - HDFLIBAPI intn DFANPshutdown(void); - -/* - ** from dfsd.c - */ - - HDFLIBAPI int DFSDgetdims - (const char * filename, intn * prank, int32 sizes[], intn maxrank); - - HDFLIBAPI int DFSDgetdatastrs - (char * label, char * unit, char * format, char * coordsys); - - HDFLIBAPI int DFSDgetdimstrs - (int dim, char * label, char * unit, char * format); - - HDFLIBAPI int DFSDgetdatalen - (int * llabel, int * lunit, int * lformat, int * lcoordsys); - - HDFLIBAPI int DFSDgetdimlen - (int dim, int * llabel, int * lunit, int * lformat); - - HDFLIBAPI int DFSDgetdimscale - (intn dim, int32 maxsize, void * scale); - - HDFLIBAPI int DFSDgetrange - (void * pmax, void * pmin); - - HDFLIBAPI int DFSDgetdata - (const char * filename, intn rank, int32 maxsizes[], void * data); - - HDFLIBAPI int DFSDsetlengths - (int maxlen_label, int maxlen_unit, int maxlen_format, - int maxlen_coordsys); - - HDFLIBAPI int DFSDsetdims - (intn rank, int32 dimsizes[]); - - HDFLIBAPI int DFSDsetdatastrs - (const char * label, const char * unit, const char * format, const char * coordsys); - - HDFLIBAPI int DFSDsetdimstrs - (int dim, const char * label, const char * unit, const char * format); - - HDFLIBAPI int DFSDsetdimscale - (intn dim, int32 dimsize, void * scale); - - HDFLIBAPI int DFSDsetrange - (void * maxi, void * mini); - - HDFLIBAPI int DFSDputdata - (const char * filename, intn rank, int32 dimsizes[], void * data); - - HDFLIBAPI int DFSDadddata - (const char * filename, intn rank, int32 dimsizes[], void * data); - - HDFLIBAPI int DFSDrestart - (void); - - HDFLIBAPI int32 DFSDndatasets - (char * filename); - - HDFLIBAPI int DFSDclear - (void); - - HDFLIBAPI uint16 DFSDlastref - (void); - - HDFLIBAPI int DFSDreadref - (char * filename, uint16 ref); - - HDFLIBAPI int DFSDgetslice - (const char * filename, int32 winst[], int32 windims[], void * data, - int32 dims[]); - - HDFLIBAPI int DFSDstartslice - (const char * filename); - - HDFLIBAPI int DFSDputslice - (int32 winend[], void * data, int32 dims[]); - - HDFLIBAPI int DFSDendslice - (void); - - HDFLIBAPI int DFSDsetNT - (int32 numbertype); - - HDFLIBAPI int DFSDsetorder - (int arrayorder); - - HDFLIBAPI int DFSDgetNT - (int32 * pnumbertype); - - HDFLIBAPI intn DFSDpre32sdg - (char * filename, uint16 ref, intn * ispre32); - - HDFLIBAPI int DFSDsetcal - (float64 cal, float64 cal_err, float64 ioff, - float64 ioff_err, int32 cal_nt); - - HDFLIBAPI int DFSDgetcal - (float64 * pcal, float64 * pcal_err, float64 * pioff, - float64 * pioff_err, int32 * cal_nt); - - HDFLIBAPI int DFSDwriteref - (const char * filename, uint16 ref); - - HDFLIBAPI int DFSDsetfillvalue - (void * fill_value); - - HDFLIBAPI int DFSDgetfillvalue - (void * fill_value); - - HDFLIBAPI int DFSDstartslab - (const char * filename); - - HDFLIBAPI int DFSDwriteslab - (int32 start[], int32 stride[], int32 count[], - void * data); - - HDFLIBAPI int DFSDendslab - (void); - - HDFLIBAPI int DFSDreadslab - (const char *filename, int32 start[], int32 slab_size[], - int32 stride[], void * buffer, int32 buffer_size[]); - - HDFLIBAPI intn DFSDPshutdown(void); - -/* - ** from dfconv.c - */ - - HDFLIBAPI int DFKNTsize - (int32 number_type); - - HDFLIBAPI int32 DFKisnativeNT - (int32 numbertype); - - HDFLIBAPI int32 DFKislitendNT - (int32 numbertype); - - HDFLIBAPI int8 DFKgetPNSC - (int32 numbertype, int32 machinetype); - - HDFLIBAPI intn DFKsetNT - (int32 ntype); - - HDFLIBAPI int32 DFKconvert - (void * source, void * dest, int32 ntype, int32 num_elm, - int16 acc_mode, int32 source_stride, int32 dest_stride); - -/* - ** from dfknat.c - */ - - HDFLIBAPI intn DFKnb1b - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKnb2b - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKnb4b - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKnb8b - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - -/* - ** from dfkswap.c - */ - - HDFLIBAPI intn DFKsb2b - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKsb4b - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKsb8b - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - -/* - ** from dfkcray.c - */ - - HDFLIBAPI intn DFKui2i - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKui2s - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKuo2i - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKuo2s - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKui4i - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKui4s - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKuo4i - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKuo4s - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKui4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKuo4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKui8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKuo8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlui2i - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlui2s - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKluo2i - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKluo2s - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlui4i - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlui4s - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKluo4i - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKluo4s - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlui4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKluo4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlui8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKluo8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - -/* CRAY-MPP */ - HDFLIBAPI intn DFKmi2i - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKmi2s - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKmo2b - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlmi2i - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlmi2s - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlmo2b - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - -/* - ** from dfkvms.c - */ - - HDFLIBAPI intn DFKvi4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKvo4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKvi8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKvo8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlvi4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlvo4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlvi8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlvo8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - -/* - ** from dfkconv.c - */ - - HDFLIBAPI intn DFKci4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKco4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKci8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKco8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlci4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlco4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlci8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlco8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - -/* - ** from dfkfuji.c - */ - - HDFLIBAPI intn DFKpi4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKpo4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKpi8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKpo8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlpi4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlpo4f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlpi8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - - HDFLIBAPI intn DFKlpo8f - (void * s, void * d, uint32 num_elm, uint32 source_stride, uint32 dest_stride); - -/* - ** from dfanF.c - */ -#ifndef DFAN_FNAMES -# define DFAN_FNAMES -#ifdef DF_CAPFNAMES -# define ndaiganl FNAME(DAIGANL) -# define ndaigann FNAME(DAIGANN) -# define ndaipann FNAME(DAIPANN) -# define ndailist FNAME(DAILIST) -# define ndalref FNAME(DALREF) -# define ndaclear FNAME(DACLEAR) -# define ndfanlastref FNAME(DFANLASTREF) - -# define ndfanaddfds FNAME(DFANADDFDS) -# define ndfangetfidlen FNAME(DFANGETFIDLEN) -# define ndfangetfdslen FNAME(DFANGETFDSLEN) -# define ndfangetfid FNAME(DFANGETFID) -# define ndfangetfds FNAME(DFANGETFDS) -# define ndaafds FNAME(DAAFDS) -# define ndagfidl FNAME(DAGFIDL) -# define ndagfdsl FNAME(DAGFDSL) -# define ndagfid FNAME(DAGFID) -# define ndagfds FNAME(DAGFDS) -# define ndaiafid FNAME(DAIAFID) -#else /* DF_CAPFNAMES */ -# define ndaiganl FNAME(daiganl) -# define ndaigann FNAME(daigann) -# define ndaipann FNAME(daipann) -# define ndailist FNAME(dailist) -# define ndalref FNAME(dalref) -# define ndaclear FNAME(daclear) -# define ndfanlastref FNAME(dfanlastref) - -# define ndfanaddfds FNAME(dfanaddfds) -# define ndfangetfidlen FNAME(dfangetfidlen) -# define ndfangetfdslen FNAME(dfangetfdslen) -# define ndfangetfid FNAME(dfangetfid) -# define ndfangetfds FNAME(dfangetfds) -# define ndaafds FNAME(daafds) -# define ndagfidl FNAME(dagfidl) -# define ndagfdsl FNAME(dagfdsl) -# define ndagfid FNAME(dagfid) -# define ndagfds FNAME(dagfds) -# define ndaiafid FNAME(daiafid) -#endif /* DF_CAPFNAMES */ -#endif /* DFAN_FNAMES */ - - HDFLIBAPI FRETVAL(intf) ndaiganl - (_fcd filename, intf * tag, intf * ref, intf * type, - intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndaigann - (_fcd filename, intf * tag, intf * ref, _fcd annotation, - intf * maxlen, intf * type, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndaipann - (_fcd filename, intf * tag, intf * ref, _fcd annotation, - intf * annlen, intf * type, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndailist - (_fcd filename, intf * tag, intf reflist[], _fcd labellist, - intf * listsize, intf * maxlen, intf * startpos, - intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndalref - (void); - - HDFLIBAPI FRETVAL(intf) ndaclear - (void); - - HDFLIBAPI FRETVAL(intf) ndfanlastref - (void); - - HDFLIBAPI FRETVAL(intf) ndfanaddfds - (intf * dfile, _fcd desc, intf * desclen); - - HDFLIBAPI FRETVAL(intf) ndfangetfidlen - (intf * dfile, intf * isfirst); - - HDFLIBAPI FRETVAL(intf) ndfangetfdslen - (intf * dfile, intf * isfirst); - - HDFLIBAPI FRETVAL(intf) ndfangetfid - (intf * dfile, _fcd id, intf * maxlen, intf * isfirst); - - HDFLIBAPI FRETVAL(intf) ndfangetfds - (intf * dfile, _fcd id, intf * maxlen, intf * isfirst); - - HDFLIBAPI FRETVAL(intf) ndaafds - (intf * dfile, _fcd desc, intf * desclen); - - HDFLIBAPI FRETVAL(intf) ndagfidl - (intf * dfile, intf * isfirst); - - HDFLIBAPI FRETVAL(intf) ndagfdsl - (intf * dfile, intf * isfirst); - - HDFLIBAPI FRETVAL(intf) ndagfid - (intf * dfile, _fcd id, intf * maxlen, intf * isfirst); - - HDFLIBAPI FRETVAL(intf) ndagfds - (intf * dfile, _fcd id, intf * maxlen, intf * isfirst); - - HDFLIBAPI FRETVAL(intf) ndaiafid - (intf * dfile, _fcd id, intf * idlen); - -/* - ** from dfr8F.c - */ -#ifndef DFR8_FNAMES -# define DFR8_FNAMES -#ifdef DF_CAPFNAMES -# define nd8spal FNAME(D8SPAL) -# define nd8first FNAME(D8FIRST) -# define nd8igdim FNAME(D8IGDIM) -# define nd8igimg FNAME(D8IGIMG) -# define nd8ipimg FNAME(D8IPIMG) -# define nd8iaimg FNAME(D8IAIMG) -# define nd8irref FNAME(D8IRREF) -# define nd8iwref FNAME(D8IWREF) -# define nd8inims FNAME(D8INIMS) -# define nd8lref FNAME(D8LREF) -# define ndfr8lastref FNAME(DFR8LASTREF) -# define ndfr8setpalette FNAME(DFR8SETPALETTE) -# define ndfr8restart FNAME(DFR8RESTART) -# define nd8scomp FNAME(D8SCOMP) -# define ndfr8scompress FNAME(DFR8SCOMPRESS) -# define nd8sjpeg FNAME(D8SJPEG) -# define ndfr8sjpeg FNAME(DFR8SJPEG) -#else /* !DF_CAPFNAMES */ -# define nd8spal FNAME(d8spal) -# define nd8first FNAME(d8first) -# define nd8igdim FNAME(d8igdim) -# define nd8igimg FNAME(d8igimg) -# define nd8ipimg FNAME(d8ipimg) -# define nd8iaimg FNAME(d8iaimg) -# define nd8irref FNAME(d8irref) -# define nd8iwref FNAME(d8iwref) -# define nd8inims FNAME(d8inims) -# define nd8lref FNAME(d8lref) -# define ndfr8lastref FNAME(dfr8lastref) -# define ndfr8setpalette FNAME(dfr8setpalette) -# define ndfr8restart FNAME(dfr8restart) -# define nd8scomp FNAME(d8scomp) -# define ndfr8scompress FNAME(dfr8scompress) -# define nd8sjpeg FNAME(d8sjpeg) -# define ndfr8sjpeg FNAME(dfr8sjpeg) -#endif /* DF_CAPFNAMES */ -#endif /* DFR8_FNAMES */ - - HDFLIBAPI FRETVAL(intf) nd8spal - (_fcd pal); - - HDFLIBAPI FRETVAL(intf) nd8first - (void); - - HDFLIBAPI FRETVAL(intf) nd8igdim - (_fcd filename, intf * xdim, intf * ydim, intf * ispal, - intf * lenfn); - - HDFLIBAPI FRETVAL(intf) nd8igimg - (_fcd filename, _fcd image, intf * xdim, intf * ydim, - _fcd pal, intf * lenfn); - - HDFLIBAPI FRETVAL(intf) nd8ipimg - (_fcd filename, _fcd image, intf * xdim, intf * ydim, - intf * compress, intf * lenfn); - - HDFLIBAPI FRETVAL(intf) nd8iaimg - (_fcd filename, _fcd image, intf * xdim, intf * ydim, - intf * compress, intf * lenfn); - - HDFLIBAPI FRETVAL(intf) nd8irref - (_fcd filename, intf * ref, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) nd8iwref - (_fcd filename, intf * ref, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) nd8inims - (_fcd filename, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) nd8lref - (void); - - HDFLIBAPI FRETVAL(intf) ndfr8lastref - (void); - - HDFLIBAPI FRETVAL(intf) ndfr8setpalette - (_fcd pal); - - HDFLIBAPI FRETVAL(intf) ndfr8restart - (void); - - HDFLIBAPI FRETVAL(intf) nd8scomp - (intf * scheme); - - HDFLIBAPI FRETVAL(intf) ndfr8scompress - (intf * scheme); - - HDFLIBAPI FRETVAL(intf) nd8sjpeg - (intf * quality, intf * force_baseline); - - HDFLIBAPI FRETVAL(intf) ndfr8sjpeg - (intf * quality, intf * force_baseline); - -/* - ** from dfsdF.c - */ -#ifndef DFSD_FNAMES -# define DFSD_FNAMES -#ifdef DF_CAPFNAMES -# define ndsgdast FNAME(DSGDAST) -# define ndsgdisc FNAME(DSGDISC) -# define ndsgrang FNAME(DSGRANG) -# define ndssdims FNAME(DSSDIMS) -# define ndssdisc FNAME(DSSDISC) -# define ndssrang FNAME(DSSRANG) -# define ndsclear FNAME(DSCLEAR) -# define ndsslens FNAME(DSSLENS) -# define ndsgdiln FNAME(DSGDILN) -# define ndsgdaln FNAME(DSGDALN) -# define ndsfirst FNAME(DSFIRST) -# define ndspslc FNAME(DSPSLC) -# define ndseslc FNAME(DSESLC) -# define ndsgnt FNAME(DSGNT) -# define ndssnt FNAME(DSSNT) -# define ndsigdim FNAME(DSIGDIM) -# define ndsigdat FNAME(DSIGDAT) -# define ndsipdat FNAME(DSIPDAT) -# define ndsiadat FNAME(DSIADAT) -# define ndsigdas FNAME(DSIGDAS) -# define ndsigslc FNAME(DSIGSLC) -# define ndsigdis FNAME(DSIGDIS) -# define ndsisslc FNAME(DSISSLC) -# define ndsisdas FNAME(DSISDAS) -# define ndsisdis FNAME(DSISDIS) -# define ndsirref FNAME(DSIRREF) -# define ndslref FNAME(DSLREF) -# define ndsinum FNAME(DSINUM) -# define ndsip32s FNAME(DSIP32S) -# define ndsscal FNAME(DSSCAL) -# define ndsgcal FNAME(DSGCAL) -# define ndfsdgetdatastrs FNAME(DFSDGETDATASTRS) -# define ndfsdgetdimscale FNAME(DFSDGETDIMSCALE) -# define ndfsdgetrange FNAME(DFSDGETRANGE) -# define ndfsdsetdims FNAME(DFSDSETDIMS) -# define ndfsdsetdimscale FNAME(DFSDSETDIMSCALE) -# define ndfsdsetrange FNAME(DFSDSETRANGE) -# define ndfsdclear FNAME(DFSDCLEAR) -# define ndfsdsetlengths FNAME(DFSDSETLENGTHS) -# define ndfsdgetdimlen FNAME(DFSDGETDIMLEN) -# define ndfsdgetdatalen FNAME(DFSDGETDATALEN) -# define ndfsdrestart FNAME(DFSDRESTART) -# define ndfsdputslice FNAME(DFSDPUTSLICE) -# define ndfsdendslice FNAME(DFSDENDSLICE) -# define ndfsdsetnt FNAME(DFSDSETNT) -# define ndfsdgetnt FNAME(DFSDGETNT) -# define ndfsdlastref FNAME(DFSDLASTREF) -# define ndsiwref FNAME(DSIWREF) -# define ndssfill FNAME(DSSFILL) -# define ndsgfill FNAME(DSGFILL) -# define ndsisslab FNAME(DSISSLAB) -# define ndswslab FNAME(DSWSLAB) -# define ndseslab FNAME(DSESLAB) -# define ndsirslab FNAME(DSIRSLAB) -#else -# define ndsgdast FNAME(dsgdast) -# define ndsgdisc FNAME(dsgdisc) -# define ndsgrang FNAME(dsgrang) -# define ndssdims FNAME(dssdims) -# define ndssdisc FNAME(dssdisc) -# define ndssrang FNAME(dssrang) -# define ndsclear FNAME(dsclear) -# define ndsslens FNAME(dsslens) -# define ndsgdiln FNAME(dsgdiln) -# define ndsgdaln FNAME(dsgdaln) -# define ndsfirst FNAME(dsfirst) -# define ndspslc FNAME(dspslc) -# define ndseslc FNAME(dseslc) -# define ndsgnt FNAME(dsgnt) -# define ndssnt FNAME(dssnt) -# define ndsigdim FNAME(dsigdim) -# define ndsigdat FNAME(dsigdat) -# define ndsipdat FNAME(dsipdat) -# define ndsiadat FNAME(dsiadat) -# define ndsigdas FNAME(dsigdas) -# define ndsigslc FNAME(dsigslc) -# define ndsigdis FNAME(dsigdis) -# define ndsisslc FNAME(dsisslc) -# define ndsisdas FNAME(dsisdas) -# define ndsisdis FNAME(dsisdis) -# define ndsirref FNAME(dsirref) -# define ndslref FNAME(dslref) -# define ndsinum FNAME(dsinum) -# define ndsip32s FNAME(dsip32s) -# define ndsscal FNAME(dsscal) -# define ndsgcal FNAME(dsgcal) -# define ndfsdgetdatastrs FNAME(dfsdgetdatastrs) -# define ndfsdgetdimscale FNAME(dfsdgetdimscale) -# define ndfsdgetrange FNAME(dfsdgetrange) -# define ndfsdsetdims FNAME(dfsdsetdims) -# define ndfsdsetdimscale FNAME(dfsdsetdimscale) -# define ndfsdsetrange FNAME(dfsdsetrange) -# define ndfsdclear FNAME(dfsdclear) -# define ndfsdsetlengths FNAME(dfsdsetlengths) -# define ndfsdgetdimlen FNAME(dfsdgetdimlen) -# define ndfsdgetdatalen FNAME(dfsdgetdatalen) -# define ndfsdrestart FNAME(dfsdrestart) -# define ndfsdputslice FNAME(dfsdputslice) -# define ndfsdendslice FNAME(dfsdendslice) -# define ndfsdsetnt FNAME(dfsdsetnt) -# define ndfsdgetnt FNAME(dfsdgetnt) -# define ndfsdlastref FNAME(dfsdlastref) -# define ndsiwref FNAME(dsiwref) -# define ndssfill FNAME(dssfill) -# define ndsgfill FNAME(dsgfill) -# define ndsisslab FNAME(dsisslab) -# define ndswslab FNAME(dswslab) -# define ndseslab FNAME(dseslab) -# define ndsirslab FNAME(dsirslab) -#endif /* DF_CAPFNAMES */ -#endif /* DFSD_FNAMES */ - - HDFLIBAPI FRETVAL(intf) ndsgdisc - (intf * dim, intf * maxsize, void * scale); - - HDFLIBAPI FRETVAL(intf) ndsgrang - (void * pmax, void * pmin); - - HDFLIBAPI FRETVAL(intf) ndssdims - (intf * rank, intf dimsizes[]); - - HDFLIBAPI FRETVAL(intf) ndssdisc - (intf * dim, intf * dimsize, void * scale); - - HDFLIBAPI FRETVAL(intf) ndssrang - (void * max, void * min); - - HDFLIBAPI FRETVAL(intf) ndsclear - (void); - - HDFLIBAPI FRETVAL(intf) ndsslens - (intf * maxlen_label, intf * maxlen_unit, - intf * maxlen_format, intf * maxlen_coordsys); - - HDFLIBAPI FRETVAL(intf) ndsgdiln - (intf * dim, intf * llabel, intf * lunit, - intf * lformat); - - HDFLIBAPI FRETVAL(intf) ndsgdaln - (intf * llabel, intf * lunit, intf * lformat, - intf * lcoordsys); - - HDFLIBAPI FRETVAL(intf) ndsfirst - (void); - - HDFLIBAPI FRETVAL(intf) ndspslc - (intf windims[], void * data, intf dims[]); - - HDFLIBAPI FRETVAL(intf) ndseslc - (void); - - HDFLIBAPI FRETVAL(intf) ndssnt - (intf * numbertype); - - HDFLIBAPI FRETVAL(intf) ndsgnt - (intf * pnumbertype); - - HDFLIBAPI FRETVAL(intf) ndsigdim - (_fcd filename, intf * prank, intf sizes[], - intf * maxrank, intf * lenfn); - - HDFLIBAPI FRETVAL(intf) ndsigdat - (_fcd filename, intf * rank, intf maxsizes[], - void * data, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndsipdat - (_fcd filename, intf * rank, intf dimsizes[], - void * data, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndsiadat - (_fcd filename, intf * rank, intf dimsizes[], - void * data, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndsigslc - (_fcd filename, intf winst[], intf windims[], - void * data, intf dims[], intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndsisslc - (_fcd filename, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndsirref - (_fcd filename, intf * ref, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndslref - (void); - - HDFLIBAPI FRETVAL(intf) ndsinum - (_fcd filename, intf * len); - - HDFLIBAPI FRETVAL(intf) ndsip32s - (_fcd filename, intf * ref, intf * ispre32, intf * len); - - HDFLIBAPI FRETVAL(intf) ndfsdgetdatastrs - (_fcd label, _fcd unit, _fcd format, _fcd coordsys); - - HDFLIBAPI FRETVAL(intf) ndfsdgetdimstrs - (intf * dim, _fcd label, _fcd unit, _fcd format); - - HDFLIBAPI FRETVAL(intf) ndfsdgetdimscale - (intf * dim, intf * maxsize, void * scale); - - HDFLIBAPI FRETVAL(intf) ndfsdgetrange - (void * pmax, void * pmin); - - HDFLIBAPI FRETVAL(intf) ndfsdsetdims - (intf * rank, intf dimsizes[]); - - HDFLIBAPI FRETVAL(intf) ndfsdsetdimscale - (intf * dim, intf * dimsize, void * scale); - - HDFLIBAPI FRETVAL(intf) ndfsdsetrange - (void * max, void * min); - - HDFLIBAPI FRETVAL(intf) ndfsdclear - (void); - - HDFLIBAPI FRETVAL(intf) ndfsdsetlengths - (intf * maxlen_label, intf * maxlen_unit, - intf * maxlen_format, intf * maxlen_coordsys); - - HDFLIBAPI FRETVAL(intf) ndfsdgetdimlen - (intf * dim, intf * llabel, intf * lunit, - intf * lformat); - - HDFLIBAPI FRETVAL(intf) ndfsdgetdatalen - (intf * llabel, intf * lunit, intf * lformat, - intf * lcoordsys); - - HDFLIBAPI FRETVAL(intf) ndfsdrestart - (void); - - HDFLIBAPI FRETVAL(intf) ndfsdputslice - (intf windims[], void * data, intf dims[]); - - HDFLIBAPI FRETVAL(intf) ndfsdendslice - (void); - - HDFLIBAPI FRETVAL(intf) ndfsdsetnt - (intf * numbertype); - - HDFLIBAPI FRETVAL(intf) ndfsdgetnt - (intf * pnumbertype); - - HDFLIBAPI FRETVAL(intf) ndfsdlastref - (void); - - HDFLIBAPI FRETVAL(intf) ndsisdis - (intf * dim, _fcd flabel, _fcd funit, _fcd fformat, - intf * llabel, intf * lunit, intf * lformat); - - HDFLIBAPI FRETVAL(intf) ndsigdis - (intf * dim, _fcd label, _fcd unit, _fcd format, - intf * llabel, intf * lunit, intf * lformat); - - HDFLIBAPI FRETVAL(intf) ndsisdas - (_fcd flabel, _fcd funit, _fcd fformat, _fcd fcoordsys, - intf * isfortran, intf * llabel, intf * lunit, - intf * lformat, intf * lcoordsys); - - HDFLIBAPI FRETVAL(intf) ndsigdas - (_fcd label, _fcd unit, _fcd format, _fcd coordsys, intf * llabel, - intf * lunit, intf * lformat, intf * lcoord); - - HDFLIBAPI FRETVAL(intf) ndsscal - (float64 * cal, float64 * cal_err, float64 * ioff, - float64 * ioff_err, intf * cal_type); - - HDFLIBAPI FRETVAL(intf) ndsgcal - (float64 * cal, float64 * cal_err, float64 * ioff, - float64 * ioff_err, intf * cal_type); - - HDFLIBAPI FRETVAL(intf) ndswref - (_fcd filename, intf * fnlen, intf * ref); - - HDFLIBAPI FRETVAL(intf) ndssfill - (void * fill_value); - - HDFLIBAPI FRETVAL(intf) ndsgfill - (void * fill_value); - - HDFLIBAPI FRETVAL(intf) ndssslab - (_fcd filename, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndswslab - (intf start[], intf stride[], - intf cont[], void * data); - - HDFLIBAPI FRETVAL(intf) ndseslab - (void); - - HDFLIBAPI FRETVAL(intf) ndsiwref - (_fcd filename, intf * fnlen, intf * ref); - - HDFLIBAPI FRETVAL(intf) ndsisslab - (_fcd filename, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndsirslab - (_fcd filename, intf * fnlen, intf start[], intf slab_size[], - intf stride[], void * buffer, intf buffer_size[]); - -/* - ** from dfpF.c - */ - -#ifndef DFP_FNAMES -# define DFP_FNAMES -#ifdef DF_CAPFNAMES -# define ndpigpal FNAME(DPIGPAL) -# define ndpippal FNAME(DPIPPAL) -# define ndpinpal FNAME(DPINPAL) -# define ndpiwref FNAME(DPIWREF) -# define ndpirref FNAME(DPIRREF) -# define ndprest FNAME(DPREST) -# define ndplref FNAME(DPLREF) -# define ndfprestart FNAME(DFPRESTART) -# define ndfplastref FNAME(DFPLASTREF) -#else /* !DF_CAPNAMES */ -# define ndpigpal FNAME(dpigpal) -# define ndpippal FNAME(dpippal) -# define ndpinpal FNAME(dpinpal) -# define ndpiwref FNAME(dpiwref) -# define ndpirref FNAME(dpirref) -# define ndprest FNAME(dprest) -# define ndplref FNAME(dplref) -# define ndfprestart FNAME(dfprestart) -# define ndfplastref FNAME(dfplastref) -#endif /* DF_CAPFNAMES */ -#endif /* DFP_FNAMES */ - - HDFLIBAPI FRETVAL(intf) ndpigpal - (_fcd filename, _fcd pal, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndpippal - (_fcd filename, _fcd pal, intf * overwrite, _fcd filemode, - intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndpinpal - (_fcd filename, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndpirref - (_fcd filename, intf * ref, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndpiwref - (_fcd filename, intf * ref, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) ndprest - (void); - - HDFLIBAPI FRETVAL(intf) ndplref - (void); - - HDFLIBAPI FRETVAL(intf) ndfprestart - (void); - - HDFLIBAPI FRETVAL(intf) ndfplastref - (void); - -/* - ** from df24F.c - */ -#ifndef DF24_FNAMES -# define DF24_FNAMES -#ifdef DF_CAPFNAMES -# define nd2reqil FNAME(D2REQIL) -# define ndf24reqil FNAME(DF24REQIL) -# define nd2sdims FNAME(D2SDIMS) -# define ndf24setdims FNAME(DF24SETDIMS) -# define nd2setil FNAME(D2SETIL) -# define ndf24setil FNAME(DF24SETIL) -# define nd2first FNAME(D2FIRST) -# define ndf24restart FNAME(DF24RESTART) -# define nd2igdim FNAME(D2IGDIM) -# define nd2igimg FNAME(D2IGIMG) -# define nd2iaimg FNAME(D2IAIMG) -# define nd2irref FNAME(D2IRREF) -# define nd2inimg FNAME(D2INIMG) -# define nd2lref FNAME(D2LREF) -# define nd2scomp FNAME(D2SCOMP) -# define ndf24scompress FNAME(DF24SCOMPRESS) -# define nd2sjpeg FNAME(D2SJPEG) -# define ndf24sjpeg FNAME(DF24SJPEG) -#else -# define nd2reqil FNAME(d2reqil) -# define ndf24reqil FNAME(df24reqil) -# define nd2sdims FNAME(d2sdims) -# define ndf24setdims FNAME(df24setdims) -# define nd2setil FNAME(d2setil) -# define ndf24setil FNAME(df24setil) -# define nd2first FNAME(d2first) -# define ndf24restart FNAME(df24restart) -# define nd2igdim FNAME(d2igdim) -# define nd2igimg FNAME(d2igimg) -# define nd2iaimg FNAME(d2iaimg) -# define nd2irref FNAME(d2irref) -# define nd2inimg FNAME(d2inimg) -# define nd2lref FNAME(d2lref) -# define nd2scomp FNAME(d2scomp) -# define ndf24scompress FNAME(df24scompress) -# define nd2sjpeg FNAME(d2sjpeg) -# define ndf24sjpeg FNAME(df24sjpeg) -#endif /* DF_CAPFNAMES */ -#endif /* DF24_FNAMES */ - - HDFLIBAPI FRETVAL(intf) nd2reqil - (intf * il); - - HDFLIBAPI FRETVAL(intf) nd2sdims - (intf * xdim, intf * ydim); - - HDFLIBAPI FRETVAL(intf) nd2igdim - (_fcd filename, intf * pxdim, intf * pydim, intf * pil, - intf * fnlen); - - HDFLIBAPI FRETVAL(intf) nd2igimg - (_fcd filename, _fcd image, intf * xdim, intf * ydim, - intf * fnlen); - - HDFLIBAPI FRETVAL(intf) nd2iaimg - (_fcd filename, _fcd image, intf * xdim, intf * ydim, - intf * fnlen, intf * newfile); - - HDFLIBAPI FRETVAL(intf) nd2setil - (intf * il); - - HDFLIBAPI FRETVAL(intf) nd2first - (void); - - HDFLIBAPI FRETVAL(intf) ndf24reqil - (intf * il); - - HDFLIBAPI FRETVAL(intf) ndf24setdims - (intf * xdim, intf * ydim); - - HDFLIBAPI FRETVAL(intf) ndf24setil - (intf * il); - - HDFLIBAPI FRETVAL(intf) ndf24restart - (void); - - HDFLIBAPI FRETVAL(intf) nd2irref - (_fcd filename, intf * ref, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) nd2inimg - (_fcd filename, intf * fnlen); - - HDFLIBAPI FRETVAL(intf) nd2lref - (void); - - HDFLIBAPI FRETVAL(intf) nd2scomp - (intf * scheme); - - HDFLIBAPI FRETVAL(intf) ndf24scompress - (intf * scheme); - - HDFLIBAPI FRETVAL(intf) nd2sjpeg - (intf * quality, intf * force_baseline); - - HDFLIBAPI FRETVAL(intf) ndf24sjpeg - (intf * quality, intf * force_baseline); - -/* - ** from dfF.c - */ -#ifndef DF_FNAMES -# define DF_FNAMES -#ifdef DF_CAPFNAMES -# define ndfiaccess FNAME(DFIACCESS) -# define ndfiopen FNAME(DFIOPEN) -# define ndfclose FNAME(DFCLOSE) -# define ndfdesc FNAME(DFDESC) -# define ndfdup FNAME(DFDUP) -# define ndfdel FNAME(DFDEL) -# define ndfstart FNAME(DFSTART) -# define ndfread FNAME(DFREAD) -# define ndfseek FNAME(DFSEEK) -# define ndfwrite FNAME(DFWRITE) -# define ndfupdate FNAME(DFUPDATE) -# define ndfget FNAME(DFGET) -# define ndfput FNAME(DFPUT) -# define ndfsfind FNAME(DFSFIND) -# define ndffind FNAME(DFFIND) -# define ndferrno FNAME(DFERRNO) -# define ndfnewref FNAME(DFNEWREF) -# define ndfnumber FNAME(DFNUMBER) -# define ndfstat FNAME(DFSTAT) -# define ndfiishdf FNAME(DFIISHDF) -#else /* !DF_CAPFNAMES */ -# define ndfiaccess FNAME(dfiaccess) -# define ndfiopen FNAME(dfiopen) -# define ndfclose FNAME(dfclose) -# define ndfdesc FNAME(dfdesc) -# define ndfdup FNAME(dfdup) -# define ndfdel FNAME(dfdel) -# define ndfstart FNAME(dfstart) -# define ndfread FNAME(dfread) -# define ndfseek FNAME(dfseek) -# define ndfwrite FNAME(dfwrite) -# define ndfupdate FNAME(dfupdate) -# define ndfget FNAME(dfget) -# define ndfput FNAME(dfput) -# define ndfsfind FNAME(dfsfind) -# define ndffind FNAME(dffind) -# define ndferrno FNAME(dferrno) -# define ndfnewref FNAME(dfnewref) -# define ndfnumber FNAME(dfnumber) -# define ndfstat FNAME(dfstat) -# define ndfiishdf FNAME(dfiishdf) -#endif /* DF_CAPFNAMES */ -#endif /* DF_FNAMES */ - - HDFLIBAPI FRETVAL(intf) ndfiopen - (_fcd name, intf * acc_mode, intf * defdds, intf * namelen); - - HDFLIBAPI FRETVAL(intf) ndfclose - (intf * dfile); - - HDFLIBAPI FRETVAL(intf) ndfdesc - (intf * dfile, intf ptr[][4], intf * begin, - intf * num); - - HDFLIBAPI FRETVAL(intf) ndfdup - (intf * dfile, intf * tag, intf * ref, intf * otag, - intf * oref); - - HDFLIBAPI FRETVAL(intf) ndfdel - (intf * dfile, intf * tag, intf * ref); - - HDFLIBAPI FRETVAL(intf) ndfiaccess - (intf * dfile, intf * tag, intf * ref, _fcd acc_mode, intf * acclen); - - HDFLIBAPI FRETVAL(intf) ndfstart - (intf * dfile, intf * tag, intf * ref, char * acc_mode); - - HDFLIBAPI FRETVAL(intf) ndfread - (intf * dfile, _fcd ptr, intf * len); - - HDFLIBAPI FRETVAL(intf) ndfseek - (intf * dfile, intf * offset); - - HDFLIBAPI FRETVAL(intf) ndfwrite - (intf * dfile, _fcd ptr, intf * len); - - HDFLIBAPI FRETVAL(intf) ndfupdate - (intf * dfile); - - HDFLIBAPI FRETVAL(intf) ndfget - (intf * dfile, intf * tag, intf * ref, _fcd ptr); - - HDFLIBAPI FRETVAL(intf) ndfput - (intf * dfile, intf * tag, intf * ref, _fcd ptr, intf * len); - - HDFLIBAPI FRETVAL(intf) ndfsfind - (intf * dfile, intf * tag, intf * ref); - - HDFLIBAPI FRETVAL(intf) ndffind - (intf * dfile, intf * itag, intf * iref, intf * len); - - HDFLIBAPI FRETVAL(intf) ndferrno - (void); - - HDFLIBAPI FRETVAL(intf) ndfnewref - (intf * dfile); - - HDFLIBAPI FRETVAL(intf) ndfnumber - (intf * dfile, intf * tag); - - HDFLIBAPI FRETVAL(intf) ndfiishdf - (_fcd name, intf * namelen); - -/* - ** from dfutil.c - */ - HDFLIBAPI uint16 DFfindnextref - (int32 file_id, uint16 tag, uint16 lref); - -/* - ** from dfutilF.c - */ -#ifndef DFUTIL_FNAMES -# define DFUTIL_FNAMES -#ifdef DF_CAPFNAMES -# define ndfindnr FNAME(DFINDNR) -# define ndffindnextref FNAME(DFFINDNEXTREF) -#else -# define ndfindnr FNAME(dfindnr) -# define ndffindnextref FNAME(dffindnextref) -#endif /* DF_CAPFNAMES */ -#endif /* DFUTIL_FNAMES */ - - HDFLIBAPI FRETVAL(intf) ndfindnr - (intf * dfile, intf * tag, intf * lref); - - HDFLIBAPI FRETVAL(intf) ndffindnextref - (intf * dfile, intf * tag, intf * lref); - -/* - ** from herrF.c - */ -#ifndef HERR_FNAMES -# define HERR_FNAMES -#ifdef DF_CAPFNAMES -# define nheprnt FNAME(HEPRNT) -# define nheprntc FNAME(HEPRNTC) -# define nhestringc FNAME(HESTRINGC) -#else -# define nheprnt FNAME(heprnt) -# define nheprntc FNAME(heprntc) -# define nhestringc FNAME(hestringc) -#endif /* DF_CAPFNAMES */ -#endif /* HERR_FNAMES */ - - HDFLIBAPI FRETVAL(void) nheprnt - (intf * print_levels); - - HDFLIBAPI FRETVAL(intf) nheprntc - (_fcd filename, intf * print_levels, intf *namelen); - - HDFLIBAPI FRETVAL(intf) nhestringc - (intf *error_code,_fcd error_message, intf *len); -/* - ** from hfileF.c - */ -#ifndef HFILE_FNAMES -# define HFILE_FNAMES -#ifdef DF_CAPFNAMES -# if defined(UNIX386) || (!(defined INTEL86) && !(defined WIN32)) -# define nhiopen FNAME(HIOPEN) -# define nhclose FNAME(HCLOSE) -# define nhnumber FNAME(HNUMBER) -# define nhxisdir FNAME(HXISDIR) -# define nhxiscdir FNAME(HXISCDIR) -# define nhddontatexit FNAME(HDDONTATEXIT) -# define nhglibverc FNAME(HGLIBVERC) -# define nhgfilverc FNAME(HGFILVERC) -# define nhiishdf FNAME(HIISHDF) -# else /* !sl */ -# define nhiopen FNAME(HIOPEN) -# define nhiclose FNAME(HICLOSE) -# define nhinumbr FNAME(HINUMBR) -# define nhxisdir FNAME(HXISDIR) -# define nhxiscdir FNAME(HXISCDIR) -# define nhddontatexit FNAME(HDDONTATEXIT) -# define nhglibverc FNAME(HGLIBVERC) -# define nhgfilverc FNAME(HGFILVERC) -# define nhiishdf FNAME(HIISHDF) -# endif - -#else -# if defined(UNIX386) || (!(defined INTEL86) && !(defined WIN32)) -# define nhiopen FNAME(hiopen) -# define nhclose FNAME(hclose) -# define nhnumber FNAME(hnumber) -# define nhxisdir FNAME(hxisdir) -# define nhxiscdir FNAME(hxiscdir) -# define nhddontatexit FNAME(hddontatexit) -# define nhglibverc FNAME(hglibverc) -# define nhgfilverc FNAME(hgfilverc) -# define nhiishdf FNAME(hiishdf) -# else /* !sl */ -# define nhiopen FNAME(hiopen) -# define nhiclose FNAME(hiclose) -# define nhinumbr FNAME(hinumbr) -# define nhxisdir FNAME(hxisdir) -# define nhxiscdir FNAME(hxiscdir) -# define nhddontatexit FNAME(hddontatexit) -# define nhglibverc FNAME(hglibverc) -# define nhgfilverc FNAME(hgfilverc) -# define nhiishdf FNAME(hiishdF) -# endif - -#endif /* DF_CAPFNAMES */ -#endif /* HFILE_FNAMES */ - - HDFLIBAPI FRETVAL(intf) nhiopen - (_fcd name, intf * acc_mode, intf * defdds, intf * namelen); - - HDFLIBAPI FRETVAL(intf) nhclose - (intf * file_id); - - HDFLIBAPI FRETVAL(intf) nhnumber - (intf * file_id, intf * tag); - - HDFLIBAPI FRETVAL(intf) nhxisdir - (_fcd dir, intf * dirlen); - - HDFLIBAPI FRETVAL(intf) nhxiscdir - (_fcd dir, intf * dirlen); - - HDFLIBAPI FRETVAL(intf) - nhddontatexit(void); - - HDFLIBAPI FRETVAL(intf) - nhglibverc(intf *major_v, intf *minor_v, intf *release, - _fcd string, intf *len); - - HDFLIBAPI FRETVAL(intf) - nhgfilverc(intf *file_id, intf *major_v, intf *minor_v, - intf *release, _fcd string, intf *len); - - HDFLIBAPI FRETVAL(intf) nhiishdf - (_fcd name, intf * namelen); - - - -/* - ** from dfufp2im.c - */ -#ifndef DFUFP2I_FNAMES -# define DFUFP2I_FNAMES -#ifdef DF_CAPFNAMES -# define nduif2i FNAME(DUIF2I) -#else -# define nduif2i FNAME(duif2i) -#endif /* DF_CAPFNAMES */ -#endif /* DFUFP2I_FNAMES */ - - HDFLIBAPI FRETVAL(int) nduif2i - (int32 * hdim, int32 * vdim, float32 * max, - float32 * min, float32 hscale[], float32 vscale[], - float32 data[], _fcd palette, _fcd outfile, - int * ct_method, int32 * hres, int32 * vres, - int * compress, int * lenfn); - - HDFLIBAPI int DFUfptoimage - (int32 hdim, int32 vdim, float32 max, float32 min, - float32 * hscale, float32 * vscale, float32 * data, - uint8 * palette, char * outfile, int ct_method, - int32 hres, int32 vres, int compress); - -/* for Multi-file fortran Annotation inteface */ -#ifndef MFAN_FNAMES -# define MFAN_FNAMES -#ifdef DF_CAPFNAMES -# if defined(UNIX386) || (!(defined INTEL86) && !(defined WIN32)) -# define nafstart FNAME(AFSTART) -# define naffileinfo FNAME(AFFILEINFO) -# define nafend FNAME(AFEND) -# define nafcreate FNAME(AFCREATE) -# define naffcreate FNAME(AFFCREATE) -# define nafselect FNAME(AFSELECT) -# define nafnumann FNAME(AFNUMANN) -# define nafannlist FNAME(AFANNLIST) -# define nafannlen FNAME(AFANNLEN) -# define nafwriteann FNAME(AFWRITEANN) -# define nafreadann FNAME(AFREADANN) -# define nafendaccess FNAME(AFENDACCESS) -# define nafgettagref FNAME(AFGETTAGREF) -# define nafidtagref FNAME(AFIDTAGREF) -# define naftagrefid FNAME(AFTAGREFID) -# define nafatypetag FNAME(AFATYPETAG) -# define naftagatype FNAME(AFTAGATYPE) -# else /* !sl */ -# define nafistart FNAME(AFISTART) -# define nafifinf FNAME(AFIFINF) -# define nafiend FNAME(AFIEND) -# define naficreat FNAME(AFICREAT) -# define nafifcreat FNAME(AFIFCREAT) -# define nafiselct FNAME(AFISELCT) -# define nafinann FNAME(AFINANN) -# define nafialst FNAME(AFIALST) -# define nafialen FNAME(AFIALEN) -# define nafiwann FNAME(AFIWANN) -# define nafirann FNAME(AFIRANN) -# define nafiendac FNAME(AFIENDAC) -# define nafigtr FNAME(AFIGTR) -# define nafiid2tr FNAME(AFIID2TR) -# define nafitr2id FNAME(AFITR2ID) -# define nafitp2tg FNAME(AFITP2TG) -# define nafitg2tp FNAME(AFITG2TP) -# endif -#else /* !DF_CAPFNAMES */ -# if defined(UNIX386) || (!(defined INTEL86) && !(defined WIN32)) -# define nafstart FNAME(afstart) -# define naffileinfo FNAME(affileinfo) -# define nafend FNAME(afend) -# define nafcreate FNAME(afcreate) -# define naffcreate FNAME(affcreate) -# define nafselect FNAME(afselect) -# define nafnumann FNAME(afnumann) -# define nafannlist FNAME(afannlist) -# define nafannlen FNAME(afannlen) -# define nafwriteann FNAME(afwriteann) -# define nafreadann FNAME(afreadann) -# define nafendaccess FNAME(afendaccess) -# define nafgettagref FNAME(afgettagref) -# define nafidtagref FNAME(afidtagref) -# define naftagrefid FNAME(aftagrefid) -# define nafatypetag FNAME(afatypetag) -# define naftagatype FNAME(aftagatype) -# else /* !sl */ -# define nafistart FNAME(afistart) -# define nafifinf FNAME(afifinf) -# define nafiend FNAME(afiend) -# define naficreat FNAME(aficreat) -# define nafifcreat FNAME(afifcreat) -# define nafiselct FNAME(afiselct) -# define nafinann FNAME(afinamm) -# define nafialst FNAME(afialst) -# define nafialen FNAME(afialen) -# define nafiwann FNAME(afiwann) -# define nafirann FNAME(afirann) -# define nafiendac FNAME(afiendac) -# define nafigtr FNAME(afigtr) -# define nafiid2tr FNAME(afiid2tr) -# define nafitr2id FNAME(afitr2id) -# define nafitp2tg FNAME(afitp2tg) -# define nafitg2tp FNAME(afitg2tp) -# endif -#endif /* DF_CAPFNAMES */ -#endif /* MFAN_FNAMES */ - -/* Multi-file Annotation C-stubs for fortan interface found in mfanf.c */ - -HDFLIBAPI FRETVAL(intf) -nafstart(intf *file_id); - -HDFLIBAPI FRETVAL(intf) -naffileinfo(intf *an_id, intf *num_flabel, intf *num_fdesc, intf *num_olabel, - intf *num_odesc); - -HDFLIBAPI FRETVAL(intf) -nafend(intf *an_id); - -HDFLIBAPI FRETVAL(intf) -nafcreate(intf *an_id, intf *etag, intf *eref, intf *atype); - -HDFLIBAPI FRETVAL(intf) -naffcreate(intf *an_id, intf *atype); - -HDFLIBAPI FRETVAL(intf) -nafselect(intf *an_id, intf *idx, intf *atype); - -HDFLIBAPI FRETVAL(intf) -nafnumann(intf *an_id, intf *atype, intf *etag, intf *eref); - -HDFLIBAPI FRETVAL(intf) -nafannlist(intf *an_id, intf *atype, intf *etag, intf *eref, intf alist[]); - -HDFLIBAPI FRETVAL(intf) -nafannlen(intf *ann_id); - -HDFLIBAPI FRETVAL(intf) -nafwriteann(intf *ann_id,_fcd ann, intf *annlen); - -HDFLIBAPI FRETVAL(intf) -nafreadann(intf *ann_id,_fcd ann, intf *maxlen); - -HDFLIBAPI FRETVAL(intf) -nafendaccess(intf *ann_id); - -HDFLIBAPI FRETVAL(intf) -nafgettagref(intf *an_id, intf *idx, intf *type, intf *tag, intf *ref); - -HDFLIBAPI FRETVAL(intf) -nafidtagref(intf *ann_id, intf *tag, intf *ref); - -HDFLIBAPI FRETVAL(intf) -naftagrefid(intf *an_id, intf *tag, intf *ref); - -HDFLIBAPI FRETVAL(intf) -nafatypetag(intf *atype); - -HDFLIBAPI FRETVAL(intf) -naftagatype(intf *tag); - -/* Multi-file Annotation C-routines found in mfan.c */ -HDFLIBAPI int32 ANstart(int32 file_id); - -HDFLIBAPI intn ANfileinfo(int32 an_id, int32 *n_file_label, int32 *n_file_desc, - int32 *n_obj_label, int32 *n_obj_desc); - -HDFLIBAPI int32 ANend(int32 an_id); - -HDFLIBAPI int32 ANcreate(int32 an_id, uint16 elem_tag, uint16 elem_ref, - ann_type type); - -HDFLIBAPI int32 ANcreatef(int32 an_id, ann_type type); - -HDFLIBAPI int32 ANselect(int32 an_id, int32 idx, ann_type type); - -HDFLIBAPI intn ANnumann(int32 an_id, ann_type type, uint16 elem_tag, - uint16 elem_ref); - -HDFLIBAPI intn ANannlist(int32 an_id, ann_type type, uint16 elem_tag, - uint16 elem_ref, int32 ann_list[]); - -HDFLIBAPI int32 ANannlen(int32 ann_id); - -HDFLIBAPI int32 ANwriteann(int32 ann_id, const char *ann, int32 annlen); - -HDFLIBAPI int32 ANreadann(int32 ann_id, char *ann, int32 maxlen); - -HDFLIBAPI intn ANendaccess(int32 ann_id); - -HDFLIBAPI int32 ANget_tagref(int32 an_id, int32 idx, ann_type type, - uint16 *ann_tag, uint16 *ann_ref); - -HDFLIBAPI int32 ANid2tagref(int32 an_id, uint16 *ann_tag, uint16 *ann_ref); - -HDFLIBAPI int32 ANtagref2id(int32 an_id, uint16 ann_tag, uint16 ann_ref); - -HDFLIBAPI uint16 ANatype2tag(ann_type atype); - -HDFLIBAPI ann_type ANtag2atype(uint16 atag); - -HDFLIBAPI intn ANdestroy(void); - -/* for Multi-file fortran GR interface */ -#ifndef MFGR_FNAMES -# define MFGR_FNAMES -#ifdef DF_CAPFNAMES -# if defined(UNIX386) || (!(defined INTEL86) && !(defined WIN32)) -# define nmgstart FNAME(MGSTART) -# define nmgfinfo FNAME(MGFINFO) -# define nmgend FNAME(MGEND) -# define nmgicreat FNAME(MGICREAT) -# define nmgselct FNAME(MGSELCT) -# define nmgin2ndx FNAME(MGIN2NDX) -# define nmggiinf FNAME(MGGIINF) -# define nmgwcimg FNAME(MGWCIMG) -# define nmgrcimg FNAME(MGRCIMG) -# define nmgwrimg FNAME(MGWRIMG) -# define nmgrdimg FNAME(MGRDIMG) -# define nmgendac FNAME(MGENDAC) -# define nmgid2rf FNAME(MGID2RF) -# define nmgr2idx FNAME(MGR2IDX) -# define nmgrltil FNAME(MGRLTIL) -# define nmgrimil FNAME(MGRIMIL) -# define nmggltid FNAME(MGGLTID) -# define nmgglinf FNAME(MGGLINF) -# define nmgwrlut FNAME(MGWRLUT) -# define nmgwclut FNAME(MGWCLUT) -# define nmgrdlut FNAME(MGRDLUT) -# define nmgrclut FNAME(MGRCLUT) -# define nmgisxfil FNAME(MGISXFIL) -# define nmgssctp FNAME(MGSACTP) -# define nmgiscatt FNAME(MGISCATT) -# define nmgisattr FNAME(MGISATTR) -# define nmgatinf FNAME(MGATINF) -# define nmggcatt FNAME(MGGCATT) -# define nmggnatt FNAME(MGGNATT) -# define nmggattr FNAME(MGGATTR) -# define nmgifndat FNAME(MGIFNDAT) -# define nmgcgichnk FNAME(MGCGICHNK) -# define nmgcrcchnk FNAME(MGCRCCHNK) -# define nmgcrchnk FNAME(MGCRCHNK) -# define nmgcscchnk FNAME(MGCSCCHNK) -# define nmgcschnk FNAME(MGCSCHNK) -# define nmgcwcchnk FNAME(MGCWCCHNK) -# define nmgcwchnk FNAME(MGCWCHNK) -# define nmgcscompress FNAME(MGCSCOMPRESS) -# define nmgcgcompress FNAME(MGCGCOMPRESS) -# define nmglt2rf FNAME(MGLT2RF) -# define nmgcgnluts FNAME(MGCGNLUTS) -# else /* !sl */ -# define nmgistrt FNAME(MGISTRT) -# define nmgifinf FNAME(MGIFINF) -# define nmgiend FNAME(MGIEND) -# define nmgicreat FNAME(MGICREAT) -# define nmgislct FNAME(MGISLCT) -# define nmgin2ndx FNAME(MGIN2NDX) -# define nmgigiinf FNAME(MGIGIINF) -# define nmgiwcim FNAME(MGIWCIM) -# define nmgircim FNAME(MGIRCIM) -# define nmgiwimg FNAME(MGIWIMG) -# define nmgirimg FNAME(MGIRIMG) -# define nmgiendac FNAME(MGIENDAC) -# define nmgiid2r FNAME(MGIID2R) -# define nmgir2dx FNAME(MGIR2DX) -# define nmgiltil FNAME(MGILTIL) -# define nmgiimil FNAME(MGIIMIL) -# define nmgiglid FNAME(MGIGLID) -# define nmgiglinf FNAME(MGIGLINF) -# define nmgiwrlt FNAME(MGIWRLT) -# define nmgiwclt FNAME(MGIWCLT) -# define nmgirdlt FNAME(MGIRDLT) -# define nmgirclt FNAME(MGIRCLT) -# define nmgisxfil FNAME(MGISXFIL) -# define nmgiactp FNAME(MGIACTP) -# define nmgiscatt FNAME(MGISCATT) -# define nmgisattr FNAME(MGISATTR) -# define nmgiainf FNAME(MGIAINF) -# define nmgigcat FNAME(MGIGCAT) -# define nmgignat FNAME(MGIGNAT) -# define nmgigatt FNAME(MGIGATT) -# define nmgifndat FNAME(MGIFNDAT) -# define nmgcgichnk FNAME(MGCGICHNK) -# define nmgcrcchnk FNAME(MGCRCCHNK) -# define nmgcrchnk FNAME(MGCRCHNK) -# define nmgcscchnk FNAME(MGCSCCHNK) -# define nmgcschnk FNAME(MGCSCHNK) -# define nmgcwcchnk FNAME(MGCWCCHNK) -# define nmgcwchnk FNAME(MGCWCHNK) -# define nmgcscompress FNAME(MGCSCOMPRESS) -# define nmgcgcompress FNAME(MGCGCOMPRESS) -# define nmglt2rf FNAME(MGLT2RF) -# define nmgcgnluts FNAME(MGCGNLUTS) -# endif -#else /* !DF_CAPFNAMES */ -# if defined(UNIX386) || (!(defined INTEL86) && !(defined WIN32)) -# define nmgstart FNAME(mgstart) -# define nmgfinfo FNAME(mgfinfo) -# define nmgend FNAME(mgend) -# define nmgicreat FNAME(mgicreat) -# define nmgselct FNAME(mgselct) -# define nmgin2ndx FNAME(mgin2ndx) -# define nmggiinf FNAME(mggiinf) -# define nmgwcimg FNAME(mgwcimg) -# define nmgrcimg FNAME(mgrcimg) -# define nmgwrimg FNAME(mgwrimg) -# define nmgrdimg FNAME(mgrdimg) -# define nmgendac FNAME(mgendac) -# define nmgid2rf FNAME(mgid2rf) -# define nmgr2idx FNAME(mgr2idx) -# define nmgrltil FNAME(mgrltil) -# define nmgrimil FNAME(mgrimil) -# define nmggltid FNAME(mggltid) -# define nmgglinf FNAME(mgglinf) -# define nmgwrlut FNAME(mgwrlut) -# define nmgwclut FNAME(mgwclut) -# define nmgrdlut FNAME(mgrdlut) -# define nmgrclut FNAME(mgrclut) -# define nmgisxfil FNAME(mgisxfil) -# define nmgssctp FNAME(mgsactp) -# define nmgiscatt FNAME(mgiscatt) -# define nmgisattr FNAME(mgisattr) -# define nmgatinf FNAME(mgatinf) -# define nmggcatt FNAME(mggcatt) -# define nmggnatt FNAME(mggnatt) -# define nmggattr FNAME(mggattr) -# define nmgifndat FNAME(mgifndat) -# define nmgcgichnk FNAME(mgcgichnk) -# define nmgcrcchnk FNAME(mgcrcchnk) -# define nmgcrchnk FNAME(mgcrchnk) -# define nmgcscchnk FNAME(mgcscchnk) -# define nmgcschnk FNAME(mgcschnk) -# define nmgcwcchnk FNAME(mgcwcchnk) -# define nmgcwchnk FNAME(mgcwchnk) -# define nmgcscompress FNAME(mgcscompress) -# define nmgcgcompress FNAME(mgcgcompress) -# define nmglt2rf FNAME(mglt2rf) -# define nmgcgnluts FNAME(mgcgnluts) -# else /* !sl */ -# define nmgistrt FNAME(mgistrt) -# define nmgifinf FNAME(mgifinf) -# define nmgiend FNAME(mgiend) -# define nmgicreat FNAME(mgicreat) -# define nmgislct FNAME(mgislct) -# define nmgin2ndx FNAME(mgin2ndx) -# define nmgigiinf FNAME(mgigiinf) -# define nmgiwcim FNAME(mgiwcim) -# define nmgircim FNAME(mgircim) -# define nmgwimg FNAME(mgiwimg) -# define nmgrimg FNAME(mgirimg) -# define nmgiendac FNAME(mgiendac) -# define nmgiid2r FNAME(mgiid2r) -# define nmgir2dx FNAME(mgir2dx) -# define nmgiltil FNAME(mgiltil) -# define nmgiimil FNAME(mgiimil) -# define nmgiglid FNAME(mgiglid) -# define nmgiglinf FNAME(mgiglinf) -# define nmgiwrlt FNAME(mgiwrlt) -# define nmgiwclt FNAME(mgiwclt) -# define nmgirdlt FNAME(mgirdlt) -# define nmgirclt FNAME(mgirclt) -# define nmgisxfil FNAME(mgisxfil) -# define nmgiactp FNAME(mgiactp) -# define nmgiscatt FNAME(mgiscatt) -# define nmgisattr FNAME(mgisattr) -# define nmgiainf FNAME(mgiainf) -# define nmgigcat FNAME(mgigcat) -# define nmgignat FNAME(mgignat) -# define nmgigatt FNAME(mgigatt) -# define nmgifndat FNAME(mgifndat) -# define nmgcgichnk FNAME(mgcgichnk) -# define nmgcrcchnk FNAME(mgcrcchnk) -# define nmgcrchnk FNAME(mgcrchnk) -# define nmgcscchnk FNAME(mgcscchnk) -# define nmgcschnk FNAME(mgcschnk) -# define nmgcwcchnk FNAME(mgcwcchnk) -# define nmgcwchnk FNAME(mgcwchnk) -# define nmgcscompress FNAME(mgcscompress) -# define nmgcgcompress FNAME(mgcgcompress) -# define nmglt2rf FNAME(mglt2rf) -# define nmgcgnluts FNAME(mgcgnluts) -# endif - -#endif /* DF_CAPFNAMES */ -#endif /* MFGR_FNAMES */ - -/* Multi-file GR C-stubs for FORTRAN interface found in mfgrf.c */ -HDFLIBAPI FRETVAL(intf) /* !sl */ -nmgiwimg(intf * riid, intf *start, intf *stride, intf *count, VOIDP data); - -HDFLIBAPI FRETVAL(intf) /* !sl */ -nmgirimg(intf * riid, intf *start, intf *stride, intf *count, VOIDP data); - -HDFLIBAPI FRETVAL(intf) /* !sl */ -nmgignat(intf * riid, intf *idx, VOIDP data); - -HDFLIBAPI FRETVAL(intf) -nmgstart(intf * fid); - -HDFLIBAPI FRETVAL(intf) -nmgfinfo(intf * grid,intf *n_datasets,intf *n_attrs); - -HDFLIBAPI FRETVAL(intf) -nmgend(intf * grid); - -HDFLIBAPI FRETVAL(intf) -nmgicreat(intf * grid, _fcd name, intf *ncomp, intf *nt, intf *il, intf dimsizes[2], intf *nlen); - -HDFLIBAPI FRETVAL(intf) -nmgselct(intf * grid, intf *idx); - -HDFLIBAPI FRETVAL(intf) -nmgin2ndx(intf * grid, _fcd name, intf *nlen); - -HDFLIBAPI FRETVAL(intf) -nmggiinf(intf * riid, _fcd name, intf *ncomp, intf *nt, intf *il, intf *dimsizes, intf *nattr); - - -HDFLIBAPI FRETVAL(intf) -nmgwcimg(intf * riid, intf *start, intf *stride, intf *count, _fcd data); - -HDFLIBAPI FRETVAL(intf) -nmgrcimg(intf * riid, intf *start, intf *stride, intf *count, _fcd data); - -HDFLIBAPI FRETVAL(intf) -nmgwrimg(intf * riid, intf *start, intf *stride, intf *count, void * data); - -HDFLIBAPI FRETVAL(intf) -nmgrdimg(intf * riid, intf *start, intf *stride, intf *count, void * data); - -HDFLIBAPI FRETVAL(intf) -nmgendac(intf * riid); - -HDFLIBAPI FRETVAL(intf) -nmgid2rf(intf * riid); - -HDFLIBAPI FRETVAL(intf) -nmgr2idx(intf * grid, intf *ref); - -HDFLIBAPI FRETVAL(intf) -nmgrltil(intf * riid, intf *il); - -HDFLIBAPI FRETVAL(intf) -nmgrimil(intf * riid, intf *il); - -HDFLIBAPI FRETVAL(intf) -nmggltid(intf * riid, intf *lut_index); - -HDFLIBAPI FRETVAL(intf) -nmgglinf(intf * lutid, intf *ncomp, intf *nt, intf *il, intf *nentries); - -HDFLIBAPI FRETVAL(intf) -nmgwrlut(intf * lutid, intf *ncomp, intf *nt, intf *il, intf *nentries, void * data); - -HDFLIBAPI FRETVAL(intf) -nmgwclut(intf * lutid, intf *ncomp, intf *nt, intf *il, intf *nentries, _fcd data); - -HDFLIBAPI FRETVAL(intf) -nmgrdlut(intf * lutid, void * data); - -HDFLIBAPI FRETVAL(intf) -nmgrclut(intf * lutid, _fcd data); - -HDFLIBAPI FRETVAL(intf) -nmgisxfil(intf * riid, _fcd filename, intf *offset, intf *nlen); - -HDFLIBAPI FRETVAL(intf) -nmgsactp(intf * riid, intf *accesstype); - -HDFLIBAPI FRETVAL(intf) -nmgiscatt(intf * riid, _fcd name, intf *nt, intf *count, _fcd data, intf *nlen); - -HDFLIBAPI FRETVAL(intf) -nmgisattr(intf * riid, _fcd name, intf *nt, intf *count, void * data, intf *nlen); - -HDFLIBAPI FRETVAL(intf) -nmgatinf(intf * riid, intf *idx, _fcd name, intf *nt, intf *count); - -HDFLIBAPI FRETVAL(intf) -nmggcatt(intf * riid, intf *idx, _fcd data); - -HDFLIBAPI FRETVAL(intf) -nmggnatt(intf * riid, intf *idx, void * data); - -HDFLIBAPI FRETVAL(intf) -nmggattr(intf * riid, intf *idx, void * data); - -HDFLIBAPI FRETVAL(intf) -nmgifndat(intf * riid, _fcd name, intf *nlen); - - HDFLIBAPI FRETVAL (intf) - nmgcgichnk(intf *id, intf *dim_length, intf *flags); - - HDFLIBAPI FRETVAL (intf) - nmgcrcchnk(intf *id, intf *start, _fcd char_data); - - HDFLIBAPI FRETVAL (intf) - nmgcrchnk(intf *id, intf *start, VOIDP num_data); - - HDFLIBAPI FRETVAL (intf) - nmgcscchnk(intf *id, intf *maxcache, intf *flags); - - HDFLIBAPI FRETVAL (intf) - nmgcschnk(intf *id, intf *dim_length, intf *comp_type, - intf *comp_prm); - HDFLIBAPI FRETVAL (intf) - nmgcwcchnk(intf *id, intf *start, _fcd char_data); - - HDFLIBAPI FRETVAL (intf) - nmgcwchnk(intf *id, intf *start, VOIDP num_data); - - HDFLIBAPI FRETVAL (intf) - nmgcscompress(intf *id, intf *comp_type, intf *comp_prm); - - HDFLIBAPI FRETVAL (intf) - nmgcgcompress(intf *id, intf *comp_type, intf *comp_prm); - - HDFLIBAPI FRETVAL (intf) - nmglt2rf(intf *id); - - HDFLIBAPI FRETVAL (intf) - nmgcgnluts(intf *id); - -/* Multi-file Raster C-routines found in mfgr.c */ -HDFLIBAPI intn rigcompare(void * k1, void * k2, intn cmparg); - -HDFLIBAPI int32 GRstart(int32 hdf_file_id); - -HDFLIBAPI intn GRfileinfo(int32 grid,int32 *n_datasets,int32 *n_attrs); - -HDFLIBAPI intn GRend(int32 grid); - -HDFLIBAPI int32 GRcreate(int32 grid,const char *name,int32 ncomp,int32 nt,int32 il, - int32 dimsizes[2]); - -HDFLIBAPI int32 GRselect(int32 grid,int32 idx); - -HDFLIBAPI int32 GRnametoindex(int32 grid,const char *name); - -HDFLIBAPI intn GRgetiminfo(int32 riid,char *name,int32 *ncomp,int32 *nt,int32 *il, - int32 dimsizes[2],int32 *n_attr); - -HDFLIBAPI intn GRgetnluts(int32 riid); - -HDFLIBAPI intn GRwriteimage(int32 riid,int32 start[2],int32 stride[2], - int32 count[2],void * data); - -HDFLIBAPI intn GRreadimage(int32 riid,int32 start[2],int32 stride[2], - int32 count[2],void * data); - -HDFLIBAPI intn GRendaccess(int32 riid); - -HDFLIBAPI uint16 GRidtoref(int32 riid); - -HDFLIBAPI int32 GRreftoindex(int32 grid,uint16 ref); - -HDFLIBAPI intn GRreqlutil(int32 riid,intn il); - -HDFLIBAPI intn GRreqimageil(int32 riid,intn il); - -HDFLIBAPI int32 GRgetlutid(int32 riid,int32 idx); - -HDFLIBAPI uint16 GRluttoref(int32 lutid); - -HDFLIBAPI intn GRgetlutinfo(int32 riid,int32 *ncomp,int32 *nt, - int32 *il,int32 *nentries); - -HDFLIBAPI intn GRwritelut(int32 riid,int32 ncomps,int32 nt, - int32 il,int32 nentries,void * data); - -HDFLIBAPI intn GRreadlut(int32 lutid,void * data); - -HDFLIBAPI intn GRsetexternalfile(int32 riid,const char *filename,int32 offset); - -HDFLIBAPI intn GRsetaccesstype(int32 riid,uintn accesstype); - -HDFLIBAPI intn GRsetcompress(int32 riid,comp_coder_t comp_type,comp_info *cinfo); - -HDFLIBAPI intn GRgetcompress(int32 riid,comp_coder_t* comp_type,comp_info *cinfo); - -HDFLIBAPI intn GRsetattr(int32 id,const char *name,int32 attr_nt,int32 count,const void * data); - -HDFLIBAPI intn GRattrinfo(int32 id,int32 idx,char *name,int32 *attr_nt,int32 *count); - -HDFLIBAPI intn GRgetattr(int32 id,int32 idx,void * data); - -HDFLIBAPI int32 GRfindattr(int32 id,const char *name); - -HDFLIBAPI intn GRPshutdown(void); - -/*=== HDF_CHUNK_DEF same as in mfhdf.h - moved here ====*/ - -/* Bit flags used for SDsetchunk(), SDgetchunkinfo() - GRsetchunk() and GRgetchunkinfo(). Note that GRs do not support NBIT */ -#define HDF_NONE 0x0 -#define HDF_CHUNK 0x1 -#define HDF_COMP 0x3 -#define HDF_NBIT 0x5 - -/* Cache flags */ -#define HDF_CACHEALL 0x1 - -/* Chunk Defintion, Note that GRs need only 2 dimensions for the chunk_lengths */ -typedef union hdf_chunk_def_u -{ - /* Chunk Lengths only */ - int32 chunk_lengths[MAX_VAR_DIMS]; /* chunk lengths along each dimension */ - - struct - { /* For Compression info */ - int32 chunk_lengths[MAX_VAR_DIMS]; /* chunk lengths along each dimension */ - int32 comp_type; /* Compression type */ - int32 model_type; /* Compression model type */ - comp_info cinfo; /* Compression info struct */ - model_info minfo; /* Compression model info struct */ - }comp; - - struct - { /* For NBIT, Used by SDS and not by GR */ - int32 chunk_lengths[MAX_VAR_DIMS]; /* chunk lengths along each dimension */ - intn start_bit; /* offset of the start bit in the data */ - intn bit_len; /* number of bits to store */ - intn sign_ext; /* whether to sign extend or not */ - intn fill_one; /* whether to fill with 1's or not (0's) */ - } nbit; - -} HDF_CHUNK_DEF; - -/*=== GR Chunking Routines ====*/ - -/****************************************************************************** - NAME - GRsetchunk -- make GR a chunked GR - - DESCRIPTION - This routine makes the GR a chunked GR according to the chunk - definition passed in. - - The image currently cannot be special already. i.e. NBIT, - COMPRESSED, or EXTERNAL. This is an Error. - - The defintion of the HDF_CHUNK_DEF union with relvant fields is: - - typedef union hdf_chunk_def_u - { - int32 chunk_lengths[2]; Chunk lengths along each dimension - - struct - { - int32 chunk_lengths[2]; Chunk lengths along each dimension - int32 comp_type; Compression type - comp_info cinfo; Compression info struct - }comp; - - } HDF_CHUNK_DEF - - The simplist is the 'chunk_lengths' array specifiying chunk - lengths for each dimension where the 'flags' argument set to - 'HDF_CHUNK'; - - COMPRESSION is set by using the 'HDF_CHUNK_DEF' structure to set the - appropriate compression information along with the required chunk lengths - for each dimension. The compression information is the same as - that set in 'SDsetcompress()'. The bit-or'd'flags' argument' is set to - 'HDF_CHUNK | HDF_COMP'. - - See the example in pseudo-C below for further usage. - - The maximum number of Chunks in an HDF file is 65,535. - - The performance of the GRxxx interface with chunking is greatly - affected by the users access pattern over the image and by - the maximum number of chunks set in the chunk cache. The cache contains - the Least Recently Used(LRU cache replacment policy) chunks. See the - routine GRsetchunkcache() for further info on the chunk cache and how - to set the maximum number of chunks in the chunk cache. A default chunk - cache is always created. - - The following example shows the organization of chunks for a 2D iamge. - e.g. 4x4 image with 2x2 chunks. The array shows the layout of - chunks in the chunk array. - - 4 --------------------- - | | | - Y | (0,1) | (1,1) | - ^ | | | - | 2 --------------------- - | | | | - | | (0,0) | (1,0) | - | | | | - | --------------------- - | 0 2 4 - ---------------> X - - --Without compression--: - { - HDF_CHUNK_DEF chunk_def; - - ....... - -- Set chunk lengths -- - chunk_def.chunk_lengths[0]= 2; - chunk_def.chunk_lengths[1]= 2; - - -- Set Chunking -- - GRsetchunk(riid, chunk_def, HDF_CHUNK); - ...... - } - - --With compression--: - { - HDF_CHUNK_DEF chunk_def; - - ....... - -- Set chunk lengths first -- - chunk_def.chunk_lengths[0]= 2; - chunk_def.chunk_lengths[1]= 2; - - -- Set compression -- - chunk_def.comp.cinfo.deflate.level = 9; - chunk_def.comp.comp_type = COMP_CODE_DEFLATE; - - -- Set Chunking with Compression -- - GRsetchunk(riid, chunk_def, HDF_CHUNK | HDF_COMP); - ...... - } - - RETURNS - SUCCEED/FAIL -******************************************************************************/ -HDFLIBAPI intn GRsetchunk - (int32 riid, /* IN: raster access id */ - HDF_CHUNK_DEF chunk_def, /* IN: chunk definition */ - int32 flags /* IN: flags */); - -/****************************************************************************** - NAME - GRgetchunkinfo -- get Info on GR - - DESCRIPTION - This routine gets any special information on the GR. If its chunked, - chunked and compressed or just a regular GR. Currently it will only - fill the array of chunk lengths for each dimension as specified in - the 'HDF_CHUNK_DEF' union. You can pass in a NULL for 'chunk_def' - if don't want the chunk lengths for each dimension. - Additionaly if successfull it will return a bit-or'd value in 'flags' - indicating if the GR is: - - Chunked -> flags = HDF_CHUNK - Chunked and compressed -> flags = HDF_CHUNK | HDF_COMP - Non-chunked -> flags = HDF_NONE - - e.g. 4x4 array - Pseudo-C - { - int32 rcdims[3]; - HDF_CHUNK_DEF rchunk_def; - int32 cflags; - ... - rchunk_def.chunk_lengths = rcdims; - GRgetchunkinfo(riid, &rchunk_def, &cflags); - ... - } - - RETURNS - SUCCEED/FAIL -******************************************************************************/ -HDFLIBAPI intn GRgetchunkinfo - (int32 riid, /* IN: Raster access id */ - HDF_CHUNK_DEF *chunk_def, /* IN/OUT: chunk definition */ - int32 *flags /* IN/OUT: flags */); - - -/****************************************************************************** - NAME - GRwritechunk -- write the specified chunk to the GR - - DESCRIPTION - This routine writes a whole chunk of data to the chunked GR - specified by chunk 'origin' for the given GR and can be used - instead of GRwriteimage() when this information is known. This - routine has less overhead and is much faster than using GRwriteimage(). - - Origin specifies the co-ordinates of the chunk according to the chunk - position in the overall chunk array. - - 'datap' must point to a whole chunk of data. - - See GRsetchunk() for a description of the organization of chunks in an GR. - - RETURNS - SUCCEED/FAIL -******************************************************************************/ -HDFLIBAPI intn GRwritechunk - (int32 riid, /* IN: raster access id */ - int32 *origin, /* IN: origin of chunk to write */ - const void *datap /* IN: buffer for data */); - -/****************************************************************************** - NAME - GRreadchunk -- read the specified chunk to the GR - - DESCRIPTION - This routine reads a whole chunk of data from the chunked GR - specified by chunk 'origin' for the given GR and can be used - instead of GRreadimage() when this information is known. This - routine has less overhead and is much faster than using GRreadimage(). - - Origin specifies the co-ordinates of the chunk according to the chunk - position in the overall chunk array. - - 'datap' must point to a whole chunk of data. - - See GRsetchunk() for a description of the organization of chunks in an GR. - - RETURNS - SUCCEED/FAIL -******************************************************************************/ -HDFLIBAPI intn GRreadchunk - (int32 riid, /* IN: raster access id */ - int32 *origin, /* IN: origin of chunk to read */ - void *datap /* IN/OUT: buffer for data */); - - -/****************************************************************************** -NAME - GRsetchunkcache -- maximum number of chunks to cache - -DESCRIPTION - Set the maximum number of chunks to cache. - - The cache contains the Least Recently Used(LRU cache replacment policy) - chunks. This routine allows the setting of maximum number of chunks that - can be cached, 'maxcache'. - - The performance of the GRxxx interface with chunking is greatly - affected by the users access pattern over the image and by - the maximum number of chunks set in the chunk cache. The number chunks - that can be set in the cache is process memory limited. It is a good - idea to always set the maximum number of chunks in the cache as the - default heuristic does not take into account the memory available for - the application. - - By default when the GR is promoted to a chunked element the - maximum number of chunks in the cache 'maxcache' is set to the number of - chunks along the last dimension. - - The values set here affects the current object's caching behaviour. - - If the chunk cache is full and 'maxcache' is greater then the - current 'maxcache' value, then the chunk cache is reset to the new - 'maxcache' value, else the chunk cache remains at the current - 'maxcache' value. - - If the chunk cache is not full, then the chunk cache is set to the - new 'maxcache' value only if the new 'maxcache' value is greater than the - current number of chunks in the cache. - - Use flags argument of 'HDF_CACHEALL' if the whole object is to be cached - in memory, otherwise pass in zero(0). Currently you can only - pass in zero. - - See GRsetchunk() for a description of the organization of chunks in an GR. - -RETURNS - Returns the 'maxcache' value for the chunk cache if successful - and FAIL otherwise -******************************************************************************/ -HDFLIBAPI intn GRsetchunkcache - (int32 riid, /* IN: raster access id */ - int32 maxcache, /* IN: max number of chunks to cache */ - int32 flags /* IN: flags = 0, HDF_CACHEALL */); - - -#ifdef HAVE_FMPOOL -/****************************************************************************** -NAME - Hmpset - set pagesize and maximum number of pages to cache on next open/create - -DESCRIPTION - Set the pagesize and maximum number of pages to cache on the next - open/create of a file. A pagesize that is a power of 2 is recommended. - - The values set here only affect the next open/creation of a file and - do not change a particular file's paging behaviour after it has been - opened or created. This maybe changed in a later release. - - Use flags arguement of 'MP_PAGEALL' if the whole file is to be cached - in memory otherwise passs in zero. - -RETURNS - Returns SUCCEED if successful and FAIL otherwise - -NOTE - This calls the real routine MPset(). - Currently 'maxcache' has to be greater than 1. Maybe use special - case of 0 to specify you want to turn page buffering off or use - the flags arguement. - -******************************************************************************/ -HDFLIBAPI int Hmpset(int pagesize, /* IN: pagesize to use for next open/create */ - int maxcache, /* IN: max number of pages to cache */ - int flags /* IN: flags = 0, MP_PAGEALL */); - -/****************************************************************************** -NAME - Hmpget - get last pagesize and max number of pages cached for open/create - -DESCRIPTION - This gets the last pagesize and maximum number of pages cached for - the last open/create of a file. - -RETURNS - Returns SUCCEED. - -NOTES - This routine calls the real routine MPget(). -******************************************************************************/ -HDFLIBAPI int Hmpget(int *pagesize, /*OUT: pagesize to used in last open/create */ - int *maxcache, /*OUT: max number of pages cached in last open/create */ - int flags /* IN: */); - -#endif /* HAVE_FMPOOL */ - -/* Vset interface functions (used to be in vproto.h) */ - -/* Useful macros, which someday might become actuall functions */ -/* - * macros for VSinquire - * all these macros should be public for users - */ -#define VSQuerycount(vs, count) \ - (VSinquire (vs, (int32 *) count, (int32*) NULL, (char*) NULL, (int32*) NULL, (char*) NULL)) - -#define VSQueryinterlace(vs, intr) \ - (VSinquire (vs, (int32 *) NULL, (int32*) intr, (char*) NULL, (int32*) NULL, (char*) NULL)) - -#define VSQueryfields(vs, flds) \ - (VSinquire (vs, (int32 *) NULL, (int32*) NULL, (char*) flds, (int32*) NULL, (char*) NULL)) - -#define VSQueryvsize(vs, size) \ - (VSinquire (vs, (int32 *) NULL, (int32*) NULL, (char*) NULL, (int32*) size, (char*) NULL)) - -#define VSQueryname(vs, name) \ - (VSinquire (vs, (int32 *) NULL, (int32*) NULL, (char*) NULL, (int32*) NULL, (char*) name)) - -/* - ** from vattr.c - */ - HDFLIBAPI intn Vsetattr - (int32 vgid, const char *attrname, int32 datatype, - int32 count, const void * values); - HDFLIBAPI intn Vnattrs - (int32 vgid); - HDFLIBAPI intn Vfindattr - (int32 vgid, const char *attrname); - HDFLIBAPI intn Vattrinfo - (int32 vgid, intn attrindex, char *name, - int32 *datatype, int32 *count, int32 *size); - HDFLIBAPI intn Vgetattr - (int32 vgid, intn attrindex, void * values); - HDFLIBAPI int32 Vgetversion - (int32 vgid); - HDFLIBAPI intn VSfindex - (int32 vsid, const char *fieldname, int32 *fldindex); - HDFLIBAPI intn VSsetattr - (int32 vsid, int32 findex, const char *attrname, - int32 datatype, int32 count, const void * values); - HDFLIBAPI intn VSnattrs - (int32 vsid); - HDFLIBAPI intn VSfnattrs - (int32 vsid, int32 findex); - HDFLIBAPI intn VSfindattr - (int32 vsid, int32 findex, const char *attrname); - HDFLIBAPI intn VSattrinfo - (int32 vsid, int32 findex, intn attrindex, - char *name, int32 *datatype, int32 *count, - int32 *size); - HDFLIBAPI intn VSgetattr - (int32 vsid, int32 findex, intn attrindex, - void * values); - HDFLIBAPI intn VSisattr - (int32 vsid); -/* - ** from vconv.c - */ - HDFLIBAPI int32 vicheckcompat - (HFILEID f); - - HDFLIBAPI int32 vimakecompat - (HFILEID f); - - HDFLIBAPI int32 vcheckcompat - (char * fs); - - HDFLIBAPI int32 vmakecompat - (char * fs); - -/* - ** from vg.c - */ - HDFLIBAPI int32 VSelts - (int32 vkey); - - HDFLIBAPI int32 VSgetinterlace - (int32 vkey); - - HDFLIBAPI intn VSsetinterlace - (int32 vkey, int32 interlace); - - HDFLIBAPI int32 VSgetfields - (int32 vkey, char * fields); - - HDFLIBAPI intn VSfexist - (int32 vkey, char * fields); - - HDFLIBAPI int32 VSsizeof - (int32 vkey, char * fields); - - HDFLIBAPI void VSdump - (int32 vkey); - - HDFLIBAPI int32 VSsetname - (int32 vkey, const char * vsname); - - HDFLIBAPI int32 VSsetclass - (int32 vkey, const char * vsclass); - - HDFLIBAPI int32 VSgetname - (int32 vkey, char * vsname); - - HDFLIBAPI int32 VSgetclass - (int32 vkey, char * vsclass); - - HDFLIBAPI intn VSinquire - (int32 vkey, int32 * nelt, int32 * interlace, - char * fields, int32 * eltsize, char * vsname); - - HDFLIBAPI int32 VSlone - (HFILEID f, int32 * idarray, int32 asize); - - HDFLIBAPI int32 Vlone - (HFILEID f, int32 * idarray, int32 asize); - - HDFLIBAPI int32 Vfind - (HFILEID f, const char * vgname); - - HDFLIBAPI int32 VSfind - (HFILEID f, const char * vsname); - - HDFLIBAPI int32 Vfindclass - (HFILEID f, const char * vgclass); - - HDFLIBAPI int32 VSfindclass - (HFILEID f, const char * vsclass); - - HDFLIBAPI intn VSsetblocksize - (int32 vkey, int32 block_size); - - HDFLIBAPI intn VSsetnumblocks - (int32 vkey, int32 num_blocks); - - HDFLIBAPI intn VSgetblockinfo - (int32 vkey, int32* block_size, int32* num_blocks); - - HDFLIBAPI void Vsetzap - (void); - -/* - ** from vgp.c - */ - HDFLIBAPI intn vcompare - (void * k1, void * k2, intn cmparg); - - HDFLIBAPI intn vcompareref - (void * k1, void * k2, intn cmparg); - - HDFLIBAPI void vdestroynode - (void * n); - - HDFLIBAPI void vtfreekey - (void * k); - - HDFLIBAPI intn Vinitialize - (HFILEID f); - - HDFLIBAPI intn Vfinish - (HFILEID f); - - HDFLIBAPI HFILEID Vopen - (char *path, intn acc_mode, int16 ndds); - - HDFLIBAPI intn Vclose - (HFILEID f); - - HDFLIBAPI int32 vexistvg - (HFILEID f, uint16 vgid); - - HDFLIBAPI int32 Vattach - (HFILEID f, int32 vgid, const char * accesstype); - - HDFLIBAPI int32 Vdetach - (int32 vkey); - - HDFLIBAPI int32 Vinsert - (int32 vkey, int32 vskey); - /* note: 2nd arg of Vinsert can also be (VGROUP *) */ - - HDFLIBAPI int32 Vflocate - (int32 vkey, char * field); - - HDFLIBAPI intn Vinqtagref - (int32 vkey, int32 tag, int32 ref); - - HDFLIBAPI int32 Vntagrefs - (int32 vkey); - - HDFLIBAPI int32 Vnrefs - (int32 vkey,int32 tag); - - HDFLIBAPI int32 Vgettagrefs - (int32 vkey, int32 tagarray[], int32 refarray[], int32 n); - - HDFLIBAPI intn Vgettagref - (int32 vkey, int32 which, int32 * tag, int32 * ref); - - HDFLIBAPI int32 VQueryref - (int32 vkey); - - HDFLIBAPI int32 VQuerytag - (int32 vkey); - - HDFLIBAPI int32 Vaddtagref - (int32 vkey, int32 tag, int32 ref); - - HDFLIBAPI int32 Ventries - (HFILEID f, int32 vgid); - - HDFLIBAPI int32 Vsetname - (int32 vkey, const char * vgname); - - HDFLIBAPI int32 Vsetclass - (int32 vkey, const char * vgclass); - - HDFLIBAPI intn Visvg - (int32 vkey, int32 id); - - HDFLIBAPI intn Visvs - (int32 vkey, int32 id); - - HDFLIBAPI int32 Vgetid - (HFILEID f, int32 vgid); - - HDFLIBAPI int32 Vgetnext - (int32 vkey, int32 id); - - HDFLIBAPI int32 Vgetname - (int32 vkey, char * vgname); - - HDFLIBAPI int32 Vgetclass - (int32 vkey, char * vgclass); - - HDFLIBAPI intn Vinquire - (int32 vkey, int32 * nentries, char * vgname); - - HDFLIBAPI int32 Vdelete - (int32 f, int32 ref); - -/******************************************************************************* -NAME - Vdeletetagref - delete tag/ref pair in Vgroup - -DESCRIPTION - Deletes the given tag/ref pair from the Vgroup. If the given tag/ref pair - does not exist in the vgroup the routine will return FAIL. Users should use - Vinqtagref() to check if the tag/ref pair exists before deleting. - -RETURNS - Returns SUCCEED if the tag/ref pair is deleted from Vgroup and - FAIL if unsuccessful. - -*******************************************************************************/ -HDFLIBAPI intn -Vdeletetagref(int32 vkey, /* IN: vgroup key */ - int32 tag, /* IN: tag to delete in vgroup */ - int32 ref /* IN: ref to delete in vgroup */); - - HDFLIBAPI intn VPshutdown(void); - -/* - ** from vparse.c - */ - HDFLIBAPI int32 scanattrs - (const char * attrs, int32 * attrc, char *** attrv); - -/* - ** from vhi.c - */ - HDFLIBAPI int32 VHstoredata - (HFILEID f, const char * field, const uint8 *buf, int32 n, int32 datatype, - const char * vsname, const char * vsclass); - - HDFLIBAPI int32 VHstoredatam - (HFILEID f, const char * field, const uint8 *buf, int32 n, int32 datatype, - const char * vsname, const char * vsclass, int32 order); - - HDFLIBAPI int32 VHmakegroup - (HFILEID f, int32 tagarray[], int32 refarray[], int32 n, - const char * vgname, const char * vgclass); - -/* - ** from vio.c - */ - - HDFLIBAPI intn VSPhshutdown(void); - - HDFLIBAPI int32 vexistvs - (HFILEID f, uint16 vsref); - - HDFLIBAPI void vsdestroynode - (void * n); - - HDFLIBAPI void vfdestroynode - (void * n); - - HDFLIBAPI int32 VSattach - (HFILEID f, int32 vsref, const char * accesstype); - - HDFLIBAPI int32 VSdetach - (int32 vkey); - - HDFLIBAPI int32 VSQuerytag - (int32 vkey); - - HDFLIBAPI int32 VSQueryref - (int32 vkey); - - HDFLIBAPI int32 VSgetid - (HFILEID f, int32 vsref); - - HDFLIBAPI int32 VSgetversion - (int32 vkey); - - HDFLIBAPI int32 VSdelete - (int32 f, int32 ref); - - HDFLIBAPI int32 VSappendable - (int32 vkey, int32 blk); - -/* - ** from vsfld.c - */ - - HDFLIBAPI intn VSsetfields - (int32 vkey, const char * fields); - - HDFLIBAPI intn VSfdefine - (int32 vkey, const char * field, int32 localtype, int32 order); - - HDFLIBAPI int32 VFnfields - (int32 vkey); - - HDFLIBAPI char *VFfieldname - (int32 vkey, int32 idx); - - HDFLIBAPI int32 VFfieldtype - (int32 vkey, int32 idx); - - HDFLIBAPI int32 VFfieldisize - (int32 vkey, int32 idx); - - HDFLIBAPI int32 VFfieldesize - (int32 vkey, int32 idx); - - HDFLIBAPI int32 VFfieldorder - (int32 vkey, int32 idx); - - HDFLIBAPI intn VSsetexternalfile - (int32 vkey, const char *filename, int32 offset); - - HDFLIBAPI intn VSfpack - (int32 vsid, intn packtype, const char *fields_in_buf, - void * buf, intn bufsz, intn n_records, - const char *fields, void * fldbufpt[]); - -/* - ** from vrw.c - */ - HDFLIBAPI intn VSPshutdown(void); - - HDFLIBAPI int32 VSseek - (int32 vkey, int32 eltpos); - - HDFLIBAPI int32 VSread - (int32 vkey, uint8 buf[], int32 nelt, int32 interlace); - - HDFLIBAPI int32 VSwrite - (int32 vkey, const uint8 buf[], int32 nelt, int32 interlace); - -/* - ** from vgF.c - */ -#ifndef VG_FNAMES -# define VG_FNAMES -#ifdef DF_CAPFNAMES -# if defined(UNIX386) || (!(defined INTEL86) && !(defined WIN32)) -# define ndfivopn FNAME(DFIVOPN) -# define ndfvclos FNAME(DFVCLOS) -# define nvatchc FNAME(VATCHC) -# define nvdtchc FNAME(VDTCHC) -# define nvgnamc FNAME(VGNAMC) -# define nvgclsc FNAME(VGCLSC) -# define nvinqc FNAME(VINQC) -# define nvdeletec FNAME(VDELETEC) -# define nvgidc FNAME(VGIDC) -# define nvgnxtc FNAME(VGNXTC) -# define nvsnamc FNAME(VSNAMC) -# define nvsclsc FNAME(VSCLSC) -# define nvinsrtc FNAME(VINSRTC) -# define nvisvgc FNAME(VISVGC) -# define nvisvsc FNAME(VISVSC) -# define nvsatchc FNAME(VSATCHC) -# define nvsdtchc FNAME(VSDTCHC) -# define nvsqref FNAME(VSQREF) -# define nvsqtag FNAME(VSQTAG) -# define nvsgver FNAME(VSGVER) -# define nvsseekc FNAME(VSSEEKC) -# define nvsgnamc FNAME(VSGNAMC) -# define nvsgclsc FNAME(VSGCLSC) -# define nvsinqc FNAME(VSINQC) -# define nvsfexc FNAME(VSFEXC) -# define nvsfndc FNAME(VSFNDC) -# define nvsgidc FNAME(VSGIDC) -# define nvsdltc FNAME(VSDLTC) -# define nvsapp FNAME(VSAPP) -# define nvssnamc FNAME(VSSNAMC) -# define nvssclsc FNAME(VSSCLSC) -# define nvssfldc FNAME(VSSFLDC) -# define nvssintc FNAME(VSSINTC) -# define nvsfdefc FNAME(VSFDEFC) -# define nvssextfc FNAME(VSSEXTFC) -# define nvfnflds FNAME(VFNFLDS) -# define nvffnamec FNAME(VFFNAMEC) -# define nvfftype FNAME(VFFTYPE) -# define nvffisiz FNAME(VFFISIZ) -# define nvffesiz FNAME(VFFESIZ) -# define nvffordr FNAME(VFFORDR) -# define nvsfrdc FNAME(VSFRDC) -# define nvsfrd FNAME(VSFRD) -# define nvsreadc FNAME(VSREADC) -# define nvsfwrt FNAME(VSFWRT) -# define nvsfwrtc FNAME(VSFWRTC) -# define nvswritc FNAME(VSWRITC) -# define nvsgintc FNAME(VSGINTC) -# define nvseltsc FNAME(VSELTSC) -# define nvsgfldc FNAME(VSGFLDC) -# define nvssizc FNAME(VSSIZC) -# define nventsc FNAME(VENTSC) -# define nvlonec FNAME(VLONEC) -# define nvslonec FNAME(VSLONEC) -# define nvfindc FNAME(VFINDC) -# define nvfndclsc FNAME(VFNDCLSC) -# define nvhscdc FNAME(VHSCDC) -# define nvhsdc FNAME(VHSDC) -# define nvhscdmc FNAME(VHSCDMC) -# define nvhsdmc FNAME(VHSDMC) -# define nvhmkgpc FNAME(VHMKGPC) -# define nvflocc FNAME(VFLOCC) -# define nvinqtrc FNAME(VINQTRC) -# define nvntrc FNAME(VNTRC) -# define nvnrefs FNAME(VNREFS) -# define nvgttrsc FNAME(VGTTRSC) -# define nvqref FNAME(VQREF) -# define nvqtag FNAME(VQTAG) -# define nvgttrc FNAME(VGTTRC) -# define nvadtrc FNAME(VADTRC) -# define nvfstart FNAME(VFSTART) -# define nvfend FNAME(VFEND) -# define nvsqfnelt FNAME(VSQFNELT) -# define nvsqfintr FNAME(VSQFINTR) -# define nvsqfldsc FNAME(VSQFLDSC) -# define nvsqfvsiz FNAME(VSQFVSIZ) -# define nvsqnamec FNAME(VSQNAMEC) -# define nvsfccpk FNAME(VSFCCPK) -# define nvsfncpk FNAME(VSFNCPK) -# define nvdtrc FNAME(VDTRC) -# define nvscfcls FNAME(VSCFCLS) -# define nvscsetblsz FNAME(VSCSETBLSZ) -# define nvscsetnmbl FNAME (VSCSETNMBL) -# define nvscgblinfo FNAME(VSCGBLINFO) -# else /* !sl */ -# define ndfivopn FNAME(DFIVOPN) -# define ndfvclos FNAME(DFVCLOS) -# define nvatchc FNAME(VATCHC) -# define nvdtchc FNAME(VDTCHC) -# define nvgnamc FNAME(VGNAMC) -# define nvgclsc FNAME(VGCLSC) -# define nvinqc FNAME(VINQC) -# define nvdeletec FNAME(VDELETEC) -# define nvgidc FNAME(VGIDC) -# define nvgnxtc FNAME(VGNXTC) -# define nvsnamc FNAME(VSNAMC) -# define nvsclsc FNAME(VSCLSC) -# define nvinsrtc FNAME(VINSRTC) -# define nvisvgc FNAME(VISVGC) -# define nvfistart FNAME(VFISTART) -# define nvfiend FNAME(VFIEND) -# define nvisvsc FNAME(VISVSC) -# define nvsatchc FNAME(VSATCHC) -# define nvsdtchc FNAME(VSDTCHC) -# define nvsiqref FNAME(VSIQREF) -# define nvsiqtag FNAME(VSIQTAG) -# define nvsigver FNAME(VSIGVER) -# define nvsseekc FNAME(VSSEEKC) -# define nvsgnamc FNAME(VSGNAMC) -# define nvsgclsc FNAME(VSGCLSC) -# define nvsinqc FNAME(VSINQC) -# define nvsfexc FNAME(VSFEXC) -# define nvsfndc FNAME(VSFNDC) -# define nvsgidc FNAME(VSGIDC) -# define nvsdltc FNAME(VSDLTC) -# define nvsapp FNAME(VSAPP) -# define nvssnamc FNAME(VSSNAMC) -# define nvssclsc FNAME(VSSCLSC) -# define nvssfldc FNAME(VSSFLDC) -# define nvssintc FNAME(VSSINTC) -# define nvsfdefc FNAME(VSFDEFC) -# define nvssextfc FNAME(VSSEXTFC) -# define nvfinflds FNAME(VFINFLDS) -# define nvfifnm FNAME(VFIFNM) -# define nvfiftp FNAME(VFIFTP) -# define nvfifisz FNAME(VFIFISZ) -# define nvfifesz FNAME(VFIFESZ) -# define nvfifodr FNAME(VFIFODR) -# define nvsfirdc FNAME(VSFIRDC) -# define nvsfird FNAME(VSFIRD) -# define nvsreadc FNAME(VSREADC) -# define nvsfiwrc FNAME(VSFIWRC) -# define nvsfiwr FNAME(VSFIWR) -# define nvswritc FNAME(VSWRITC) -# define nvsgintc FNAME(VSGINTC) -# define nvseltsc FNAME(VSELTSC) -# define nvsgfldc FNAME(VSGFLDC) -# define nvssizc FNAME(VSSIZC) -# define nventsc FNAME(VENTSC) -# define nvlonec FNAME(VLONEC) -# define nvslonec FNAME(VSLONEC) -# define nvfindc FNAME(VFINDC) -# define nvfndclsc FNAME(VFNDCLSC) -# define nvhsdc FNAME(VHSDC) -# define nvhscdc FNAME(VHSCDC) -# define nvhscdmc FNAME(VHSCDMC) -# define nvhsdmc FNAME(VHSDMC) -# define nvhmkgpc FNAME(VHMKGPC) -# define nvflocc FNAME(VFLOCC) -# define nvfirefs FNAME(VFIREFS) -# define nvfiqref FNAME(VFIQREF) -# define nvfiqtag FNAME(VFIQTAG) -# define nvinqtrc FNAME(VINQTRC) -# define nvntrc FNAME(VNTRC) -# define nvgttrsc FNAME(VGTTRSC) -# define nvgttrc FNAME(VGTTRC) -# define nvadtrc FNAME(VADTRC) -# define nvsiqintr FNAME(VSIQINTR) -# define nvsiqnelt FNAME(VSIQNELT) -# define nvsqfldsc FNAME(VSQFLDSC) -# define nvsiqvsz FNAME(VSIQVSZ) -# define nvsqnamec FNAME(VSQNAMEC) -# define nvsfccpk FNAME(VSFCCPK) -# define nvsfncpk FNAME(VSFNCPK) -# define nvdtrc FNAME(VDTRC) -# define nvscfcls FNAME(VSCFCLS) -# define nvscsetblsz FNAME(VSCSETBLSZ) -# define nvscsetnmbl FNAME (VSCSETNMBL) -# define nvscgblinfo FNAME(VSCGBLINFO) -# endif -#else /* !DF_CAPFNAMES */ -# if defined(UNIX386) || (!(defined INTEL86) && !(defined WIN32)) -# define ndfivopn FNAME(dfivopn) -# define ndfvclos FNAME(dfvclos) -# define nvatchc FNAME(vatchc) -# define nvdtchc FNAME(vdtchc) -# define nvgnamc FNAME(vgnamc) -# define nvgclsc FNAME(vgclsc) -# define nvinqc FNAME(vinqc) -# define nvdeletec FNAME(vdeletec) -# define nvgidc FNAME(vgidc) -# define nvgnxtc FNAME(vgnxtc) -# define nvsnamc FNAME(vsnamc) -# define nvsclsc FNAME(vsclsc) -# define nvinsrtc FNAME(vinsrtc) -# define nvisvgc FNAME(visvgc) -# define nvisvsc FNAME(visvsc) -# define nvsatchc FNAME(vsatchc) -# define nvsdtchc FNAME(vsdtchc) -# define nvsqref FNAME(vsqref) -# define nvsqtag FNAME(vsqtag) -# define nvsgver FNAME(vsgver) -# define nvsseekc FNAME(vsseekc) -# define nvsgnamc FNAME(vsgnamc) -# define nvsgclsc FNAME(vsgclsc) -# define nvsinqc FNAME(vsinqc) -# define nvsfexc FNAME(vsfexc) -# define nvsfndc FNAME(vsfndc) -# define nvsgidc FNAME(vsgidc) -# define nvsdltc FNAME(vsdltc) -# define nvsapp FNAME(vsapp) -# define nvssnamc FNAME(vssnamc) -# define nvssclsc FNAME(vssclsc) -# define nvssfldc FNAME(vssfldc) -# define nvssintc FNAME(vssintc) -# define nvsfdefc FNAME(vsfdefc) -# define nvssextfc FNAME(vssextfc) -# define nvfnflds FNAME(vfnflds) -# define nvffnamec FNAME(vffnamec) -# define nvfftype FNAME(vfftype) -# define nvffisiz FNAME(vffisiz) -# define nvffesiz FNAME(vffesiz) -# define nvffordr FNAME(vffordr) -# define nvsfrdc FNAME(vsfrdc) -# define nvsfrd FNAME(vsfrd) -# define nvsreadc FNAME(vsreadc) -# define nvsfwrtc FNAME(vsfwrtc) -# define nvsfwrt FNAME(vsfwrt) -# define nvswritc FNAME(vswritc) -# define nvsgintc FNAME(vsgintc) -# define nvseltsc FNAME(vseltsc) -# define nvsgfldc FNAME(vsgfldc) -# define nvssizc FNAME(vssizc) -# define nventsc FNAME(ventsc) -# define nvlonec FNAME(vlonec) -# define nvslonec FNAME(vslonec) -# define nvfindc FNAME(vfindc) -# define nvfndclsc FNAME(vfndclsc) -# define nvhscdc FNAME(vhscdc) -# define nvhsdc FNAME(vhsdc) -# define nvhscdmc FNAME(vhscdmc) -# define nvhsdmc FNAME(vhsdmc) -# define nvhmkgpc FNAME(vhmkgpc) -# define nvflocc FNAME(vflocc) -# define nvinqtrc FNAME(vinqtrc) -# define nvntrc FNAME(vntrc) -# define nvnrefs FNAME(vnrefs) -# define nvgttrsc FNAME(vgttrsc) -# define nvqref FNAME(vqref) -# define nvqtag FNAME(vqtag) -# define nvgttrc FNAME(vgttrc) -# define nvadtrc FNAME(vadtrc) -# define nvfstart FNAME(vfstart) -# define nvfend FNAME(vfend) -# define nvsqfnelt FNAME(vsqfnelt) -# define nvsqfintr FNAME(vsqfintr) -# define nvsqfldsc FNAME(vsqfldsc) -# define nvsqfvsiz FNAME(vsqfvsiz) -# define nvsqnamec FNAME(vsqnamec) -# define nvsfccpk FNAME(vsfccpk) -# define nvsfncpk FNAME(vsfncpk) -# define nvdtrc FNAME(vdtrc) -# define nvscfcls FNAME(vscfcls) -# define nvscsetblsz FNAME(vscsetblsz) -# define nvscsetnmbl FNAME (vscsetnmbl) -# define nvscgblinfo FNAME(vscgblinfo) -# else /* !sl */ -# define ndfivopn FNAME(dfivopn) -# define ndfvclos FNAME(dfvclos) -# define nvatchc FNAME(vatchc) -# define nvdtchc FNAME(vdtchc) -# define nvgnamc FNAME(vgnamc) -# define nvgclsc FNAME(vgclsc) -# define nvinqc FNAME(vinqc) -# define nvdeletec FNAME(vdeletec) -# define nvgidc FNAME(vgidc) -# define nvgnxtc FNAME(vgnxtc) -# define nvsnamc FNAME(vsnamc) -# define nvsclsc FNAME(vsclsc) -# define nvinsrtc FNAME(vinsrtc) -# define nvisvgc FNAME(visvgc) -# define nvfistart FNAME(vfistart) -# define nvfiend FNAME(vfiend) -# define nvisvsc FNAME(visvsc) -# define nvsatchc FNAME(vsatchc) -# define nvsdtchc FNAME(vsdtchc) -# define nvsiqref FNAME(vsiqref) -# define nvsiqtag FNAME(vsiqtag) -# define nvsigver FNAME(vsigver) -# define nvsseekc FNAME(vsseekc) -# define nvsgnamc FNAME(vsgnamc) -# define nvsgclsc FNAME(vsgclsc) -# define nvsinqc FNAME(vsinqc) -# define nvsfexc FNAME(vsfexc) -# define nvsfndc FNAME(vsfndc) -# define nvsgidc FNAME(vsgidc) -# define nvsdltc FNAME(vsdltc) -# define nvsapp FNAME(vsapp) -# define nvssnamc FNAME(vssnamc) -# define nvssclsc FNAME(vssclsc) -# define nvssfldc FNAME(vssfldc) -# define nvssintc FNAME(vssintc) -# define nvsfdefc FNAME(vsfdefc) -# define nvssextfc FNAME(vssextfc) -# define nvfinflds FNAME(vfinflds) -# define nvfifnm FNAME(vfifnm) -# define nvfiftp FNAME(vfiftp) -# define nvfifisz FNAME(vfifisz) -# define nvfifesz FNAME(vfifesz) -# define nvfifodr FNAME(vfifodr) -# define nvsfirdc FNAME(vsfirdc) -# define nvsfird FNAME(vsfird) -# define nvsreadc FNAME(vsreadc) -# define nvsfiwrc FNAME(vsfiwrc) -# define nvsfiwr FNAME(vsfiwr) -# define nvswritc FNAME(vswritc) -# define nvsgintc FNAME(vsgintc) -# define nvseltsc FNAME(vseltsc) -# define nvsgfldc FNAME(vsgfldc) -# define nvssizc FNAME(vssizc) -# define nventsc FNAME(ventsc) -# define nvlonec FNAME(vlonec) -# define nvslonec FNAME(vslonec) -# define nvfindc FNAME(vfindc) -# define nvfndclsc FNAME(vfndclsc) -# define nvhsdc FNAME(vhsdc) -# define nvhscdc FNAME(vhscdc) -# define nvhscdmc FNAME(vhscdmc) -# define nvhsdmc FNAME(vhsdmc) -# define nvhmkgpc FNAME(vhmkgpc) -# define nvflocc FNAME(vflocc) -# define nvfirefs FNAME(vfirefs) -# define nvfiqref FNAME(vfiqref) -# define nvfiqtag FNAME(vfiqtag) -# define nvinqtrc FNAME(vinqtrc) -# define nvntrc FNAME(vntrc) -# define nvgttrsc FNAME(vgttrsc) -# define nvgttrc FNAME(vgttrc) -# define nvadtrc FNAME(vadtrc) -# define nvsiqintr FNAME(vsiqintr) -# define nvsiqnelt FNAME(vsiqnelt) -# define nvsqfldsc FNAME(vsqfldsc) -# define nvsiqvsz FNAME(vsiqvsz) -# define nvsqnamec FNAME(vsqnamec) -# define nvsfccpk FNAME(vsfccpk) -# define nvsfncpk FNAME(vsfncpk) -# define nvdtrc FNAME(vdtrc) -# define nvscfcls FNAME(vscfcls) -# define nvscsetblsz FNAME(vscsetblsz) -# define nvscsetnmbl FNAME (vscsetnmbl) -# define nvscgblinfo FNAME(vscgblinfo) -# endif -#endif /* DF_CAPFNAMES */ -#endif /* VG_FNAMES */ - - HDFLIBAPI FRETVAL(intf) ndfivopn - (_fcd filename, intf * acc_mode, intf * defdds, intf * namelen); - - HDFLIBAPI FRETVAL(intf) ndfvclos - (intf * file_id); - - HDFLIBAPI FRETVAL(intf) nvatchc - (intf * f, intf * vgid, _fcd accesstype); - - HDFLIBAPI FRETVAL(intf) nvdtchc - (intf * vkey); - - HDFLIBAPI FRETVAL(intf) nvgnamc - (intf * vkey, _fcd vgname); - - HDFLIBAPI FRETVAL(intf) nvgclsc - (intf * vkey, _fcd vgclass); - - HDFLIBAPI FRETVAL(intf) nvinqc - (intf * vkey, intf * nentries, _fcd vgname); - - HDFLIBAPI FRETVAL(intf) nvdeletec - (intf *f, intf * vkey); - - HDFLIBAPI FRETVAL(intf) nvgidc - (intf * f, intf * vgid); - - HDFLIBAPI FRETVAL(intf) nvgnxtc - (intf * vkey, intf * id); - - HDFLIBAPI FRETVAL(intf) nvsnamc - (intf * vkey, _fcd vgname, intf * vgnamelen); - - HDFLIBAPI FRETVAL(intf) nvsclsc - (intf * vkey, _fcd vgclass, intf * vgclasslen); - - HDFLIBAPI FRETVAL(intf) nvinsrtc - (intf * vkey, intf * vobjptr); - - HDFLIBAPI FRETVAL(intf) nvisvgc - (intf * vkey, intf * id); - - HDFLIBAPI FRETVAL(intf) nvfstart - (intf * f); - - HDFLIBAPI FRETVAL(intf) nvfend - (intf * f); - - HDFLIBAPI FRETVAL(intf) nvisvsc - (intf * vkey, intf * id); - - HDFLIBAPI FRETVAL(intf) nvsatchc - (intf * f, intf * vsref, _fcd accesstype); - - HDFLIBAPI FRETVAL(intf) nvsdtchc - (intf * vkey); - - HDFLIBAPI FRETVAL(intf) nvsqref - (intf * vkey); - - HDFLIBAPI FRETVAL(intf) nvsqtag - (intf * vkey); - - HDFLIBAPI FRETVAL(intf) nvsqnfld - (intf * vkey); - - HDFLIBAPI FRETVAL(intf) nvsgver - (intf * vkey); - - HDFLIBAPI FRETVAL(intf) nvsseekc - (intf * vkey, intf * eltpos); - - HDFLIBAPI FRETVAL(intf) nvsgnamc - (intf * vkey, _fcd vsname, intf *vsnamelen); - - HDFLIBAPI FRETVAL(intf) nvsgclsc - (intf * vkey, _fcd vsclass, intf *vsclasslen); - - HDFLIBAPI FRETVAL(intf) nvsinqc - (intf * vkey, intf * nelt, intf * interlace, _fcd fields, - intf * eltsize, _fcd vsname, intf *fieldslen, intf *vsnamelen); - - HDFLIBAPI FRETVAL(intf) nvsfexc - (intf * vkey, _fcd fields, intf * fieldslen); - - HDFLIBAPI FRETVAL(intf) nvsfndc - (intf * f, _fcd name, intf * namelen); - - HDFLIBAPI FRETVAL(intf) nvsgidc - (intf * f, intf * vsref); - - HDFLIBAPI FRETVAL(intf) nvsdltc - (intf * f, intf * vsref); - - HDFLIBAPI FRETVAL(intf) nvsapp - (intf * vkey, intf *blk); - - HDFLIBAPI FRETVAL(intf) nvssnamc - (intf * vkey, _fcd vsname, intf * vsnamelen); - - HDFLIBAPI FRETVAL(intf) nvssclsc - (intf * vkey, _fcd vsclass, intf * vsclasslen); - - HDFLIBAPI FRETVAL(intf) nvssfldc - (intf * vkey, _fcd fields, intf * fieldslen); - - HDFLIBAPI FRETVAL(intf) nvssintc - (intf * vkey, intf * interlace); - - HDFLIBAPI FRETVAL(intf) nvsfdefc - (intf * vkey, _fcd field, intf * localtype, - intf * order, intf * fieldlen); - - HDFLIBAPI FRETVAL(intf) nvssextfc - (intf * vkey, _fcd fname, intf * offset, - intf * fnamelen); - - HDFLIBAPI FRETVAL(intf) nvfnflds - (intf * vkey); - - HDFLIBAPI FRETVAL(intf) nvffnamec - (intf * vkey, intf *idx, _fcd fname, intf *len); - - HDFLIBAPI FRETVAL(intf) nvfftype - (intf * vkey, intf *idx); - - HDFLIBAPI FRETVAL(intf) nvffisiz - (intf * vkey, intf *idx); - - HDFLIBAPI FRETVAL(intf) nvffesiz - (intf * vkey, intf *idx); - - HDFLIBAPI FRETVAL(intf) nvffordr - (intf * vkey, intf *idx); - - HDFLIBAPI FRETVAL(intf) nvsfrdc - (intf * vkey, _fcd cbuf, intf * nelt, - intf * interlace); - - HDFLIBAPI FRETVAL(intf) nvsfrd - (intf * vkey, intf * buf, intf * nelt, - intf * interlace); - - HDFLIBAPI FRETVAL(intf) nvsreadc - (intf * vkey, uint8 * buf, intf * nelt, - intf * interlace); - - HDFLIBAPI FRETVAL(intf) nvsfwrtc - (intf * vkey, _fcd cbuf, intf * nelt, - intf * interlace); - - HDFLIBAPI FRETVAL(intf) nvsfwrt - (intf * vkey, intf * buf, intf * nelt, - intf * interlace); - - HDFLIBAPI FRETVAL(intf) nvswritc - (intf * vkey, uint8 * buf, intf * nelt, - intf * interlace); - - HDFLIBAPI FRETVAL(intf) nvsgintc - (intf * vkey); - - HDFLIBAPI FRETVAL(intf) nvseltsc - (intf * vkey); - - HDFLIBAPI FRETVAL(intf) nvsgfldc - (intf * vkey, _fcd fields); - - HDFLIBAPI FRETVAL(intf) nvssizc - (intf * vkey, _fcd fields, intf * fieldslen); - - HDFLIBAPI FRETVAL(intf) nventsc - (intf * f, intf * vgid); - - HDFLIBAPI FRETVAL(intf) nvlonec - (intf * f, intf * idarray, intf * asize); - - HDFLIBAPI FRETVAL(intf) nvslonec - (intf * f, intf * idarray, intf * asize); - - HDFLIBAPI FRETVAL(intf) nvfindc - (intf * f, _fcd name, intf * namelen); - - HDFLIBAPI FRETVAL(intf) nvfndclsc - (intf * f, _fcd vgclass, intf * classlen); - - HDFLIBAPI FRETVAL(intf) nvhscdc - (intf * f, _fcd field, _fcd cbuf, intf * n, - intf * datatype, _fcd vsname, _fcd vsclass, - intf * fieldlen, intf * vsnamelen, - intf * vsclasslen); - - HDFLIBAPI FRETVAL(intf) nvhsdc - (intf * f, _fcd field, uint8 * buf, intf * n, - intf * datatype, _fcd vsname, _fcd vsclass, - intf * fieldlen, intf * vsnamelen, - intf * vsclasslen); - - HDFLIBAPI FRETVAL(intf) nvhscdmc - (intf * f, _fcd field, _fcd cbuf, intf * n, - intf * datatype, _fcd vsname, _fcd vsclass, - intf * order, intf * fieldlen, intf * vsnamelen, - intf * vsclasslen); - - HDFLIBAPI FRETVAL(intf) nvhsdmc - (intf * f, _fcd field, uint8 * buf, intf * n, - intf * datatype, _fcd vsname, _fcd vsclass, - intf * order, intf * fieldlen, intf * vsnamelen, - intf * vsclasslen); - - HDFLIBAPI FRETVAL(intf) nvhmkgpc - (intf * f, intf * tagarray, intf * refarray, intf * n, - _fcd vgname, _fcd vgclass, intf * vgnamelen, intf * vgclasslen); - - HDFLIBAPI FRETVAL(intf) nvflocc - (intf * vkey, _fcd field, intf * fieldlen); - - HDFLIBAPI FRETVAL(intf) nvinqtrc - (intf * vkey, intf * tag, intf * ref); - - HDFLIBAPI FRETVAL(intf) nvntrc - (intf * vkey); - - HDFLIBAPI FRETVAL(intf) nvnrefs - (intf * vkey, intf *tag); - - HDFLIBAPI FRETVAL(intf) nvqref - (intf * vkey); - - HDFLIBAPI FRETVAL(intf) nvqtag - (intf * vkey); - - HDFLIBAPI FRETVAL(intf) nvgttrsc - (intf * vkey, intf * tagarray, intf * refarray, intf * n); - - HDFLIBAPI FRETVAL(intf) nvgttrc - (intf * vkey, intf * which, intf * tag, intf * ref); - - HDFLIBAPI FRETVAL(intf) nvadtrc - (intf * vkey, intf * tag, intf * ref); - - HDFLIBAPI FRETVAL(intf) nvdtrc - (intf * vkey, intf * tag, intf * ref); - - HDFLIBAPI FRETVAL(intf) nvsqfnelt - (intf * vkey, intf * nelt); - - HDFLIBAPI FRETVAL(intf) nvsqfintr - (intf * vkey, intf * interlace); - - HDFLIBAPI FRETVAL(intf) nvsqfldsc - (intf * vkey, _fcd fields, intf *fieldslen); - - HDFLIBAPI FRETVAL(intf) nvsqfvsiz - (intf * vkey, intf * size); - - HDFLIBAPI FRETVAL(intf) nvsqnamec - (intf * vkey, _fcd name, intf *namelen); - - HDFLIBAPI FRETVAL(intf) nvsfccpk - (intf *vs, intf *packtype, _fcd buflds, intf *buf, intf *bufsz, - intf *nrecs, _fcd pckfld, _fcd fldbuf, intf *buflds_len, intf *fld_len); - - HDFLIBAPI FRETVAL(intf) nvsfncpk - (intf *vs, intf *packtype, _fcd buflds, intf *buf, intf *bufsz, - intf *nrecs, _fcd pckfld, intf *fldbuf, intf *buflds_len, intf *fld_len); - - HDFLIBAPI FRETVAL(intf) nvscsetblsz - (intf *id, intf *block_size); - - HDFLIBAPI FRETVAL(intf) nvscsetnmbl - (intf *id, intf *num_blocks); - - HDFLIBAPI FRETVAL(intf) nvscgblinfo - (intf *id, intf *block_size, intf *num_blocks); - -/* - ** from vattrf.c - */ -#ifndef VATTR_FNAMES -# define VATTR_FNAMES -#ifdef DF_CAPFNAMES -# if defined(UNIX386) || (!(defined INTEL86) && !(defined WIN32)) -# define nvsfcfdx FNAME(VSFCFDX) -# define nvsfcsat FNAME(VSFCSAT) -# define nvsfcsca FNAME(VSFCSCA) -# define nvsfnats FNAME(VSFNATS) -# define nvsffnas FNAME(VSFFNAS) -# define nvsfcfda FNAME(VSFCFDA) -# define nvsfcain FNAME(VSFCAIN) -# define nvsfgnat FNAME(VSFGNAT) -# define nvsfgcat FNAME(VSFGCAT) -# define nvsfisat FNAME(VSFISAT) -# define nvfcsatt FNAME(VFCSATT) -# define nvfcscat FNAME(VFCSCAT) -# define nvfnatts FNAME(VFNATTS) -# define nvfcfdat FNAME(VFCFDAT) -# define nvfainfo FNAME(VFAINFO) -# define nvfgnatt FNAME(VFGNATT) -# define nvfgcatt FNAME(VFGCATT) -# define nvfgver FNAME(VFGVER) -# else /* !sl */ -# define nvsfcfdx FNAME(VSFCFDX) -# define nvsfcsat FNAME(VSFCSAT) -# define nvsfcsca FNAME(VSFCSCA) -# define nvsfcnats FNAME(VSFCNATS) -# define nvsfcfnas FNAME(VSFCFNAS) -# define nvsfcfda FNAME(VSFCFDA) -# define nvsfcainf FNAME(VSFCAINF) -# define nvsfcgna FNAME(VSFCGNA) -# define nvsfcgca FNAME(VSFCGCA) -# define nvsfcisa FNAME(VSFCISA) -# define nvfcsatt FNAME(VFCSATT) -# define nvfcscat FNAME(VFCSCAT) -# define nvfcnats FNAME(VFCNATS) -# define nvfcfdat FNAME(VFCFDAT) -# define nvfcainf FNAME(VFCAINF) -# define nvfcgnat FNAME(VFCGNAT) -# define nvfcgcat FNAME(VFCGCAT) -# define nvfcgver FNAME(VFCGVER) -# endif -#else /* !DF_CAPFNAMES */ -# if defined(UNIX386) || (!(defined INTEL86) && !(defined WIN32)) -# define nvsfcfdx FNAME(vsfcfdx) -# define nvsfcsat FNAME(vsfcsat) -# define nvsfcsca FNAME(vsfcsca) -# define nvsfnats FNAME(vsfnats) -# define nvsffnas FNAME(vsffnas) -# define nvsfcfda FNAME(vsfcfda) -# define nvsfcain FNAME(vsfcain) -# define nvsfgnat FNAME(vsfgnat) -# define nvsfgcat FNAME(vsfgcat) -# define nvsfisat FNAME(vsfisat) -# define nvfcsatt FNAME(vfcsatt) -# define nvfcscat FNAME(vfcscat) -# define nvfnatts FNAME(vfnatts) -# define nvfcfdat FNAME(vfcfdat) -# define nvfainfo FNAME(vfainfo) -# define nvfgnatt FNAME(vfgnatt) -# define nvfgcatt FNAME(vfgcatt) -# define nvfgver FNAME(vfgver) -# else /* !sl */ -# define nvsfcfdx FNAME(vsfcfdx) -# define nvsfcsat FNAME(vsfcsat) -# define nvsfcsca FNAME(vsfcsca) -# define nvsfcnats FNAME(vsfcnats) -# define nvsfcfnas FNAME(vsfcfnas) -# define nvsfcfda FNAME(vsfcfda) -# define nvsfcainf FNAME(vsfcainf) -# define nvsfcgna FNAME(vsfcgna) -# define nvsfcgca FNAME(vsfcgca) -# define nvsfcisa FNAME(vsfcisa) -# define nvfcsatt FNAME(vfcsatt) -# define nvfcscat FNAME(vfcscat) -# define nvfcnats FNAME(vfcnats) -# define nvfcfdat FNAME(vfcfdat) -# define nvfcainf FNAME(vfcainf) -# define nvfcgnat FNAME(vfcgnat) -# define nvfcgcat FNAME(vfcgcat) -# define nvfcgver FNAME(vfcgver) -# endif -#endif /* DF_CAPFNAMES */ -#endif /* VATTR_FNAMES */ - HDFLIBAPI FRETVAL(intf) nvsfcfdx - (intf *vsid, _fcd fldnm, intf *findex, intf *fldnmlen); - HDFLIBAPI FRETVAL(intf) nvsfcsat - (intf *vsid, intf *findex, _fcd attrnm, intf *dtype, - intf *count, intf *values, intf *attrnmlen); - HDFLIBAPI FRETVAL(intf) nvsfcsca - (intf *vsid, intf *findex, _fcd attrnm, intf *dtype, - intf *count, _fcd values, intf *attrnmlen); - HDFLIBAPI FRETVAL(intf) nvsfnats - (intf *vsid); - HDFLIBAPI FRETVAL(intf) nvsffnas - (intf *vsid, intf *findex); - HDFLIBAPI FRETVAL(intf) nvsfcfda - (intf *vsid, intf *findex, _fcd attrnm, intf *attrnmlen); - HDFLIBAPI FRETVAL(intf) nvsfcain - (intf *vsid, intf *findex, intf *aindex, _fcd attrname, - intf *dtype, intf *count, intf *size, intf *attrnamelen); - HDFLIBAPI FRETVAL(intf) nvsfgnat - (intf *vsid, intf *findex, intf *aindex, intf *values); - HDFLIBAPI FRETVAL(intf) nvsfgcat - (intf *vsid, intf *findex, intf *aindex, _fcd values); - HDFLIBAPI FRETVAL(intf) nvsfisat - (intf *vsid); - HDFLIBAPI FRETVAL(intf) nvfcsatt - (intf *vgid, _fcd attrnm, intf *dtype, - intf *count, intf *values, intf *attrnmlen); - HDFLIBAPI FRETVAL(intf) nvfcscat - (intf *vgid, _fcd attrnm, intf *dtype, intf *count, - _fcd values, intf *attrnmlen); - HDFLIBAPI FRETVAL(intf) nvfnatts - (intf *vgid); - HDFLIBAPI FRETVAL(intf) nvfcfdat - (intf *vgid, _fcd attrnm, intf *attrnmlen); - HDFLIBAPI FRETVAL(intf) nvfainfo - (intf *vgid, intf *aindex, _fcd attrname, - intf *dtype, intf *count, intf *size); - HDFLIBAPI FRETVAL(intf) nvfgnatt - (intf *vgid, intf *aindex, intf *values); - HDFLIBAPI FRETVAL(intf) nvfgcatt - (intf *vgid, intf *aindex, _fcd values); - HDFLIBAPI FRETVAL(intf) nvfgver - (intf *vgid); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -#endif /* _H_PROTO */ - diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/linklist.h b/Utilities/CAI/cai_dll/inc/inc_hdf/linklist.h deleted file mode 100755 index 9e3a817749..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/linklist.h +++ /dev/null @@ -1,210 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: linklist.h - * Purpose: header file for linked list API - * Dependencies: - * Invokes: - * Contents: - * Structure definitions: - * Constant definitions: - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef __LINKLIST_H -#define __LINKLIST_H - -#include "hdf.h" - -/* Definitions for linked-list creation flags */ -#define HUL_UNSORTED_LIST 0x0000 -#define HUL_SORTED_LIST 0x0001 - -/* Type of the function to compare objects & keys */ -typedef intn (*HULsearch_func_t)(const VOIDP obj, const VOIDP key); - -/* Type of the function to compare two objects */ -typedef intn (*HULfind_func_t)(const VOIDP obj1, const VOIDP obj2); - -/* Linked list information structure used */ -typedef struct node_info_struct_tag { - VOIDP *obj_ptr; /* pointer associated with the linked list node */ - struct node_info_struct_tag *next; /* link to list node */ - }node_info_t; - -/* Linked list head structure */ -typedef struct list_head_struct_tag { - uintn count; /* # of nodes in the list */ - uintn flags; /* list creation flags */ - HULfind_func_t cmp_func; /* node comparison function */ - node_info_t *node_list; /* pointer to a linked list of nodes */ - node_info_t *curr_node; /* pointer to the current node when iterating */ - }list_head_t; - -#if defined LIST_MASTER | defined LIST_TESTER - -/* Define this in only one place */ -#ifdef LIST_MASTER -/* Pointer to the list node free list */ -static node_info_t *node_free_list=NULL; - -#endif /* LIST_MASTER */ - -/* Useful routines for generally private use */ - -#endif /* LIST_MASTER | LIST_TESTER */ - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/****************************************************************************** - NAME - HULcreate_list - Create a linked list - - DESCRIPTION - Creates a linked list. The list may either be sorted or un-sorted, based - on the comparison function. - - RETURNS - Returns a pointer to the list if successful and NULL otherwise - -*******************************************************************************/ -list_head_t *HULcreate_list(HULfind_func_t find_func /* IN: object comparison function */ -); - -/****************************************************************************** - NAME - HULdestroy_list - Destroys a linked list - - DESCRIPTION - Destroys a linked list created by HULcreate_list(). This function - walks through the list and frees all the nodes, then frees the list head. - Note: this function does not (currently) free the objects in the nodes, - it just leaves 'em hanging. - - RETURNS - Returns SUCCEED/FAIL. - -*******************************************************************************/ -intn HULdestroy_list(list_head_t *lst /* IN: list to destroy */ -); - -/****************************************************************************** - NAME - HULadd_node - Adds an object to a linked-list - - DESCRIPTION - Adds an object to the linked list. If the list is sorted, the comparison - function is used to determine where to insert the node, otherwise it is - inserted at the head of the list. - - RETURNS - Returns SUCCEED/FAIL. - -*******************************************************************************/ -intn HULadd_node(list_head_t *lst, /* IN: list to modify */ - VOIDP obj /* IN: object to add to the list */ -); - -/****************************************************************************** - NAME - HULsearch_node - Search for an object in a linked-list - - DESCRIPTION - Locate an object in a linked list using a key and comparison function. - - RETURNS - Returns a pointer to the object found in the list, or NULL on failure. - -*******************************************************************************/ -VOIDP HULsearch_node(list_head_t *lst, /* IN: list to search */ - HULsearch_func_t srch_func, /* IN: function to use to find node */ - VOIDP key /* IN: key of object to search for */ -); - -/****************************************************************************** - NAME - HULfirst_node - Get the first object in a linked-list - - DESCRIPTION - Returns the first object in a linked-list and prepares the list for - interating through. - - RETURNS - Returns a pointer to the first object found in the list, or NULL on failure. - -*******************************************************************************/ -VOIDP HULfirst_node(list_head_t *lst /* IN: list to search */ -); - -/****************************************************************************** - NAME - HULnext_node - Get the next object in a linked-list - - DESCRIPTION - Returns the next object in a linked-list by walking through the list - - RETURNS - Returns a pointer to the next object found in the list, or NULL on failure. - -*******************************************************************************/ -VOIDP HULnext_node(list_head_t *lst /* IN: list to search */ -); - -/****************************************************************************** - NAME - HULremove_node - Removes an object from a linked-list - - DESCRIPTION - Remove an object from a linked list. The key and comparison function are - provided locate the object to delete. - - RETURNS - Returns a pointer to the object deleted from the list, or NULL on failure. - -*******************************************************************************/ -VOIDP HULremove_node(list_head_t *lst, /* IN: list to modify */ - HULsearch_func_t srch_func, /* IN: function to use to find node to remove */ - VOIDP key /* IN: object to add to the list */ -); - -/*-------------------------------------------------------------------------- - NAME - HULshutdown - PURPOSE - Terminate various global items. - USAGE - intn HULshutdown() - RETURNS - Returns SUCCEED/FAIL - DESCRIPTION - Free various buffers allocated in the HUL routines. - GLOBAL VARIABLES - COMMENTS, BUGS, ASSUMPTIONS - Should only ever be called by the "atexit" function HDFend - EXAMPLES - REVISION LOG ---------------------------------------------------------------------------*/ -intn -HULshutdown(void); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -#endif /* __LINKLIST_H */ - diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/mfan.h b/Utilities/CAI/cai_dll/inc/inc_hdf/mfan.h deleted file mode 100755 index 9865cc7a06..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/mfan.h +++ /dev/null @@ -1,372 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*------------------------------------------------------------------------------ - * File: mfan.h - * Author: GeorgeV - * Purpose: header file for the Multi-file Annotation Interface - * Invokes: - * Contents: - * Structure definitions: ANnode, ANentry - * Constant definitions: AN_DATA_LABEL, AN_DATA_DESC - * (-moved to hdf.h) AN_FILE_LABEL, AN_FILE_DESC - * - *----------------------------------------------------------------------------*/ - -#ifndef _MFAN_H /* avoid re-inclusion */ -#define _MFAN_H - -#include "hdf.h" - -#if 0 -/* enumerated types of the varous annotation types - * NOTE: moved to hdf.h since they are used by end users. */ -typedef enum -{ - AN_DATA_LABEL = 0, /* Data label */ - AN_DATA_DESC, /* Data description */ - AN_FILE_LABEL, /* File label */ - AN_FILE_DESC /* File description */ -} ann_type; -#endif - -#ifdef MFAN_C -/* WE ARE IN MAIN ANNOTATION SOURCE FILE "mfan.c" */ - -/* PRIVATE variables and definitions */ - -/* This sturcture is used to find which file the annotation belongs to - * and use the subsequent file specific annotation 'key' to find the - * annotation. The annotation atom group(ANIDGROUP) keeps track of - * all anotations across the file. */ -typedef struct ANnode -{ - int32 file_id; /* which file this annotation belongs to */ - int32 ann_key; /* type/ref: used to find annotation in corresponding - TBBT in filerec_t->tree[]. */ - intn new_ann; /* flag */ -} ANnode; - -/* - * This structure is an entry in the label/desc tree - * for a label/desc in the file, it gives the ref of the label/desc, - * and the tag/ref of the data item to which the label/desc relates - * The filerec_t->an_tree[] TBBT members will contain these entries. - **/ -typedef struct ANentry -{ - int32 ann_id; /* annotation id */ - uint16 annref; /* ref of annotation */ - uint16 elmtag; /* tag of data */ - uint16 elmref; /* ref of data */ -} ANentry; - - -/* This is the size of the hash tables used for annotation IDs */ -#define ANATOM_HASH_SIZE 64 - -/* Used to create unique 32bit keys from annotation type and reference number - * This key is used to add nodes to a corresponding TBBT in - * filrerec_t->an_tree[]. - * ---------------------------- - * | type(16bits) | ref(16bits) | - * -----------------------------*/ -#define AN_CREATE_KEY(t,r) ((((int32)t & 0xffff) << 16) | r) - -/* Obtain Reference number from key */ -#define AN_KEY2REF(k) ((uint16)((int32)k & 0xffff)) - -/* Obtain Annotation type from key */ -#define AN_KEY2TYPE(k) ((int32)((int32)k >> 16)) - -#else /* !MFAN_C */ -/* WE are NOT in main ANNOTATION source file - * Nothing EXPORTED except Public fcns */ - - -/****************************************************************************** - NAME - ANdestroy -- Un-Initialize Annotation Interface - - DESCRIPTION - Unallocates global annotaton node list and file list. - - RETURNS - SUCCEED or FAIL -*******************************************************************************/ -extern intn ANdestroy(void); - -/****************************************************************************** - NAME - ANstart - open file for annotation handling - - DESCRIPTION - Start annotation handling on the file return a annotation ID to the file. - - RETURNS - A file ID or FAIL. -*******************************************************************************/ -extern int32 ANstart(int32 file_id /* IN: file to start annotation access on */); - -/****************************************************************************** - NAME - ANfileinfo - Report high-level information about the ANxxx interface for a given file. - - DESCRIPTION - Reports general information about the number of file and object(i.e. data) - annotations in the file. This routine is generally used to find - the range of acceptable indices for ANselect calls. - - RETURNS - Returns SUCCEED if successful and FAIL othewise - -*******************************************************************************/ -extern intn ANfileinfo(int32 an_id, /* IN: annotation interface id */ - int32 *n_file_label, /* OUT: the # of file labels */ - int32 *n_file_desc, /* OUT: the # of file descriptions */ - int32 *n_obj_label, /* OUT: the # of object labels */ - int32 *n_obj_desc /* OUT: the # of object descriptions */); - -/****************************************************************************** - NAME - ANend - End annotation access to file file - - DESCRIPTION - End annotation access to file. - - RETURNS - SUCCEED if successful and FAIL otherwise. -*******************************************************************************/ -extern int32 ANend(int32 an_id /* IN: Annotation ID of file to close */); - -/****************************************************************************** - NAME - ANcreate - create a new element annotation and return a handle(id) - - DESCRIPTION - Creates a data annotation, returns an 'an_id' to work with the new - annotation which can either be a label or description. - Valid annotation types are AN_DATA_LABEL for data labels and - AN_DATA_DESC for data descriptions. - - RETURNS - An ID to an annotation which can either be a label or description. -*******************************************************************************/ -extern int32 ANcreate(int32 an_id, /* IN: annotation interface ID */ - uint16 elem_tag, /* IN: tag of item to be assigned annotation */ - uint16 elem_ref, /* IN: reference number of itme to be assigned ann*/ - ann_type type /* IN: annotation type */); - - -/****************************************************************************** - NAME - ANcreatef - create a new file annotation and return a handle(id) - - DESCRIPTION - Creates a file annotation, returns an 'an_id' to work with the new - file annotation which can either be a label or description. - Valid annotation types are AN_FILE_LABEL for file labels and - AN_FILE_DESC for file descritpions. - - RETURNS - An ID to an annotation which can either be a file label or description -*******************************************************************************/ -extern int32 ANcreatef(int32 an_id, /* IN: annotation interface ID */ - ann_type type /* IN: annotation type */); - -/****************************************************************************** - NAME - ANselect - get an annotation ID from index of 'type' - - DESCRIPTION - Get an annotation Id from index of 'type'. - The position index is ZERO based - - RETURNS - An ID to an annotation type which can either be a label or description -*******************************************************************************/ -extern int32 ANselect(int32 an_id, /* IN: annotation interface ID */ - int32 index, /* IN: index of annottion to get ID for */ - ann_type type /* IN: annotation type */); - -/****************************************************************************** - NAME - ANnumann - find number of annotation of 'type' that match the given element tag/ref - - DESCRIPTION - Find number of annotation of 'type' for the given element - tag/ref pair.Should not be used for File labels and - descriptions. - - RETURNS - number of annotation found if successful and FAIL (-1) otherwise - -*******************************************************************************/ -extern intn ANnumann(int32 an_id, /* IN: annotation interface id */ - ann_type type, /* IN: annotation type */ - uint16 elem_tag, /* IN: tag of item of which this is annotation */ - uint16 elem_ref /* IN: ref of item of which this is annotation*/); - -/****************************************************************************** - NAME - ANannlist - generate list of annotation ids of 'type' that match the given element tag/ref - - DESCRIPTION - Find and generate list of annotation ids of 'type' for the given - element tag/ref pair.Should not be used for File labels and - descriptions. - - RETURNS - number of annotations ids found if successful and FAIL (-1) otherwise - -*******************************************************************************/ -extern intn ANannlist(int32 an_id, /* IN: annotation interface id */ - ann_type type, /* IN: annotation type */ - uint16 elem_tag, /* IN: tag of item of which this is annotation */ - uint16 elem_ref, /* IN: ref of item of which this is annotation*/ - int32 ann_list[] /* OUT: array of ann_id's that match criteria.*/); - -/****************************************************************************** - NAME - ANannlen - get length of annotation givne annotation id - - DESCRIPTION - Uses the annotation id to find ann_key & file_id - - RETURNS - length of annotation if successful and FAIL (-1) otherwise - -*******************************************************************************/ -extern int32 ANannlen(int32 ann_id /* IN: annotation id */); - -/****************************************************************************** - NAME - ANwriteann - write annotation given ann_id - - DESCRIPTION - Checks for pre-existence of given annotation, replacing old one if it - exists. Writes out annotation. - - RETURNS - SUCCEED (0) if successful and FAIL (-1) otherwise - -*******************************************************************************/ -extern int32 ANwriteann(int32 ann_id, /* IN: annotation id */ - const char *ann, /* IN: annotation to write */ - int32 annlen /* IN: length of annotation*/); - -/****************************************************************************** - NAME - ANreadann - read annotation given ann_id - - DESCRIPTION - Gets tag and ref of annotation. Finds DD for that annotation. - Reads the annotation, taking care of NULL terminator, if necessary. - - RETURNS - SUCCEED (0) if successful and FAIL (-1) otherwise - -*******************************************************************************/ -extern int32 ANreadann(int32 ann_id, /* IN: annotation id (handle) */ - char *ann, /* OUT: space to return annotation in */ - int32 maxlen /* IN: size of space to return annotation in */); - -/****************************************************************************** - NAME - ANendaccess - end access to an annotation given it's id - - DESCRIPTION - Terminates access to an annotation. For now does nothing - - RETURNS - SUCCEED(0) or FAIL(-1) -*******************************************************************************/ -extern intn ANendaccess(int32 ann_id /* IN: annotation id */); - -/****************************************************************************** - NAME - ANget_tagref - get tag/ref pair for annotation based on type and index - - DESCRIPTION - Get the tag/ref of the annotation based on the type and index of the - annotation. The position index is zero based - - RETURNS - A tag/ref pairt to an annotation type which can either be a - label or description. - -*******************************************************************************/ -extern int32 ANget_tagref(int32 an_id, /* IN: annotation interface ID */ - int32 index, /* IN: index of annotation to get tag/ref for*/ - ann_type type, /* IN: annotation type */ - uint16 *ann_tag,/* OUT: Tag for annotation */ - uint16 *ann_ref /* OUT: ref for annotation */); - -/****************************************************************************** - NAME - ANid2tagref -- get tag/ref given annotation id - - DESCRIPTION - Uses the annotation id to find ann_node entry which contains ann_ref - - RETURNS - SUCCEED(0) if successful and FAIL (-1) otherwise. -*******************************************************************************/ -extern int32 ANid2tagref(int32 ann_id, /* IN: annotation id */ - uint16 *ann_tag, /* OUT: Tag for annotation */ - uint16 *ann_ref /* OUT: ref for annotation */); - -/****************************************************************************** - NAME - ANtagref2id -- get annotation id given tag/ref - - DESCRIPTION - Gets the annotation id of the annotation given the tag/ref of - the annotation itself and the annotation interface id. - - RETURNS - Annotation id of annotation if successful and FAIL(-1) otherwise. -*******************************************************************************/ -extern int32 ANtagref2id(int32 an_id, /* IN Annotation interface id */ - uint16 ann_tag, /* IN: Tag for annotation */ - uint16 ann_ref /* IN: ref for annotation */); - -/****************************************************************************** - NAME - ANatype2tag - annotation type to corresponding annotation TAG - - DESCRIPTION - Translate annotation type to corresponding TAG. - - RETURNS - Returns TAG corresponding to annotatin type. -*******************************************************************************/ -extern uint16 ANatype2tag(ann_type atype /* IN: Annotation type */); - -/****************************************************************************** - NAME - ANtag2atype - annotation TAG to corresponding annotation type - - DESCRIPTION - Translate annotation TAG to corresponding atype - - RETURNS - Returns type corresponding to annotatin TAG. -*******************************************************************************/ -extern ann_type ANtag2atype(uint16 atag /* IN: annotation tag */); - - -#endif /* !MFAN_C */ - -#endif /* _MFAN_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/mfgr.h b/Utilities/CAI/cai_dll/inc/inc_hdf/mfgr.h deleted file mode 100755 index 9459b81a33..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/mfgr.h +++ /dev/null @@ -1,143 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: mfgr.h - * Purpose: header file for multi-file general raster information - * Dependencies: - * Invokes: - * Contents: - * Structure definitions: - * Constant definitions: - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef __MFGR_H -#define __MFGR_H - -/* Interlace types available */ -typedef int16 gr_interlace_t; -#define MFGR_INTERLACE_PIXEL 0 /* pixel interlacing scheme */ -#define MFGR_INTERLACE_LINE 1 /* line interlacing scheme */ -#define MFGR_INTERLACE_COMPONENT 2 /* component interlacing scheme */ - -#if defined MFGR_MASTER | defined MFGR_TESTER - -#include "hfile.h" -#include "tbbt.h" /* Get tbbt routines */ - -/* This is the size of the hash tables used for GR & RI IDs */ -#define GRATOM_HASH_SIZE 32 - -/* The tag of the attribute data */ -#define RI_TAG DFTAG_VG /* Current RI groups are stored in Vgroups */ -#define ATTR_TAG DFTAG_VH /* Current GR attributes are stored in VDatas */ - -/* The default threshhold for attributes which will be cached */ -#define GR_ATTR_THRESHHOLD 2048 - -#define VALIDRIINDEX(i,gp) ((i)>=0 && (i)<(gp)->gr_count) - -/* - * Each gr_info_t maintains 2 threaded-balanced-binary-tress: one of - * raster images and one of global attributes - */ - -typedef struct gr_info { - int32 hdf_file_id; /* the corresponding HDF file ID (must be first in the structure) */ - uint16 gr_ref; /* ref # of the Vgroup of the GR in the file */ - - int32 gr_count; /* # of image entries in gr_tab so far */ - TBBT_TREE *grtree; /* Root of image B-Tree */ - uintn gr_modified; /* whether any images have been modified */ - - int32 gattr_count; /* # of global attr entries in gr_tab so far */ - TBBT_TREE *gattree; /* Root of global attribute B-Tree */ - uintn gattr_modified; /* whether any global attributes have been modified */ - - intn access; /* the number of active pointers to this file's GRstuff */ - uint32 attr_cache; /* the threshhold for the attribute sizes to cache */ -} gr_info_t; - -typedef struct at_info { - int32 index; /* index of the attribute (needs to be first in the struct) */ - int32 nt; /* number type of the attribute */ - int32 len; /* length/order of the attribute */ - uint16 ref; /* ref of the attribute (stored in VData) */ - uintn data_modified; /* flag to indicate whether the attribute data has been modified */ - uintn new_at; /* flag to indicate whether the attribute was added to the Vgroup */ - char *name; /* name of the attribute */ - void * data; /* data for the attribute */ -} at_info_t; - -typedef struct dim_info { - uint16 dim_ref; /* reference # of the Dim record */ - int32 xdim,ydim, /* dimensions of the image */ - ncomps, /* number of components of each pixel in image */ - nt, /* number type of the components */ - file_nt_subclass; /* number type subclass of data on disk */ - gr_interlace_t il; /* interlace of the components (stored on disk) */ - uint16 nt_tag,nt_ref; /* tag & ref of the number-type info */ - uint16 comp_tag,comp_ref; /* tag & ref of the compression info */ -} dim_info_t; - -typedef struct ri_info { - int32 index; /* index of this image (needs to be first in the struct) */ - uint16 ri_ref; /* ref # of the RI Vgroup */ - uint16 rig_ref; /* ref # of the RIG group */ - gr_info_t *gr_ptr; /* ptr to the GR info that this ri_info applies to */ - dim_info_t img_dim; /* image dimension information */ - dim_info_t lut_dim; /* palette dimension information */ - uint16 img_tag,img_ref; /* tag & ref of the image data */ - int32 img_aid; /* AID for the image data */ - intn acc_perm; /* Access permission (read/write) for image AID */ - uint16 lut_tag,lut_ref; /* tag & ref of the palette data */ - gr_interlace_t im_il; /* interlace of image when next read (default PIXEL) */ - gr_interlace_t lut_il; /* interlace of LUT when next read */ - uintn data_modified; /* whether the image or palette data has been modified */ - uintn meta_modified; /* whether the image or palette meta-info has been modified */ - uintn attr_modified; /* whether the attributes have been modified */ - char *name; /* name of the image */ - int32 lattr_count; /* # of local attr entries in ri_info so far */ - TBBT_TREE *lattree; /* Root of the local attribute B-Tree */ - intn access; /* the number of times this image has been selected */ - uintn use_buf_drvr; /* access to image needs to be through the buffered special element driver */ - uintn use_cr_drvr; /* access to image needs to be through the compressed raster special element driver */ - uintn comp_img; /* whether to compress image data */ - comp_coder_t comp_type; /* compression type */ - comp_info cinfo; /* compression information */ - uintn ext_img; /* whether to make image data external */ - char *ext_name; /* name of the external file */ - int32 ext_offset; /* offset in the external file */ - uintn acc_img; /* whether to make image data a different access type */ - uintn acc_type; /* type of access-mode to get image data with */ - uintn fill_img; /* whether to fill image, or just store fill value */ - void * fill_value; /* pointer to the fill value (NULL means use default fill value of 0) */ - uintn store_fill; /* whether to add fill value attribute or not */ -} ri_info_t; - -/* Useful raster routines for generally private use */ - -HDFLIBAPI intn GRIil_convert(const void * inbuf,gr_interlace_t inil,void * outbuf, - gr_interlace_t outil,int32 dims[2],int32 ncomp,int32 nt); - -extern VOID GRIgrdestroynode(void * n); - -extern VOID GRIattrdestroynode(void * n); - -extern VOID GRIridestroynode(void * n); - -#endif /* MFGR_MASTER | MFGR_TESTER */ - -#endif /* __MFGR_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/mstdio.h b/Utilities/CAI/cai_dll/inc/inc_hdf/mstdio.h deleted file mode 100755 index 0af1d82302..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/mstdio.h +++ /dev/null @@ -1,89 +0,0 @@ - -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/*----------------------------------------------------------------------------- - * File: mstdio.h - * Purpose: Header file for stdio-like modeling information. - * Dependencies: should be included after hdf.h - * Invokes: - * Contents: Structures & definitions for stdio modeling. This header - * should only be included in hcomp.c and mstdio.c. - * Structure definitions: - * Constant definitions: - *---------------------------------------------------------------------------*/ - -/* avoid re-inclusion */ -#ifndef __MSTDIO_H -#define __MSTDIO_H - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - -/* - ** from mstdio.c - */ - - extern int32 HCPmstdio_stread - (accrec_t * rec); - - extern int32 HCPmstdio_stwrite - (accrec_t * rec); - - extern int32 HCPmstdio_seek - (accrec_t * access_rec, int32 offset, int origin); - - extern int32 HCPmstdio_inquire - (accrec_t * access_rec, int32 *pfile_id, uint16 *ptag, uint16 *pref, - int32 *plength, int32 *poffset, int32 *pposn, int16 *paccess, - int16 *pspecial); - - extern int32 HCPmstdio_read - (accrec_t * access_rec, int32 length, void * data); - - extern int32 HCPmstdio_write - (accrec_t * access_rec, int32 length, const void * data); - - extern intn HCPmstdio_endaccess - (accrec_t * access_rec); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -/* model information about stdio model */ -typedef struct -{ - int32 pos; /* postion ? */ -} -comp_model_stdio_info_t; - -#ifndef MSTDIO_MASTER -extern funclist_t mstdio_funcs; /* functions to perform run-length encoding */ -#else -funclist_t mstdio_funcs = -{ /* functions to perform run-length encoding */ - HCPmstdio_stread, - HCPmstdio_stwrite, - HCPmstdio_seek, - HCPmstdio_inquire, - HCPmstdio_read, - HCPmstdio_write, - HCPmstdio_endaccess -}; -#endif - -#endif /* __MSTDIO_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/netcdf.h b/Utilities/CAI/cai_dll/inc/inc_hdf/netcdf.h deleted file mode 100755 index bae79fa0db..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/netcdf.h +++ /dev/null @@ -1,581 +0,0 @@ -/* Generated automatically from netcdf.h.in by configure. */ -/* - * Copyright 1993, University Corporation for Atmospheric Research - * - * Permission to use, copy, modify, and distribute this software and its - * documentation for any purpose without fee is hereby granted, provided - * that the above copyright notice appear in all copies, that both that - * copyright notice and this permission notice appear in supporting - * documentation, and that the name of UCAR/Unidata not be used in - * advertising or publicity pertaining to distribution of the software - * without specific, written prior permission. UCAR makes no - * representations about the suitability of this software for any purpose. - * It is provided "as is" without express or implied warranty. It is - * provided with no support and without obligation on the part of UCAR - * Unidata, to assist in its use, correction, modification, or enhancement. - * - */ -/* "$Id$" */ - -#ifndef _NETCDF_ -#define _NETCDF_ - -//RWR Modification Start 07/14/98 -//#include "api_adpt.h" -#include "hdfi.h" -//RWR Modification End - -/* - * The definitions ncvoid, USE_ENUM, and MAX_NC_OPEN, may need to be set - * properly for your installation. - */ - -/* - * Argument type in user functions (deprecated, backward compatibility) - */ -#ifndef UD_NO_VOID -#define ncvoid void -#else -/* system doesn't have void type */ -#define ncvoid char -#endif - - -/* - * If xdr_enum works properly on your system, you can define - * USE_ENUM so that nc_type is an enum. - * Otherwise, delete this definition so that the nc_type is - * an int and the valid values are #defined. - */ -#define USE_ENUM - - -/* - * The following macro is provided for backward compatibility only. If you - * are a new user of netCDF, then you may safely ignore it. If, however, - * you have an existing archive of netCDF files that use default - * floating-point fill values, then you should know that the definition of - * the default floating-point fill values changed with version 2.3 of the - * netCDF package. Prior to this release, the default floating-point fill - * values were not very portable: their correct behavior depended not only - * upon the particular platform, but also upon the compilation - * environment. This led to the definition of new, default floating-point - * fill values that are portable across all platforms and compilation - * environments. If you wish, however, to obtain the old, non-portable - * floating-point fill values, then the following macro should have a true - * value PRIOR TO BUILDING THE netCDF LIBRARY. - * - * Implementation details are contained in the section below on fill values. - */ -#define NC_OLD_FILLVALUES 0 - -/* - * Fill values - * These values are stuffed into newly allocated space as appropriate. - * The hope is that one might use these to notice that a particular datum - * has not been set. - */ - -#define FILL_BYTE ((char)-127) /* Largest Negative value */ -#define FILL_CHAR ((char)0) -#define FILL_SHORT ((short)-32767) -#define FILL_LONG ((long)-2147483647) - -#if !NC_OLD_FILLVALUES - -# define FILL_FLOAT 9.9692099683868690e+36 /* near 15 * 2^119 */ -# define FILL_DOUBLE 9.9692099683868690e+36 - -#else /* NC_OLD_FILLVALUES below */ - -/* - * This section is provided for backward compatibility only. Using - * XDR infinities for floating-point fill values has caused more problems - * than it has solved. We encourage you to define your own data-specific - * fill values rather than use default ones (see `_FillValue' below). - * If, however, you *must* use default fill values, then you should use - * the above fill values rather than the ones in this section. - */ - -/* - * XDR_F_INFINITY is a float value whose EXTERNAL (xdr) - * represention is ieee floating infinity. - * XDR_D_INFINITY is a double value whose EXTERNAL (xdr) - * represention is ieee double floating point infinity. - * These are used as default fill values below. - * - * This section shows three techniques for setting these: - * Direct assignment (vax, cray) - works for non IEEE machines - * Doesn't work when IEEE machines don't allow - * float or double constants whose values are infinity. - * Use of a union (preferred portable method) - should work on - * any ANSI compiler with IEEE floating point representations, - * modulo byte order and sizeof() considerations. - * Use of pointer puns - may work with many older compilers - * which don't allow intialization of unions. - * Often doesn't work with compilers which have strict - * alignment rules. - */ - - /* Direct assignment. All cases should be mutually exclusive */ - -#ifdef vax -#define XDR_D_INFINITY 1.7014118346046923e+38 -#define XDR_F_INFINITY 1.70141173e+38 -#endif /* vax */ - -#ifdef cray -#define XDR_D_INFINITY 1.797693134862313000e+308 -#define XDR_F_INFINITY XDR_D_INFINITY -#endif /* cray */ - -#ifdef notdef /* you might want to try these, on an IEEE machine */ -#define XDR_D_INFINITY 1.797693134862315900e+308 -#define XDR_F_INFINITY 3.40282357e+38 -#endif - -#ifdef __STDC__ - /* Use of a union, assumes IEEE representation and 1 byte unsigned char */ - -#ifndef XDR_D_INFINITY -#define USE_D_UNION - union xdr_d_union {unsigned char bb[8]; double dd;} ; - extern union xdr_d_union xdr_d_infs ; /* instantiated in array.c */ -#define XDR_D_INFINITY (xdr_d_infs.dd) -#endif /* !XDR_D_INFINITY */ - -#ifndef XDR_F_INFINITY -#define USE_F_UNION - union xdr_f_union {unsigned char bb[4]; float ff;} ; - extern union xdr_f_union xdr_f_infs ; /* instantiated in array.c */ -#define XDR_F_INFINITY (xdr_f_infs.ff) -#endif /* !XDR_F_INFINITY */ - - -#else /* __STDC__ */ - /* Use of a pointer pun, assumes IEEE representation, 4 byte long */ - -#ifndef XDR_D_INFINITY -#define USE_D_LONG_PUN - extern long xdr_d_infinity[] ; /* instantiated in array.c */ -#define XDR_D_INFINITY *(double *)xdr_d_infinity -#endif /* !XDR_D_INFINITY */ - -#ifndef XDR_F_INFINITY -#define USE_F_LONG_PUN - extern long xdr_f_infinity ; /* instantiated in array.c */ -#define XDR_F_INFINITY *((float *)&xdr_f_infinity) -#endif /* !XDR_F_INFINITY */ - -#endif /* __STDC__ */ - -/* End of INFINITY section */ - -#define FILL_FLOAT XDR_F_INFINITY /* IEEE Infinity */ -#define FILL_DOUBLE XDR_D_INFINITY - -#endif /* NC_OLD_FILLVALUES above */ - -/* - * masks for the struct NC flags field; passed in as 'mode' arg to - * nccreate and ncopen. - * - */ -#define NC_RDWR 1 /* read/write, 0 => readonly */ -#define NC_CREAT 2 /* in create phase, cleared by ncendef */ -#define NC_EXCL 4 /* on create, don't destroy existing file */ -#define NC_INDEF 8 /* in define mode, cleared by ncendef */ -#define NC_NSYNC 0x10 /* synchronise numrecs on change */ -#define NC_HSYNC 0x20 /* synchronise whole header on change */ -#define NC_NDIRTY 0x40 /* numrecs has changed */ -#define NC_HDIRTY 0x80 /* header info has changed */ -#define NC_NOFILL 0x100 /* Don't fill vars on endef and increase of record */ -#define NC_LINK 0x8000 /* isa link */ - -#define NC_FILL 0 /* argument to ncsetfill to clear NC_NOFILL */ - -/* - * 'mode' arguments for nccreate and ncopen - */ -#define NC_NOWRITE 0 -#define NC_WRITE NC_RDWR -#define NC_CLOBBER (NC_INDEF | NC_CREAT | NC_RDWR) -#define NC_NOCLOBBER (NC_INDEF | NC_EXCL | NC_CREAT | NC_RDWR) - -/* - * 'size' argument to ncdimdef for an unlimited dimension - */ -#define NC_UNLIMITED 0L - -/* - * attribute id to put/get a global attribute - */ -#define NC_GLOBAL -1 - -#ifndef HDF -/* - * This can be as large as the maximum number of stdio streams - * you can have open on your system. - */ -#define MAX_NC_OPEN 32 - -/* - * These maximums are enforced by the interface, to facilitate writing - * applications and utilities. However, nothing is statically allocated to - * these sizes internally. - */ -#define MAX_NC_DIMS 5000 /* max dimensions per file */ -#define MAX_NC_ATTRS 3000 /* max global or per variable attributes */ -#define MAX_NC_VARS 5000 /* max variables per file */ -#define MAX_NC_NAME 256 /* max length of a name */ -#define MAX_VAR_DIMS 32 /* max per variable dimensions */ - -/* - * Added feature. - * If you wish a variable to use a different value than the above - * defaults, create an attribute with the same type as the variable - * and the following reserved name. The value you give the attribute - * will be used as the fill value for that variable. - */ -#define _FillValue "_FillValue" - -#else /* HDF */ - -#include "hlimits.h" /* Hard coded constants for HDF library */ - -#endif /* HDF */ - -#ifdef USE_ENUM -/* - * The netcdf data types - */ -typedef enum { - NC_UNSPECIFIED, /* private */ - NC_BYTE, - NC_CHAR, - NC_SHORT, - NC_LONG, - NC_FLOAT, - NC_DOUBLE, - /* private */ - NC_BITFIELD, - NC_STRING, - NC_IARRAY, - NC_DIMENSION, - NC_VARIABLE, - NC_ATTRIBUTE -} nc_type ; -#else -typedef int nc_type ; -#define NC_UNSPECIFIED 0 /* private */ -#define NC_BYTE 1 -#define NC_CHAR 2 -#define NC_SHORT 3 -#define NC_LONG 4 -#define NC_FLOAT 5 -#define NC_DOUBLE 6 - /* private */ -#define NC_BITFIELD 7 -#define NC_STRING 8 -#define NC_IARRAY 9 -#define NC_DIMENSION 10 -#define NC_VARIABLE 11 -#define NC_ATTRIBUTE 12 -#endif - - -/* - * C data types corresponding to netCDF data types: - */ -/* Don't use these or the C++ interface gets confused -typedef char ncchar; -typedef char ncbyte; -typedef short ncshort; -typedef float ncfloat; -typedef double ncdouble; -*/ - -/* - * Variables/attributes of type NC_LONG should use the C type 'nclong' - */ -#ifdef __alpha -typedef int nclong; -#else -typedef long nclong; /* default, compatible type */ -#endif - - -/* - * Global netcdf error status variable - * Initialized in error.c - */ -#define NC_NOERR 0 /* No Error */ -#define NC_EBADID 1 /* Not a netcdf id */ -#define NC_ENFILE 2 /* Too many netcdfs open */ -#define NC_EEXIST 3 /* netcdf file exists && NC_NOCLOBBER */ -#define NC_EINVAL 4 /* Invalid Argument */ -#define NC_EPERM 5 /* Write to read only */ -#define NC_ENOTINDEFINE 6 /* Operation not allowed in data mode */ -#define NC_EINDEFINE 7 /* Operation not allowed in define mode */ -#define NC_EINVALCOORDS 8 /* Coordinates out of Domain */ -#define NC_EMAXDIMS 9 /* MAX_NC_DIMS exceeded */ -#define NC_ENAMEINUSE 10 /* String match to name in use */ -#define NC_ENOTATT 11 /* Attribute not found */ -#define NC_EMAXATTS 12 /* MAX_NC_ATTRS exceeded */ -#define NC_EBADTYPE 13 /* Not a netcdf data type */ -#define NC_EBADDIM 14 /* Invalid dimension id */ -#define NC_EUNLIMPOS 15 /* NC_UNLIMITED in the wrong index */ -#define NC_EMAXVARS 16 /* MAX_NC_VARS exceeded */ -#define NC_ENOTVAR 17 /* Variable not found */ -#define NC_EGLOBAL 18 /* Action prohibited on NC_GLOBAL varid */ -#define NC_ENOTNC 19 /* Not a netcdf file */ -#define NC_ESTS 20 /* In Fortran, string too short */ -#define NC_EMAXNAME 21 /* MAX_NC_NAME exceeded */ -#define NC_ENTOOL NC_EMAXNAME /* Backward compatibility */ -#define NC_EUNLIMIT 22 /* NC_UNLIMITED size already in use */ - -#define NC_EXDR 32 /* */ -#define NC_SYSERR -1 - -extern int ncerr ; - -/* - * Global options variable. Used to determine behavior of error handler. - * Initialized in lerror.c - */ -#define NC_FATAL 1 -#define NC_VERBOSE 2 - -HDFLIBAPI int ncopts ; /* default is (NC_FATAL | NC_VERBOSE) */ - -/* - * NB: The following feature-test line is too long in order to accomodate a - * bug in the VMS 5.3 C compiler. - */ -#ifndef HAVE_PROTOTYPES -# if defined(__STDC__) || defined(__GNUC__) || defined(__cplusplus) || defined(c_plusplus) -# define HAVE_PROTOTYPES -# endif -#endif - -#undef PROTO -#ifdef HAVE_PROTOTYPES -# define PROTO(x) x -#else -# define PROTO(x) () -#endif - -#include "hdf2netcdf.h" - -#ifdef __cplusplus -extern "C" { -#endif - -HDFLIBAPI int nccreate PROTO(( - const char* path, - int cmode -)); -HDFLIBAPI int ncopen PROTO(( - const char* path, - int mode -)); -HDFLIBAPI int ncredef PROTO(( - int cdfid -)); -HDFLIBAPI int ncendef PROTO(( - int cdfid -)); -HDFLIBAPI int ncclose PROTO(( - int cdfid -)); -HDFLIBAPI int ncinquire PROTO(( - int cdfid, - int* ndims, - int* nvars, - int* natts, - int* recdim -)); -HDFLIBAPI int ncsync PROTO(( - int cdfid -)); -HDFLIBAPI int ncabort PROTO(( - int cdfid -)); -HDFLIBAPI int ncdimdef PROTO(( - int cdfid, - const char* name, - long length -)); -HDFLIBAPI int ncdimid PROTO(( - int cdfid, - const char* name -)); -HDFLIBAPI int ncdiminq PROTO(( - int cdfid, - int dimid, - char* name, - long* length -)); -HDFLIBAPI int ncdimrename PROTO(( - int cdfid, - int dimid, - const char* name -)); -HDFLIBAPI int ncvardef PROTO(( - int cdfid, - const char* name, - nc_type datatype, - int ndims, - const int* dim -)); -HDFLIBAPI int ncvarid PROTO(( - int cdfid, - const char* name -)); -HDFLIBAPI int ncvarinq PROTO(( - int cdfid, - int varid, - char* name, - nc_type* datatype, - int* ndims, - int* dim, - int* natts -)); -HDFLIBAPI int ncvarput1 PROTO(( - int cdfid, - int varid, - const long* coords, - const void* value -)); -HDFLIBAPI int ncvarget1 PROTO(( - int cdfid, - int varid, - const long* coords, - void* value -)); -HDFLIBAPI int ncvarput PROTO(( - int cdfid, - int varid, - const long* start, - const long* count, - const void* value -)); -HDFLIBAPI int ncvarget PROTO(( - int cdfid, - int varid, - const long* start, - const long* count, - void* value -)); -HDFLIBAPI int ncvarputs PROTO(( - int cdfid, - int varid, - const long* start, - const long* count, - const long* stride, - const void* values -)); -HDFLIBAPI int ncvargets PROTO(( - int cdfid, - int varid, - const long* start, - const long* count, - const long* stride, - void* values -)); -HDFLIBAPI int ncvarputg PROTO(( - int cdfid, - int varid, - const long* start, - const long* count, - const long* stride, - const long* imap, - const void* values -)); -HDFLIBAPI int ncvargetg PROTO(( - int cdfid, - int varid, - const long* start, - const long* count, - const long* stride, - const long* imap, - void* values -)); -HDFLIBAPI int ncvarrename PROTO(( - int cdfid, - int varid, - const char* name -)); -HDFLIBAPI int ncattput PROTO(( - int cdfid, - int varid, - const char* name, - nc_type datatype, - int len, - const void* value -)); -HDFLIBAPI int ncattinq PROTO(( - int cdfid, - int varid, - const char* name, - nc_type* datatype, - int* len -)); -HDFLIBAPI int ncattget PROTO(( - int cdfid, - int varid, - const char* name, - void* value -)); -HDFLIBAPI int ncattcopy PROTO(( - int incdf, - int invar, - const char* name, - int outcdf, - int outvar -)); -HDFLIBAPI int ncattname PROTO(( - int cdfid, - int varid, - int attnum, - char* name -)); -HDFLIBAPI int ncattrename PROTO(( - int cdfid, - int varid, - const char* name, - const char* newname -)); -HDFLIBAPI int ncattdel PROTO(( - int cdfid, - int varid, - const char* name -)); -HDFLIBAPI int nctypelen PROTO(( - nc_type datatype -)); -HDFLIBAPI int ncsetfill PROTO(( - int cdfid, - int fillmode -)); -HDFLIBAPI int ncrecinq PROTO(( - int cdfid, - int* nrecvars, - int* recvarids, - long* recsizes -)); -HDFLIBAPI int ncrecget PROTO(( - int cdfid, - long recnum, - void** datap -)); -HDFLIBAPI int ncrecput PROTO(( - int cdfid, - long recnum, - void* const* datap -)); -#ifdef __cplusplus -} -#endif - -#endif /* _NETCDF_ */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/tbbt.h b/Utilities/CAI/cai_dll/inc/inc_hdf/tbbt.h deleted file mode 100755 index eebf864df2..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/tbbt.h +++ /dev/null @@ -1,327 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/* "tbbt.h" -- Data types/routines for threaded, balanced, binary trees. */ -/* Extended from Knuth 6.2.3, Algorithm A */ - -#ifndef TBBT_H -#define TBBT_H - -#ifdef lint /* lint always complains but may complain more if... */ -# define TBBT_INTERNALS /* TBBT_INTERNALS not always defined */ -#endif /* lint */ - -typedef struct tbbt_node TBBT_NODE; - -/* Threaded node structure */ -struct tbbt_node - { - VOIDP data; /* Pointer to user data to be associated with node */ - VOIDP key; /* Field to sort nodes on */ - -#ifdef TBBT_INTERNALS -# define PARENT 0 -# define LEFT 1 -# define RIGHT 2 - TBBT_NODE *link[3]; /* Pointers to parent, left child, and right child */ -# define Parent link[PARENT] -# define Lchild link[LEFT] -# define Rchild link[RIGHT] -# define TBBT_FLAG unsigned long -# define TBBT_LEAF unsigned long - TBBT_FLAG flags; /* Combination of the following bit fields: */ -# define TBBT_HEAVY(s) s /* If the `s' sub-tree is deeper than the other */ -# define TBBT_DOUBLE 4 /* If "heavy" sub-tree is two levels deeper */ -# define TBBT_INTERN 8 /* If node is internal (has two children) */ -# define TBBT_UNBAL ( TBBT_HEAVY(LEFT) | TBBT_HEAVY(RIGHT) ) -# define TBBT_FLAGS ( TBBT_UNBAL | TBBT_INTERN | TBBT_DOUBLE ) -# define TBBT_CHILD(s) ( TBBT_INTERN | TBBT_HEAVY(s) ) - TBBT_LEAF lcnt; /* count of left children */ - TBBT_LEAF rcnt; /* count of right children */ -# define LeftCnt(node) ( (node)->lcnt ) /* Left descendants */ -# define RightCnt(node) ( (node)->rcnt ) /* Left descendants */ -#if defined macintosh || defined MAC || defined SYMANTEC_C /* Macro substitution limit */ -# define Cnt(node,s) ( 1==(s) ? LeftCnt(node) : RightCnt(node) ) -#else /* !macintosh */ -# define Cnt(node,s) ( LEFT==(s) ? LeftCnt(node) : RightCnt(node) ) -#endif /* !macintosh */ -# define HasChild(n,s) ( Cnt(n,s)>0 ) -# define Heavy(n,s) ( (s) & (LeftCnt(n)>RightCnt(n) ? LEFT : \ - LeftCnt(n)==RightCnt(n) ? 0 : RIGHT)) -# define Intern(n) ( LeftCnt(n) && RightCnt(n) ) -# define UnBal(n) ( LeftCnt(n)>RightCnt(n) ? LEFT : \ - LeftCnt(n)==RightCnt(n) ? 0 : RIGHT) -# define Double(n) ( TBBT_DOUBLE & (n)->flags ) -# define Other(side) ( LEFT + RIGHT - (side) ) -# define Delta(n,s) ( ( Heavy(n,s) ? 1 : -1 ) \ - * ( Double(n) ? 2 : UnBal(n) ? 1 : 0 ) ) -# define SetFlags(n,s,b,i) ( ( -2<(b) && (b)<2 ? 0 : TBBT_DOUBLE ) \ - | ( 0>(b) ? TBBT_HEAVY(s) : (b)>0 ? TBBT_HEAVY(Other(s)) : 0 ) \ - | ( (i) ? TBBT_INTERN : 0 ) ) - }; - -/* Pointer to the tbbt node free list */ -static TBBT_NODE *tbbt_free_list=NULL; - -typedef struct tbbt_tree TBBT_TREE; -/* Threaded tree structure */ -struct tbbt_tree - { - TBBT_NODE *root; - unsigned long count; /* The number of nodes in the tree currently */ - uintn fast_compare; /* use a faster in-line compare (with casts) instead of function call */ - intn (*compar) (VOIDP k1, VOIDP k2, intn cmparg); - intn cmparg; -#endif /* TBBT_INTERNALS */ - }; - -/* Define the "fast compare" values */ -#define TBBT_FAST_UINT16_COMPARE 1 -#define TBBT_FAST_INT32_COMPARE 2 - -#ifndef TBBT_INTERNALS -typedef TBBT_NODE **TBBT_TREE; -#endif /* TBBT_INTERNALS */ - -/* Return maximum of two scalar values (use arguments w/o side effects): */ -#define Max(a,b) ( (a) > (b) ? (a) : (b) ) - -/* These routines are designed to allow use of a general-purpose balanced tree - * implimentation. These trees are appropriate for maintaining in memory one - * or more lists of items, each list sorted according to key values (key values - * must form a "completely ordered set") where no two items in a single list - * can have the same key value. The following operations are supported: - * Create an empty list - * Add an item to a list - * Look up an item in a list by key value - * Look up the Nth item in a list - * Delete an item from a list - * Find the first/last/next/previous item in a list - * Destroy a list - * Each of the above operations requires Order(log(N)) time where N is the - * number of items in the list (except for list creation which requires - * constant time and list destruction which requires Order(N) time if the user- - * supplied free-data-item or free-key-value routines require constant time). - * Each of the above operations (except create and destroy) can be performed - * on a subtree. - * - * Each node of a tree has associated with it a generic pointer (void *) which - * is set to point to one such "item" and a generic pointer to point to that - * item's "key value". The structure of the items and key values is up to the - * user to define. The user must specify a method for comparing key values. - * This routine takes three arguments, two pointers to key values and a third - * integer argument. You can specify a routine that expects pointers to "data - * items" rather than key values in which case the pointer to the key value in - * each node will be set equal to the pointer to the data item. - * - * Since the "data item" pointer is the first field of each tree node, these - * routines may be used without this "tbbt.h" file. For example, assume "ITM" - * is the structre definition for the data items you want to store in lists: - * ITM ***tbbtdmake( int (*cmp)(void *,void *,int), int arg ); - * ITM **root= NULL; (* How to create an empty tree w/o tbbtdmake() *) - * ITM **tbbtdfind( ITM ***tree, void *key, ITM ***pp ); - * ITM **tbbtfind( ITM **root, void *key, int (*cmp)(), int arg, ITM ***pp ); - * ITM **tbbtdless( ITM ***tree, void *key, ITM ***pp ); - * ITM **tbbtless( ITM **root, void *key, int (*cmp)(), int arg, ITM ***pp ); - * ITM **tbbtindx( ITM **root, long indx ); - * ITM **tbbtdins( ITM ***tree, ITM *item, void *key ); - * ITM **tbbtins( ITM ***root, ITM *item, void *key, int (*cmp)(), int arg ); - * ITM *tbbtrem( ITM ***root, ITM **node, void **kp ); - * ITM **tbbtfirst( ITM **root ), **tbbtlast( ITM **root ); - * ITM **tbbtnext( ITM **node ), **tbbtprev( ITM **node ); - * ITM ***tbbtdfree( ITM ***tree, void (*df)(ITM *), void (*kf)(void *) ); - * void tbbtfree( ITM ***root, void (*df)(ITM *), void (*kf)(void *) ); - */ - -#if defined c_plusplus || defined __cplusplus -extern "C" -{ -#endif /* c_plusplus || __cplusplus */ - - TBBT_TREE *tbbtdmake - (intn (*compar) (VOIDP, VOIDP, intn), intn arg, uintn fast_compare); -/* Allocates and initializes an empty threaded, balanced, binary tree and - * returns a pointer to the control structure for it. You can also create - * empty trees without this function as long as you never use tbbtd* routines - * (tbbtdfind, tbbtdins, tbbtdfree) on them. - * Examples: - * int keycmp(); - * TBBT_ROOT *root= tbbtdmake( keycmp, (int)keysiz , 0); - * or - * void *root= tbbtdmake( strcmp, 0 , 0); - * or - * void *root= tbbtdmake( keycmp, (int)keysiz , TBBT_FAST_UINT16_COMPARE); - * or - * TBBT_NODE *root= NULL; (* Don't use tbbtd* routines *) - * `cmp' is the routine to be used to compare two key values [in tbbtdfind() - * and tbbtdins()]. The arguments to `cmp' are the two keys to compare - * and `arg': (*cmp)(k1,k2,arg). `cmp' is expected to return 0 if its first - * two arguments point to identical key values, -1 (or any integer less than 0) - * if k1 points to a key value lower than that pointed to by k2, and 1 (or any - * integer greater than 0) otherwise. If `cmp' is NULL, memcmp is used. If - * `cmp' is NULL and `arg' is not greater than 0L, `1+strlen(key1)' is used in - * place of `arg' to emulate strcmp(): memcmp( k1, k2, 1+strlen(k1) ). You - * can use strcmp() directly (as in the second example above) as long as your C - * compiler does not assume strcmp() will always be passed exactly 2 arguments - * (only newer, ANSI-influenced C compilers are likely to be able to make this - * kind of assumption). You can also use a key comparison routine that expects - * pointers to data items rather than key values. - * The "fast compare" option is for keys of simple numeric types (currently - * uint16 and int32) and avoids the function call for faster searches in - * some cases. The key comparison routine is still required for some - * insertion routines which use it. - * - * Most of the other routines expect a pointer to a root node of a tree, not - * a pointer to the tree's control structure (only tbbtdfind(), tbbtdins(), - * and tbbtdfree() expect pointers to control structures). However TBBT_TREE - * is just defined as "**TBBT_NODE" (unless you have defined TBBT_INTERNALS so - * you have access to the internal structure of the nodes) so - * TBBT_TREE *tree1= tbbtdmake( NULL, 0 ); - * is equivalent to - * TBBT_NODE **tree1= tbbtdmake( NULL, 0 ); - * So could be used as: - * node= tbbtdfind( tree1, key, NULL ); - * node= tbbtfind( *tree1, key, compar, arg, NULL ); - * node= tbbtdless( tree1, key, NULL ); - * node= tbbtless( *tree1, key, compar, arg, NULL ); - * node= tbbtdins( tree1, item, key ); - * node= tbbtins( tree1, item, key, compar, arg ); - * item= tbbtrem( tree1, tbbtdfind(tree1,key,NULL), NULL ); - * item= tbbtrem( tree1, tbbtfind(*tree1,key,compar,arg,NULL), NULL ); - * tree1= tbbtdfree( tree1, free, NULL ); (* or whatever *) - * while - * TBBT_NODE *root= NULL; - * would be used like: - * node= tbbtfind( root, key ); - * node= tbbtins( &root, item, key ); - * node= tbbtrem( &root, tbbtfind(root,key), NULL ); - * tbbtfree( &root, free, NULL ); (* or whatever *) - * Never use tbbtfree() on a tree allocated with tbbtdmake() or on a sub-tree - * of ANY tree. Never use tbbtdfree() except on a tbbtdmake()d tree. - */ - - TBBT_NODE *tbbtdfind - (TBBT_TREE * tree, VOIDP key, TBBT_NODE ** pp); - TBBT_NODE *tbbtfind - (TBBT_NODE * root, VOIDP key, intn (*cmp) (VOIDP, VOIDP, intn), - intn arg, TBBT_NODE ** pp); - TBBT_NODE *tbbtdless - (TBBT_TREE * tree, VOIDP key, TBBT_NODE ** pp); - TBBT_NODE *tbbtless - (TBBT_NODE * root, VOIDP key, intn (*cmp) (VOIDP, VOIDP, intn), - intn arg, TBBT_NODE ** pp); -/* Locate a node based on the key given. A pointer to the node in the tree - * with a key value matching `key' is returned. If no such node exists, NULL - * is returned. Whether a node is found or not, if `pp' is not NULL, `*pp' - * will be set to point to the parent of the node we are looking for (or that - * node that would be the parent if the node is not found). tbbtdfind() is - * used on trees created using tbbtdmake() (so that `cmp' and `arg' don't have - * to be passed). tbbtfind() can be used on the root or any subtree of a tree - * create using tbbtdmake() and is used on any tree (or subtree) created with- - * out using tbbtdmake(). tbbtless() & tbbtdless() work exactly like tbbtfind() - * and tbbtdfind() except that they find the node with a key which is less than - * or equal to the key given to them. - */ - - TBBT_NODE *tbbtindx - (TBBT_NODE * root, int32 indx); -/* Locate the node that has `indx' nodes with lesser key values. This is like - * an array lookup with the first item in the list having index 0. For large - * values of `indx', this call is much faster than tbbtfirst() followed by - * `indx' tbbtnext()s. Thus `tbbtindx(&root,0L)' is equivalent to (and almost - * as fast as) `tbbtfirst(root)'. - */ - - TBBT_NODE *tbbtdins - (TBBT_TREE * tree, VOIDP item, VOIDP key); - TBBT_NODE *tbbtins - (TBBT_NODE ** root, VOIDP item, VOIDP key, intn (*cmp) (VOIDP, VOIDP, intn), intn arg); -/* Insert a new node to the tree having a key value of `key' and a data pointer - * of `item'. If a node already exists in the tree with key value `key' or if - * malloc() fails, NULL is returned (no node is inserted), otherwise a pointer - * to the inserted node is returned. `cmp' and `arg' are as for tbbtfind(). - */ - - VOIDP tbbtrem - (TBBT_NODE ** root, TBBT_NODE * node, VOIDP *kp); -/* Remove the node pointed to by `node' from the tree with root `root'. The - * data pointer for the deleted node is returned. If the second argument is - * NULL, NULL is returned. If `kp' is not NULL, `*kp' is set to point to the - * key value for the deleted node. Examples: - * data= tbbtrem( tree, tbbtdfind(tree,key), &kp ); free(data); free(kp); - * data= tbbtrem( &root, tbbtfind(root,key,compar,arg), NULL ); - * data= tbbtrem( &tree->root, tbbtdfind(tree,key), NULL ); - */ - - TBBT_NODE *tbbtfirst - (TBBT_NODE * root); - TBBT_NODE *tbbtlast - (TBBT_NODE * root); -/* Returns a pointer to node from the tree with the lowest(first)/highest(last) - * key value. If the tree is empy NULL is returned. Examples: - * node= tbbtfirst(*tree); - * node= tbbtfirst(root); - * node= tbbtlast(tree->root); - * node= tbbtlast(node); (* Last node in a sub-tree *) - */ - - TBBT_NODE *tbbtnext - (TBBT_NODE * node); - TBBT_NODE *tbbtprev - (TBBT_NODE * node); -/* Returns a pointer the node from the tree with the next highest (previous - * lowest) key value relative to the node pointed to by `node'. If `node' - * points the last (first) node of the tree, NULL is returned. - */ - - TBBT_TREE *tbbtdfree - (TBBT_TREE * tree, VOID(*fd) (VOIDP), VOID(*fk) (VOIDP)); - VOID tbbtfree - (TBBT_NODE ** root, VOID(*fd) (VOIDP), VOID(*fk) (VOIDP)); -/* Frees up an entire tree. `fd' is a pointer to a function that frees/ - * destroys data items, and `fk' is the same for key values. - * void free(); - * tree= tbbtdfree( tree, free, free ); - * tbbtfree( &root, free, free ); - * is a typical usage, where keys and data are individually malloc()d. If `fk' - * is NULL, no action is done for the key values (they were allocated on the - * stack, as a part of each data item, or together with one malloc() call, for - * example) and likewise for `fd'. tbbtdfree() always returns NULL and - * tbbtfree() always sets `root' to be NULL. - */ - - VOID tbbtprint - (TBBT_NODE * node); -/* Prints out the data in a node */ - - VOID tbbtdump - (TBBT_TREE * tree, intn method); -/* Prints an entire tree. The method variable determines which sort of - * traversal is used: - * -1 : Pre-Order Traversal - * 1 : Post-Order Traversal - * 0 : In-Order Traversal - */ - - long tbbtcount - (TBBT_TREE * tree); - -/* Terminate the buffers used in the tbbt*() interface */ - intn tbbt_shutdown(void); - -#if defined c_plusplus || defined __cplusplus -} -#endif /* c_plusplus || __cplusplus */ - -#endif /* TBBT_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_hdf/vg.h b/Utilities/CAI/cai_dll/inc/inc_hdf/vg.h deleted file mode 100755 index eb46fd04e4..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_hdf/vg.h +++ /dev/null @@ -1,72 +0,0 @@ -/**************************************************************************** - * NCSA HDF * - * Software Development Group * - * National Center for Supercomputing Applications * - * University of Illinois at Urbana-Champaign * - * 605 E. Springfield, Champaign IL 61820 * - * * - * For conditions of distribution and use, see the accompanying * - * hdf/COPYING file. * - * * - ****************************************************************************/ - -/* $Id$ */ - -/***************************************************************************** -* -* vg.h -* -* Part of HDF VSet interface -* -* defines symbols and structures used in all v*.c files -* -* NOTES: -* This include file depends on the basic HDF *.h files hdfi.h and hdf.h. -* An 'S' in the comment means that that data field is saved in the HDF file. -* -******************************************************************************/ - -#ifndef _VG_H -#define _VG_H - -/* -------------- H D F V S E T tags ---------------------------- */ - -/* In what versions were these valid? */ -#define OLD_VGDESCTAG 61820 /* tag for a vgroup d */ -#define OLD_VSDESCTAG 61821 /* tag for a vdata descriptor */ -#define OLD_VSDATATAG 61822 /* tag for actual raw data of a vdata */ - -/* re-define what new ones are. Don't know why there are two sets but - made them conform to what was in 'htags.h' */ -#define NEW_VGDESCTAG DFTAG_VG -#define NEW_VSDESCTAG DFTAG_VH -#define NEW_VSDATATAG DFTAG_VS - -#define VGDESCTAG NEW_VGDESCTAG -#define VSDESCTAG NEW_VSDESCTAG -#define VSDATATAG NEW_VSDATATAG - -#define _HDF_VSPACK 0 -#define _HDF_VSUNPACK 1 -#define VG_ATTR_SET 0x00000001 /* this vgroup has attribute(s) */ -#define VS_ATTR_SET 0x00000001 /* this vdata has attribute(s) */ -#define _HDF_VDATA -1 /* used in vdata attr interface - findex to represent the entire vdata */ -#define _HDF_ENTIRE_VDATA _HDF_VDATA /* if users have already used - _HDF_ENTIRE_VDATA since 4.1b1 was out */ - -/* Size of the atom hash table */ -#define VATOM_HASH_SIZE 256 - -/* .................................................................. */ -#define VSET_NEW_VERSION 4 /* if attr or other new features are set */ -#define VSET_VERSION 3 /* DO NOT CHANGE!! */ -#define VSET_OLD_VERSION 2 /* All version <= 2 use old type mappings */ -#define VSET_OLD_TYPES VSET_OLD_VERSION /* For backward compatibility */ - -/* Only include the library header if the VSET_INTERFACE macro is defined */ -#ifdef VSET_INTERFACE -#include "vgint.h" /* Library VSet information header */ -#endif /* VSET_INTERFACE */ - -#endif /* _VG_H */ diff --git a/Utilities/CAI/cai_dll/inc/inc_unix2win/asm/atomic.h b/Utilities/CAI/cai_dll/inc/inc_unix2win/asm/atomic.h deleted file mode 100755 index f2d2b872f0..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_unix2win/asm/atomic.h +++ /dev/null @@ -1,107 +0,0 @@ -/* ///////////////////////////////////////////////////////////////////////////// - * File: atomic.h - * - * Purpose: Declaration of Linux like atomic functions for the - * Win32 platform. - * - * Created: 21st November 2003 - * Updated: 19th September 2005 - * - * Home: http://synesis.com.au/software/ - * - * Copyright (c) 2003-2005, Matthew Wilson and Synesis Software - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the names of Matthew Wilson and Synesis Software nor the names of - * any contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * ////////////////////////////////////////////////////////////////////////// */ - - -#ifndef SYNSOFT_UNIXEM_INCL_SYS_H_ATOMIC -#define SYNSOFT_UNIXEM_INCL_SYS_H_ATOMIC - -#ifndef UNIXEM_DOCUMENTATION_SKIP_SECTION -# define SYNSOFT_UNIXEM_VER_SYS_H_ATOMIC_MAJOR 2 -# define SYNSOFT_UNIXEM_VER_SYS_H_ATOMIC_MINOR 1 -# define SYNSOFT_UNIXEM_VER_SYS_H_ATOMIC_REVISION 1 -# define SYNSOFT_UNIXEM_VER_SYS_H_ATOMIC_EDIT 14 -#endif /* !UNIXEM_DOCUMENTATION_SKIP_SECTION */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifndef _WIN32 -# error This file is only currently defined for compilation on Win32 systems -#endif /* _WIN32 */ - -/* ///////////////////////////////////////////////////////////////////////////// - * Constants and definitions - */ - - -/* ///////////////////////////////////////////////////////////////////////////// - * Typedefs - */ - -typedef signed long atomic_t; - -/* ///////////////////////////////////////////////////////////////////////////// - * API functions - */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -#define ATOMIC_INIT(i) (i) - -void atomic_set(atomic_t volatile *v, int i); -int atomic_write(atomic_t volatile *v, int i); -int atomic_read(atomic_t volatile *v); - -void atomic_add(int i, atomic_t volatile *v); -void atomic_sub(int i, atomic_t volatile *v); - -void atomic_inc(atomic_t volatile *v); -void atomic_dec(atomic_t volatile *v); - -/** Returns the previous value */ -int atomic_inc_and_test(atomic_t volatile *v); -/** Returns the previous value */ -int atomic_dec_and_test(atomic_t volatile *v); - -/** Returns the previous value */ -int atomic_add_and_test(int i, atomic_t volatile *v); -/** Returns the previous value */ -int atomic_sub_and_test(int i, atomic_t volatile *v); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#endif /* SYNSOFT_UNIXEM_INCL_SYS_H_ATOMIC */ - -/* ////////////////////////////////////////////////////////////////////////// */ diff --git a/Utilities/CAI/cai_dll/inc/inc_unix2win/dirent.h b/Utilities/CAI/cai_dll/inc/inc_unix2win/dirent.h deleted file mode 100755 index fdf73948b4..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_unix2win/dirent.h +++ /dev/null @@ -1,186 +0,0 @@ -/* ///////////////////////////////////////////////////////////////////////////// - * File: dirent.h - * - * Purpose: Declaration of the opendir() API functions and types for the - * Win32 platform. - * - * Created: 19th October 2002 - * Updated: 21st September 2005 - * - * Home: http://synesis.com.au/software/ - * - * Copyright (c) 2002-2005, Matthew Wilson and Synesis Software - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the names of Matthew Wilson and Synesis Software nor the names of - * any contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * ////////////////////////////////////////////////////////////////////////// */ - - -/** \file dirent.h - * - * Contains the declarations for the opendir()/readdir() API. - */ - -#ifndef SYNSOFT_UNIXEM_INCL_H_DIRENT -#define SYNSOFT_UNIXEM_INCL_H_DIRENT - -#ifndef UNIXEM_DOCUMENTATION_SKIP_SECTION -# define SYNSOFT_UNIXEM_VER_H_DIRENT_MAJOR 3 -# define SYNSOFT_UNIXEM_VER_H_DIRENT_MINOR 3 -# define SYNSOFT_UNIXEM_VER_H_DIRENT_REVISION 1 -# define SYNSOFT_UNIXEM_VER_H_DIRENT_EDIT 28 -#endif /* !UNIXEM_DOCUMENTATION_SKIP_SECTION */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** \weakgroup unixem Synesis Software UNIX Emulation for Win32 - * \brief The UNIX emulation library - */ - -/** \weakgroup unixem_dirent opendir()/readdir() API - * \ingroup UNIXem unixem - * \brief This API provides facilities for enumerating the contents of directories - * @{ - */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifndef _WIN32 -# error This file is only currently defined for compilation on Win32 systems -#endif /* _WIN32 */ - -/* ///////////////////////////////////////////////////////////////////////////// - * Includes - */ - -#include <stddef.h> - -/* ///////////////////////////////////////////////////////////////////////////// - * Constants and definitions - */ - -#ifndef NAME_MAX -# define NAME_MAX (260) /*!< \brief The maximum number of characters (including null terminator) in a directory entry name */ -#endif /* !NAME_MAX */ - -/* ///////////////////////////////////////////////////////////////////////////// - * Typedefs - */ - -typedef struct dirent_dir DIR; /*!< \brief Handle type for ANSI directory enumeration. \note dirent_dir is defined internally */ -typedef struct wdirent_dir wDIR; /*!< \brief Handle type for Unicode directory enumeration. \note dirent_dir is defined internally */ - -/** \brief Results structure for readdir() - */ -struct dirent -{ - char d_name[NAME_MAX + 1]; /*!< file name (null-terminated) */ - int d_mode; -}; - -/** \brief Results structure for wreaddir() - */ -struct wdirent -{ - wchar_t d_name[NAME_MAX + 1]; /*!< file name (null-terminated) */ - int d_mode; -}; - -/* ///////////////////////////////////////////////////////////////////////////// - * API functions - */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** \brief Returns a pointer to the next directory entry. - * - * This function opens the directory named by filename, and returns a - * directory to be used to in subsequent operations. NULL is returned - * if name cannot be accessed, or if resources cannot be acquired to - * process the request. - * - * \param name The name of the directory to search - * \return The directory handle from which the entries are read or NULL - */ -DIR *opendir(const char *name); -/** \brief Identical semantics to opendir(), but for Unicode searches. - */ -wDIR *wopendir(const wchar_t *name); - -/** \brief Closes a directory handle - * - * This function closes a directory handle that was opened with opendir() - * and releases any resources associated with that directory handle. - * - * \param dir The directory handle from which the entries are read - * \return 0 on success, or -1 to indicate error. - */ -int closedir(DIR *dir); -/** \brief Identical semantics to closedir(), but for Unicode searches. - */ -int wclosedir(wDIR *dir); - -/** \brief Resets a directory search position - * - * This function resets the position of the named directory handle to - * the beginning of the directory. - * - * \param dir The directory handle whose position should be reset - */ -void rewinddir(DIR *dir); -/** \brief Identical semantics to rewinddir(), but for Unicode searches. - */ -void wrewinddir(wDIR *dir); - -/** \brief Returns a pointer to the next directory entry. - * - * This function returns a pointer to the next directory entry, or NULL upon - * reaching the end of the directory or detecting an invalid seekdir() operation - * - * \param dir The directory handle from which the entries are read - * \return A dirent structure or NULL - */ -struct dirent *readdir(DIR *dir); -/** \brief Identical semantics to readdir(), but for Unicode searches. - */ -struct wdirent *wreaddir(wDIR *dir); - - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** @} // end of group unixem_dirent */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#endif /* SYNSOFT_UNIXEM_INCL_H_DIRENT */ - -/* ////////////////////////////////////////////////////////////////////////// */ diff --git a/Utilities/CAI/cai_dll/inc/inc_unix2win/dlfcn.h b/Utilities/CAI/cai_dll/inc/inc_unix2win/dlfcn.h deleted file mode 100755 index ecb71485bb..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_unix2win/dlfcn.h +++ /dev/null @@ -1,142 +0,0 @@ -/* ///////////////////////////////////////////////////////////////////////////// - * File: dlfcn.h - * - * Purpose: Declaration of the dlopen, dlclose(), dlsym() and dlerror() API - * functions. - * - * Created: 1st January 2004 - * Updated: 19th September 2005 - * - * Home: http://synesis.com.au/software/ - * - * Copyright (c) 2004-2005, Matthew Wilson and Synesis Software - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the names of Matthew Wilson and Synesis Software nor the names of - * any contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * ////////////////////////////////////////////////////////////////////////// */ - - -/** \file dlfcn.h - * - * Contains the declarations for the dlopen() API. - */ - -#ifndef SYNSOFT_UNIXEM_INCL_H_DLFCN -#define SYNSOFT_UNIXEM_INCL_H_DLFCN - -#ifndef UNIXEM_DOCUMENTATION_SKIP_SECTION -# define SYNSOFT_UNIXEM_VER_H_DLFCN_MAJOR 2 -# define SYNSOFT_UNIXEM_VER_H_DLFCN_MINOR 1 -# define SYNSOFT_UNIXEM_VER_H_DLFCN_REVISION 2 -# define SYNSOFT_UNIXEM_VER_H_DLFCN_EDIT 12 -#endif /* !UNIXEM_DOCUMENTATION_SKIP_SECTION */ - -#include <sys/types.h> - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** \weakgroup unixem Synesis Software UNIX Emulation for Win32 - * \brief The UNIX emulation library - */ - -/** \weakgroup unixem_dlopen dlopen() API - * \ingroup UNIXem unixem - * \brief This API provides facilities for manipulating dynamically loaded - * executable modules - * @{ - */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifndef _WIN32 -# error This file is only currently defined for compilation on Win32 systems -#endif /* _WIN32 */ - -/* ///////////////////////////////////////////////////////////////////////////// - * Constants and definitions - */ - -#define RTLD_LAZY (0x00001) /*!< Lazy function call binding. */ -#define RTLD_NOW (0x00002) /*!< Immediate function call binding. */ - -/* ///////////////////////////////////////////////////////////////////////////// - * API functions - */ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -/** \brief Loads the given module, - * - * \param moduleName The name of the module. The name is passed through to Win32's - * LoadLibrary(), so the value of this parameter is interpreted according to Win32's - * loading rules. - * \param mode The loading mode. This is ignored on Win32 platforms, and the function - * always behaves as if RTLD_NOW was specified - * \note - */ -void *dlopen(char const *moduleName, int mode); - -/** \brief Closes the given module - * - * \param hModule The handle of the executable module to close - * \retval 0 success - * \retval !0 failure. dlerror() will return an error string - */ -int dlclose(void *hModule); - -/** \brief Looks up a symbol - * - * \param hModule The handle of the executable module in which to search for the symbol - * \param symbolName The name of the symbol - * \return The pointer to the symbol, or NULL if no matching symbol was found - * \retval NULL The symbol was not found - */ -void *dlsym(void *hModule, char const *symbolName); - -/** \brief Returns a descriptive string for the last error - * - * \return A pointer to a string describing the last error, or NULL. - * \retval NULL No error occured, or dlerror() already called - * \note Each call to this function resets it, so that a second call will always return NULL - */ -char const *dlerror(void); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** @} // end of group unixem_dlopen */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#endif /* SYNSOFT_UNIXEM_INCL_H_DLFCN */ - -/* ////////////////////////////////////////////////////////////////////////// */ diff --git a/Utilities/CAI/cai_dll/inc/inc_unix2win/glob.h b/Utilities/CAI/cai_dll/inc/inc_unix2win/glob.h deleted file mode 100755 index 5a698600fb..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_unix2win/glob.h +++ /dev/null @@ -1,173 +0,0 @@ -/* ///////////////////////////////////////////////////////////////////////////// - * File: glob.h - * - * Purpose: Declaration of the glob() API functions and types for the - * Win32 platform. - * - * Created: 13th November 2002 - * Updated: 19th September 2005 - * - * Home: http://synesis.com.au/software/ - * - * Copyright (c) 2002-2005, Matthew Wilson and Synesis Software - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the names of Matthew Wilson and Synesis Software nor the names of - * any contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * ////////////////////////////////////////////////////////////////////////// */ - - -/** \file glob.h - * - * Contains the declarations for the glob() API. - */ - -#ifndef SYNSOFT_UNIXEM_INCL_H_GLOB -#define SYNSOFT_UNIXEM_INCL_H_GLOB - -#ifndef UNIXEM_DOCUMENTATION_SKIP_SECTION -# define SYNSOFT_UNIXEM_VER_H_GLOB_MAJOR 2 -# define SYNSOFT_UNIXEM_VER_H_GLOB_MINOR 2 -# define SYNSOFT_UNIXEM_VER_H_GLOB_REVISION 1 -# define SYNSOFT_UNIXEM_VER_H_GLOB_EDIT 30 -#endif /* !UNIXEM_DOCUMENTATION_SKIP_SECTION */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** \weakgroup unixem Synesis Software UNIX Emulation for Win32 - * \brief The UNIX emulation library - */ - -/** \weakgroup unixem_glob glob() API - * \ingroup UNIXem unixem - * \brief This API provides facilities for enumerating the file-system contents - * @{ - */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifndef _WIN32 -# error This file is only currently defined for compilation on Win32 systems -#endif /* _WIN32 */ - -/* ///////////////////////////////////////////////////////////////////////////// - * Constants and definitions - */ - -/* Error codes */ -#define GLOB_NOSPACE (1) /*!< \brief (Error result code:) An attempt to allocate memory failed, or if errno was 0 GLOB_LIMIT was specified in the flags and ARG_MAX patterns were matched. */ -#define GLOB_ABORTED (2) /*!< \brief (Error result code:) The scan was stopped because an error was encountered and either GLOB_ERR was set or (*errfunc)() returned non-zero. */ -#define GLOB_NOMATCH (3) /*!< \brief (Error result code:) The pattern does not match any existing pathname, and GLOB_NOCHECK was not set int flags. */ -#define GLOB_NOSYS (4) /*!< \brief (Error result code:) . */ -#define GLOB_ABEND GLOB_ABORTED /*!< \brief (Error result code:) . */ - -/* Flags */ -#define GLOB_ERR 0x00000001 /*!< \brief Return on read errors. */ -#define GLOB_MARK 0x00000002 /*!< \brief Append a slash to each name. */ -#define GLOB_NOSORT 0x00000004 /*!< \brief Don't sort the names. */ -#define GLOB_DOOFFS 0x00000008 /*!< \brief Insert PGLOB->gl_offs NULLs. Supported from version 1.6 of UNIXEm. */ -#define GLOB_NOCHECK 0x00000010 /*!< \brief If nothing matches, return the pattern. Supported from version 1.6 of UNIXEm. */ -#define GLOB_APPEND 0x00000020 /*!< \brief Append to results of a previous call. Not currently supported in this implementation. */ -#define GLOB_NOESCAPE 0x00000040 /*!< \brief Backslashes don't quote metacharacters. Has no effect in this implementation, since escaping is not supported. */ - -#define GLOB_PERIOD 0x00000080 /*!< \brief Leading `.' can be matched by metachars. Supported from version 1.6 of UNIXEm. */ -#define GLOB_MAGCHAR 0x00000100 /*!< \brief Set in gl_flags if any metachars seen. Supported from version 1.6 of UNIXEm. */ -/* #define GLOB_ALTDIRFUNC 0x00000200 */ /*!< \brief Use gl_opendir et al functions. Not currently supported in this implementation. */ -/* #define GLOB_BRACE 0x00000400 */ /*!< \brief Expand "{a,b}" to "a" "b". Not currently supported in this implementation. */ -#define GLOB_NOMAGIC 0x00000800 /*!< \brief If no magic chars, return the pattern. Supported from version 1.6 of UNIXEm. */ -#define GLOB_TILDE 0x00001000 /*!< \brief Expand ~user and ~ to home directories. Partially supported from version 1.6 of UNIXEm: leading ~ is expanded to %HOMEDRIVE%%HOMEPATH%. */ -#define GLOB_ONLYDIR 0x00002000 /*!< \brief Match only directories. This implementation guarantees to only return directories when this flag is specified. */ -#define GLOB_TILDE_CHECK 0x00004000 /*!< \brief Like GLOB_TILDE but return an GLOB_NOMATCH even if GLOB_NOCHECK specified. Supported from version 1.6 of UNIXEm. */ -#define GLOB_ONLYFILE 0x00008000 /*!< \brief Match only files. Supported from version 1.6 of UNIXEm. */ -#define GLOB_NODOTSDIRS 0x00010000 /*!< \brief Elide "." and ".." directories from wildcard searches. Supported from version 1.6 of UNIXEm. */ -#define GLOB_LIMIT 0x00020000 /*!< \brief Limits the search to the number specified by the caller in gl_matchc. Supported from version 1.6 of UNIXEm. */ - -/* ///////////////////////////////////////////////////////////////////////////// - * Typedefs - */ - -/** \brief Result structure for glob() - * - * This structure is used by glob() to return the results of the search. - */ -typedef struct -{ - int gl_pathc; /*!< count of total paths so far */ - int gl_matchc; /*!< count of paths matching pattern */ - int gl_offs; /*!< reserved at beginning of gl_pathv */ - int gl_flags; /*!< returned flags */ - char **gl_pathv; /*!< list of paths matching pattern */ -} glob_t; - -/* ///////////////////////////////////////////////////////////////////////////// - * API functions - */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** \brief Generates pathnames matching a pattern - * - * This function is a pathname generator that implements the rules for - * file name pattern matching used by the UNIX shell. - * - * \param pattern The pattern controlling the search - * \param flags A combination of the <b>GLOB_*</b> flags - * \param errfunc A function that is called each time part of the search processing fails - * \param pglob Pointer to a glob_t structure to receive the search results - * \return 0 on success, otherwise one of the <b>GLOB_*</b> error codes - */ -int glob( char const *pattern - , int flags -#if defined(__COMO__) - , int (*errfunc)(char const *, int) -#else /* ? compiler */ - , const int (*errfunc)(char const *, int) -#endif /* compiler */ - , glob_t *pglob); - -/** \brief Frees the results of a call to glob - * - * This function releases any memory allocated in a call to glob. It must - * always be called for a successful call to glob. - * - * \param pglob Pointer to a glob_t structure to receive the search results - */ -void globfree(glob_t *pglob); - -#ifdef __cplusplus -} -#endif /* __cplusplus */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** @} // end of group unixem_glob */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#endif /* SYNSOFT_UNIXEM_INCL_H_GLOB */ - -/* ////////////////////////////////////////////////////////////////////////// */ diff --git a/Utilities/CAI/cai_dll/inc/inc_unix2win/sys/mman.h b/Utilities/CAI/cai_dll/inc/inc_unix2win/sys/mman.h deleted file mode 100755 index c53003f94e..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_unix2win/sys/mman.h +++ /dev/null @@ -1,160 +0,0 @@ -/* ///////////////////////////////////////////////////////////////////////////// - * File: mman.h (sys/mman.h) - * - * Purpose: Declaration of the mmap() and munmap() API functions. - * - * Created: 18th December 2003 - * Updated: 21st September 2005 - * - * Home: http://synesis.com.au/software/ - * - * Copyright (c) 2003-2005, Matthew Wilson and Synesis Software - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the names of Matthew Wilson and Synesis Software nor the names of - * any contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * ////////////////////////////////////////////////////////////////////////// */ - - -/** \file sys/mman.h - * - * Contains the declarations for the mmap() API. - */ - -#ifndef SYNSOFT_UNIXEM_INCL_SYS_H_MMAP -#define SYNSOFT_UNIXEM_INCL_SYS_H_MMAP - -#ifndef UNIXEM_DOCUMENTATION_SKIP_SECTION -# define SYNSOFT_UNIXEM_VER_SYS_H_MMAP_MAJOR 2 -# define SYNSOFT_UNIXEM_VER_SYS_H_MMAP_MINOR 1 -# define SYNSOFT_UNIXEM_VER_SYS_H_MMAP_REVISION 2 -# define SYNSOFT_UNIXEM_VER_SYS_H_MMAP_EDIT 17 -#endif /* !UNIXEM_DOCUMENTATION_SKIP_SECTION */ - -#if defined(__MWERKS__) -# include <sys/stat.h> /* For off_t */ -#endif /* compiler */ -#include <sys/types.h> - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** \weakgroup unixem Synesis Software UNIX Emulation for Win32 - * \brief The UNIX emulation library - */ - -/** \weakgroup unixem_mmap mmap() API - * \ingroup UNIXem unixem - * \brief This API provides facilities for manipulating memory-mapped files - * @{ - */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifndef _WIN32 -# error This file is only currently defined for compilation on Win32 systems -#endif /* _WIN32 */ - -/* ///////////////////////////////////////////////////////////////////////////// - * Constants and definitions - */ - -#define PROT_READ (0x01) /*!< \brief page can be read */ -#define PROT_WRITE (0x02) /*!< \brief page can be written */ -#define PROT_EXEC (0x04) /*!< \brief page can be executed */ -#define PROT_NONE (0x00) /*!< \brief page can not be accessed */ - -#define MAP_PRIVATE (0x02) /*!< \brief Changes are private */ -#define MAP_ANONYMOUS (0x20) /*!< \brief Ignore fd and offset parameters */ -#define MAP_FIXED (0x10) /*!< \brief Interpret addr exactly */ - -#define MAP_FAILED ((void*)-1) /*!< \brief Returned from mmap() when the mapping fails */ - -/* ///////////////////////////////////////////////////////////////////////////// - * API functions - */ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -/** \brief Maps a file into memory, and returns a pointer to it - * - * \param addr Suggested address for the mapping - * \param len The number of bytes in the mapped region. The combination of - * len and offset must not exceed the length of the mapped file - * \param prot Either PROT_NONE, or a combination of the other PROT_* flags - * \param flags One of MAP_PRIVATE, MAP_ANONYMOUS or MAP_FIXED. - * \param fd The file descriptor of the file to map, or -1 to allocate an anonymous map - * \param offset The offset within the file to start the mapped region - * - * \retval pointer to mapped region if successful - * \retval MAP_FAILED if failed - * - * \note The current implementation supports the following three modes: - * 1. Read-only file; 2. Read-write file; 3. Anonymous Read-write block of - * system paging file. - */ - -void *mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset); - -/** \brief Deletes a mapped region - * - * The munmap() system call deletes the mappings for the specified address - * range, and causes further references to addresses within the range to - * generate invalid memory references. - * - * \param addr The base address of the mapped region to unmap - * \param len The length of the mapped region. Ignore in the Win32 implementation - * - * \retval 0 if successful - * \retval -1 if failed - */ - -int munmap(void *addr, size_t len); - -/** \brief Writes any dirty pages within the given range to disk - * - * \param addr The base address of the mapped region - * \param len The length of the mapped region to flush to disk. Will be rounded up - * to next page boundary. - * \param flags Ignored - */ - -int msync(void *addr, size_t len, int flags); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** @} // end of group unixem_mmap */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#endif /* SYNSOFT_UNIXEM_INCL_SYS_H_MMAP */ - -/* ////////////////////////////////////////////////////////////////////////// */ diff --git a/Utilities/CAI/cai_dll/inc/inc_unix2win/sys/time.h b/Utilities/CAI/cai_dll/inc/inc_unix2win/sys/time.h deleted file mode 100755 index effc027ba9..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_unix2win/sys/time.h +++ /dev/null @@ -1,136 +0,0 @@ -/* ///////////////////////////////////////////////////////////////////////////// - * File: time.h (sys/time.h) - * - * Purpose: Declaration of the gettimeofday() API function and supporting - * types for the Win32 platform. - * - * Created: 8th December 2002 - * Updated: 21st September 2005 - * - * Home: http://synesis.com.au/software/ - * - * Copyright (c) 2002-2005, Matthew Wilson and Synesis Software - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the names of Matthew Wilson and Synesis Software nor the names of - * any contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * ////////////////////////////////////////////////////////////////////////// */ - - -/** \file sys/time.h - * - * Contains time functions and types. - */ - -#ifndef SYNSOFT_UNIXEM_INCL_SYS_H_TIME -#define SYNSOFT_UNIXEM_INCL_SYS_H_TIME - -#ifndef UNIXEM_DOCUMENTATION_SKIP_SECTION -# define SYNSOFT_UNIXEM_VER_SYS_H_TIME_MAJOR 2 -# define SYNSOFT_UNIXEM_VER_SYS_H_TIME_MINOR 0 -# define SYNSOFT_UNIXEM_VER_SYS_H_TIME_REVISION 2 -# define SYNSOFT_UNIXEM_VER_SYS_H_TIME_EDIT 14 -#endif /* !UNIXEM_DOCUMENTATION_SKIP_SECTION */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** \weakgroup unixem Synesis Software UNIX Emulation for Win32 - * \brief The UNIX emulation library - */ - -/** \weakgroup unixem_time time() API - * \ingroup UNIXem unixem - * \brief Time functions and types - * @{ - */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -/** \brief A representation of current time, used by gettimeofday(). - * - * This structure represents the time, in seconds and microseconds, since Jan. - * 1, 1970, in UTC. Returned by the gettimeofday() function. - */ - -#if !defined(_WINSOCKAPI_) && \ - !defined(_WINSOCK2API_) && \ - !defined(_WINSOCK2_H) && \ - !defined(_TIMEVAL_DEFINED) - -/* - ( !defined(__GNUC__) || \ - !defined(_TIMEVAL_DEFINED)) -*/ - -struct timeval -{ - long tv_sec; /*!< The number of seconds, since Jan. 1, 1970, in the time value. */ - long tv_usec; /*!< The number of microseconds in the time value. */ -}; - -# if !defined(_TIMEVAL_DEFINED) -# define _TIMEVAL_DEFINED -# endif /* __GNUC__ */ - -#endif /* _WINSOCKAPI_ / _TIMEVAL_DEFINED */ - -/** \brief - * - * This structure is NOT used in any meaningful way by the gettimeofday() function - * implementation in this library. - */ -struct timezone -{ - int tz_minuteswest; /*!< minutes west of Greenwich. */ - int tz_dsttime; /*!< type of dst corrections to apply. */ -}; - -/** \brief Accesses the current UTC time - * - * Retrieves the current time and timezone information, relative to Greenwich Mean Time - * - * \param tv Pointer to a timeval structure to receive the time information - * \param tz Pointer to a timezone structure to receive the timezone information - */ -extern void gettimeofday(struct timeval *tv, struct timezone *tz); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** @} // end of group unixem_time */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#endif /* SYNSOFT_UNIXEM_INCL_SYS_H_TIME */ - -/* ////////////////////////////////////////////////////////////////////////// */ diff --git a/Utilities/CAI/cai_dll/inc/inc_unix2win/sys/uio.h b/Utilities/CAI/cai_dll/inc/inc_unix2win/sys/uio.h deleted file mode 100755 index fbc39ff78b..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_unix2win/sys/uio.h +++ /dev/null @@ -1,107 +0,0 @@ -/* ///////////////////////////////////////////////////////////////////////////// - * File: uio.h (sys/uio.h) - * - * Purpose: Vector file read/write. - * - * Created: 19th September 2005 - * Updated: 21st September 2005 - * - * Home: http://synesis.com.au/software/ - * - * Copyright (c) 2005, Matthew Wilson and Synesis Software - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the names of Matthew Wilson and Synesis Software nor the names of - * any contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * ////////////////////////////////////////////////////////////////////////// */ - - -/** \file sys/uio.h - * - * Vector file read/write. - */ - -#ifndef SYNSOFT_UNIXEM_INCL_SYS_H_UIO -#define SYNSOFT_UNIXEM_INCL_SYS_H_UIO - -#ifndef UNIXEM_DOCUMENTATION_SKIP_SECTION -# define SYNSOFT_UNIXEM_VER_SYS_H_UIO_MAJOR 1 -# define SYNSOFT_UNIXEM_VER_SYS_H_UIO_MINOR 0 -# define SYNSOFT_UNIXEM_VER_SYS_H_UIO_REVISION 2 -# define SYNSOFT_UNIXEM_VER_SYS_H_UIO_EDIT 3 -#endif /* !UNIXEM_DOCUMENTATION_SKIP_SECTION */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** \weakgroup unixem Synesis Software UNIX Emulation for Win32 - * \brief The UNIX emulation library - */ - -/** \weakgroup unixem_uio uio() API - * \ingroup UNIXem unixem - * \brief UIO functions and types - * @{ - */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -/* ///////////////////////////////////////////////////////////////////////////// - * Typedefs - */ - -/* TODO: Check which compilers (' libraries) define this for Win32. */ -typedef signed long ssize_t; - -struct iovec -{ - void *iov_base; /* Base address */ - size_t iov_len; /* Number of bytes referenced */ -}; - -/* ///////////////////////////////////////////////////////////////////////////// - * Functions - */ - -ssize_t readv(int fd, struct iovec const *vector, int count); -ssize_t writev(int fd, struct iovec const *vector, int count); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** @} // end of group unixem_time */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#endif /* SYNSOFT_UNIXEM_INCL_SYS_H_UIO */ - -/* ////////////////////////////////////////////////////////////////////////// */ diff --git a/Utilities/CAI/cai_dll/inc/inc_unix2win/unistd.h b/Utilities/CAI/cai_dll/inc/inc_unix2win/unistd.h deleted file mode 100755 index bf431bde8f..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_unix2win/unistd.h +++ /dev/null @@ -1,247 +0,0 @@ -/* ///////////////////////////////////////////////////////////////////////////// - * File: unistd.h - * - * Purpose: Declaration of the . - * - * Created: 1st November 2003 - * Updated: 21st September 2005 - * - * Home: http://synesis.com.au/software/ - * - * Copyright (c) 2003-2005, Matthew Wilson and Synesis Software - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the names of Matthew Wilson and Synesis Software nor the names of - * any contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * ////////////////////////////////////////////////////////////////////////// */ - - -/** \file unistd.h - * - * Contains standard limits and declarations. - */ - -#ifndef SYNSOFT_UNIXEM_INCL_H_UNISTD -#define SYNSOFT_UNIXEM_INCL_H_UNISTD - -#ifndef UNIXEM_DOCUMENTATION_SKIP_SECTION -# define SYNSOFT_UNIXEM_VER_H_UNISTD_MAJOR 2 -# define SYNSOFT_UNIXEM_VER_H_UNISTD_MINOR 3 -# define SYNSOFT_UNIXEM_VER_H_UNISTD_REVISION 4 -# define SYNSOFT_UNIXEM_VER_H_UNISTD_EDIT 26 -#endif /* !UNIXEM_DOCUMENTATION_SKIP_SECTION */ - -/* ///////////////////////////////////////////////////////////////////////////// - * Includes - */ - -#include <stddef.h> /* for size_t */ -#include <sys/types.h> /* for mode_t */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** \weakgroup unixem Synesis Software UNIX Emulation for Win32 - * \brief The UNIX emulation library - */ - -/** \weakgroup unixem_unistd unistd.h - * \ingroup UNIXem unixem - * \brief Standard limits and declarations - * @{ - */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#ifndef _WIN32 -# error This file is only currently defined for compilation on Win32 systems -#endif /* _WIN32 */ - -/* ///////////////////////////////////////////////////////////////////////////// - * Constants and definitions - */ - -//#ifndef PATH_MAX -//# define PATH_MAX (260) /*!< \brief The maximum number of characters (including null terminator) in a directory entry name */ -//#endif /* !PATH_MAX */ - -enum -{ - _PC_LINK_MAX /*!< The maximum number of links to the file. */ -#define _PC_LINK_MAX _PC_LINK_MAX - , _PC_MAX_CANON /*!< Maximum number of bytes in canonical input line. Applicable only to terminal devices. */ -#define _PC_MAX_CANON _PC_MAX_CANON - , _PC_MAX_INPUT /*!< Maximum number of bytes allowed in an input queue. Applicable only to terminal devices. */ -#define _PC_MAX_INPUT _PC_MAX_INPUT - , _PC_NAME_MAX /*!< Maximum number of bytes in a file name, not including a nul terminator. This number can range from 14 through 255. This value is applicable only to a directory file. */ -#define _PC_NAME_MAX _PC_NAME_MAX - , _PC_PATH_MAX /*!< Maximum number of bytes in a path name, including a nul terminator. */ -#define _PC_PATH_MAX _PC_PATH_MAX - - , _PC_PIPE_BUF /*!< Maximum number of bytes guaranteed to be written atomically. This value is applicable only to a first-in-first-out (FIFO). */ -#define _PC_PIPE_BUF _PC_PIPE_BUF - , _PC_CHOWN_RESTRICTED /*!< Returns 0 if the use of the chown subroutine is restricted to a process with appropriate privileges, and if the chown subroutine is restricted to changing the group ID of a file only to the effective group ID of the process or to one of its supplementary group IDs. */ -#define _PC_CHOWN_RESTRICTED _PC_CHOWN_RESTRICTED - , _PC_NO_TRUNC /*!< Returns 0 if long component names are truncated. This value is applicable only to a directory file. */ -#define _PC_NO_TRUNC _PC_NO_TRUNC - , _PC_VDISABLE /*!< This is always 0. No disabling character is defined. This value is applicable only to a terminal device. */ -#define _PC_VDISABLE _PC_VDISABLE - , _PC_AIX_DISK_PARTITION /*!< Determines the physical partition size of the disk. -Note: -The _PC_AIX_DISK_PARTITION variable is available only to the root user. */ -#define _PC_AIX_DISK_PARTITION _PC_AIX_DISK_PARTITION - , _PC_AIX_DISK_SIZE /*!< Determines the disk size in megabytes. -Note: -The _PC_AIX_DISK_SIZE variable is available only to the root user. -Note: -The _PC_FILESIZEBITS and PC_SYNC_IO flags apply to AIX 4.3 and later releases. */ -#define _PC_AIX_DISK_SIZE _PC_AIX_DISK_SIZE - , _PC_FILESIZEBITS /*!< Returns the minimum number of bits required to hold the file system's maximum file size as a signed integer. The smallest value returned is 32. */ -#define _PC_FILESIZEBITS _PC_FILESIZEBITS - , _PC_SYNC_IO /*!< Returns -1 if the file system does not support the Synchronized Input and Output option. Any value other than -1 is returned if the file system supports the option. */ -#define _PC_SYNC_IO _PC_SYNC_IO -}; - -/* ///////////////////////////////////////////////////////////////////////////// - * API functions - */ - -#ifdef __cplusplus -extern "C" { -#endif /* __cplusplus */ - -/** \brief Creates a hardlink. - * - * This function creates a link from \c originalFile to \c linkName. - * - * \param originalFile Path of the original file - * \param linkName Path of the link - * - * \return O on success, or -1 if there is an error - * - * \note Hardlink support is only available on Windows 2000 and later, and only - * works within a single drive. - */ -int link(const char *originalFile, const char *linkName); - - -/** \brief Unlinks a file or directory - * - * \param path The path of the file or directory to unlink - * - * \return O on success, or -1 if there is an error - */ -int unlink(const char *path); - -/** \brief Change the current working directory. - * - * This function changes the current working directory to the directory - * specified by dirName. dirName must refer to an existing directory. - * - * \param dirName Path of new working directory - * \return O on success, or -1 if there is an error - */ -int chdir(const char *dirName); - -/** \brief Get the current working directory - * - * This function gets the full path of the current working directory - * and stores it in buffer. - * - * \param buffer Storage location for the current working directory - * \param max_len Maximum length of path (in characters) - * \return buffer on success, or NULL to indicate error. - */ -char *getcwd(char *buffer, size_t max_len); - -#if !defined(__MWERKS__) - -/** \brief Creates the given directory - * - * This function creates the named directory. - * - * \param dirName Path of directory to remove - * \param mode The access permissions of the directory - * - * \return O on success, or -1 if there is an error - */ -int mkdir(const char *dirName, unsigned mode); - -#endif /* !__MWERKS__ */ - -/** \brief Removes the given directory - * - * This function removes the named directory. - * - * \param dirName Path of directory to remove - * \return O on success, or -1 if there is an error - */ -int rmdir(const char *dirName); - -/** \brief Closes a file - * - * \param handle The handle of the file to be closed - * \return 0 on success, or -1 if there is an error - */ -int close(int handle); - -/** \brief Creates a pipe - * - * \param handles An array of two handles. handles[0] will be set to the - * read stream. handels[1] will be set to the write stream - * \return 0 on success, or -1 if there is an error - */ -/* int pipe(int handles[2]); */ - -/** \brief Returns the size, in bytes, of the page size - */ -int getpagesize(void); - -/** \brief Provides access to various system limits not available at compile time - */ -long pathconf(char const *path, int name); - - -/** \brief Turns \c path into a fully qualified path, resolving all symbolic - * links, multiple /, /./ and /../ - * - * \param path The relative path to be converted into absolute form - * \param resolvedPath Pointer to a buffer to receive the path. This must contain - * sufficient storage for a valid path - */ -char *realpath(char const *path, char resolvedPath[]); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -/** @} // end of group unixem_unistd */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#endif /* SYNSOFT_UNIXEM_INCL_H_UNISTD */ - -/* ////////////////////////////////////////////////////////////////////////// */ diff --git a/Utilities/CAI/cai_dll/inc/inc_unix2win/unixem/implicit_link.h b/Utilities/CAI/cai_dll/inc/inc_unix2win/unixem/implicit_link.h deleted file mode 100755 index 3b9e65a439..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_unix2win/unixem/implicit_link.h +++ /dev/null @@ -1,185 +0,0 @@ -/* ///////////////////////////////////////////////////////////////////////////// - * File: unixem/implicit_link.h - * - * Purpose: Implicit linking for the UNIXEm API. - * - * Created: 29th August 2005 - * Updated: 29th August 2005 - * - * Home: http://synesis.com.au/software/ - * - * Copyright 1994-2005, Matthew Wilson and Synesis Software - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the names of Matthew Wilson and Synesis Software nor the names of - * any contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * ////////////////////////////////////////////////////////////////////////// */ - - -/** \file unixem/implicit_link.h Implicit linking for the UNIXEm API - */ - -#ifndef UNIXEM_INCL_UNIXEM_H_IMPLICIT_LINK -#define UNIXEM_INCL_UNIXEM_H_IMPLICIT_LINK - -/* ///////////////////////////////////////////////////////////////////////////// - * Version - */ - -#ifndef UNIXEM_DOCUMENTATION_SKIP_SECTION -# define UNIXEM_VER_UNIXEM_H_IMPLICIT_LINK_MAJOR 1 -# define UNIXEM_VER_UNIXEM_H_IMPLICIT_LINK_MINOR 0 -# define UNIXEM_VER_UNIXEM_H_IMPLICIT_LINK_REVISION 1 -# define UNIXEM_VER_UNIXEM_H_IMPLICIT_LINK_EDIT 1 -#endif /* !UNIXEM_DOCUMENTATION_SKIP_SECTION */ - -/* ///////////////////////////////////////////////////////////////////////////// - * Includes - */ - -#include <unixem/unixem.h> - -/* ///////////////////////////////////////////////////////////////////////////// - * Implicit linking - */ - -#if defined(WIN32) || \ - defined(_WIN32) - -# if defined(__BORLANDC__) || \ - /* defined(__DMC__) || */ \ - defined(__INTEL_COMPILER) || \ - defined(__MWERKS__) || \ - defined(_MSC_VER) -# define UNIXEM_IMPLICIT_LINK_SUPPORT -# endif /* compiler */ - - -# if defined(UNIXEM_IMPLICIT_LINK_SUPPORT) - -# if defined(__BORLANDC__) -# if __BORLANDC__ == 0x0550 -# define UNIXEM_IMPL_LINK_COMPILER_NAME "bc55" -# elif (__BORLANDC__ == 0x0551) -# define UNIXEM_IMPL_LINK_COMPILER_NAME "bc551" -# elif (__BORLANDC__ == 0x0560) -# define UNIXEM_IMPL_LINK_COMPILER_NAME "bc56" -# elif (__BORLANDC__ == 0x0564) -# define UNIXEM_IMPL_LINK_COMPILER_NAME "bc564" -# else /* ? __BORLANDC__ */ -# error Unrecognised value of __BORLANDC__ -# endif /* __BORLANDC__ */ - -/* -# elif defined(__DMC__) -# define UNIXEM_IMPL_LINK_COMPILER_NAME "dm" - */ - -# elif defined(__INTEL_COMPILER) -# if (__INTEL_COMPILER == 600) -# define UNIXEM_IMPL_LINK_COMPILER_NAME "icl6" -# elif (__INTEL_COMPILER == 700) -# define UNIXEM_IMPL_LINK_COMPILER_NAME "icl7" -# elif (__INTEL_COMPILER == 800) -# define UNIXEM_IMPL_LINK_COMPILER_NAME "icl8" -# else /* ? __INTEL_COMPILER */ -# error Unrecognised value of __INTEL_COMPILER -# endif /* __INTEL_COMPILER */ - -# elif defined(__MWERKS__) -# if ((__MWERKS__ & 0xFF00) == 0x2400) -# define UNIXEM_IMPL_LINK_COMPILER_NAME "cw7" -# elif ((__MWERKS__ & 0xFF00) == 0x3000) -# define UNIXEM_IMPL_LINK_COMPILER_NAME "cw8" -# elif ((__MWERKS__ & 0xFF00) == 0x3200) -# define UNIXEM_IMPL_LINK_COMPILER_NAME "cw9" -# else /* ? __MWERKS__ */ -# error Unrecognised value of __MWERKS__ -# endif /* __MWERKS__ */ - -# elif defined(_MSC_VER) -# if _MSC_VER == 1000 -# define UNIXEM_IMPL_LINK_COMPILER_NAME "vc4" -# elif _MSC_VER == 1020 -# define UNIXEM_IMPL_LINK_COMPILER_NAME "vc42" -# elif _MSC_VER == 1100 -# define UNIXEM_IMPL_LINK_COMPILER_NAME "vc5" -# elif _MSC_VER == 1200 -# define UNIXEM_IMPL_LINK_COMPILER_NAME "vc6" -# elif _MSC_VER == 1300 -# define UNIXEM_IMPL_LINK_COMPILER_NAME "vc7" -# elif _MSC_VER == 1310 -# define UNIXEM_IMPL_LINK_COMPILER_NAME "vc71" -# elif _MSC_VER == 1400 -# define UNIXEM_IMPL_LINK_COMPILER_NAME "vc8" -# else /* ? _MSC_VER */ -# error Unrecognised value of _MSC_VER -# endif /* _MSC_VER */ - -# else /* ? compiler */ -# error Unrecognised compiler -# endif /* compiler */ - - -# if defined(__MT__) || \ - defined(_REENTRANT) || \ - defined(_MT) -# if defined(_DLL) || \ - defined(__DLL) -# define UNIXEM_IMPL_LINK_THREADING_TYPE ".dll" -# else /* ? dll */ -# define UNIXEM_IMPL_LINK_THREADING_TYPE ".mt" -# endif /* dll */ -# else /* ? mt */ -# define UNIXEM_IMPL_LINK_THREADING_TYPE "" -# endif /* mt */ - - -# if !defined(NDEBUG) && \ - defined(_DEBUG) -# define UNIXEM_IMPL_LINK_DEBUG_TYPE ".debug" -# else /* ? debug */ -# define UNIXEM_IMPL_LINK_DEBUG_TYPE "" -# endif /* debug */ - -# define UNIXEM_IMPL_LINK_LIBRARY_BASENAME_s_(x) #x -# define UNIXEM_IMPL_LINK_LIBRARY_BASENAME_s(x) UNIXEM_IMPL_LINK_LIBRARY_BASENAME_s_(x) -# define UNIXEM_IMPL_LINK_LIBRARY_BASENAME "unixem." UNIXEM_IMPL_LINK_LIBRARY_BASENAME_s(UNIXEM_VER_MAJOR) "." - -# define UNIXEM_IMPL_LINK_LIBRARY_NAME UNIXEM_IMPL_LINK_LIBRARY_BASENAME UNIXEM_IMPL_LINK_COMPILER_NAME UNIXEM_IMPL_LINK_THREADING_TYPE UNIXEM_IMPL_LINK_DEBUG_TYPE ".lib" - -# pragma message("lib: " UNIXEM_IMPL_LINK_LIBRARY_NAME) - -# pragma comment(lib, UNIXEM_IMPL_LINK_LIBRARY_NAME) - -# endif /* UNIXEM_IMPLICIT_LINK_SUPPORT */ - -#endif /* Win32 */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#endif /* UNIXEM_INCL_UNIXEM_H_IMPLICIT_LINK */ - -/* ////////////////////////////////////////////////////////////////////////// */ diff --git a/Utilities/CAI/cai_dll/inc/inc_unix2win/unixem/internal/util.h b/Utilities/CAI/cai_dll/inc/inc_unix2win/unixem/internal/util.h deleted file mode 100755 index 4e2369ede1..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_unix2win/unixem/internal/util.h +++ /dev/null @@ -1,97 +0,0 @@ -/* ///////////////////////////////////////////////////////////////////////////// - * File: unixem/internal/util.h - * - * Purpose: Internal utility header for the UNIXEm API. - * - * Created: 2nd September 2005 - * Updated: 2nd September 2005 - * - * Home: http://synesis.com.au/software/ - * - * Copyright 1994-2005, Matthew Wilson and Synesis Software - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the names of Matthew Wilson and Synesis Software nor the names of - * any contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * ////////////////////////////////////////////////////////////////////////// */ - - -/** \file unixem/internal/util Internal utility header for the UNIXEm API - */ - -#ifndef UNIXEM_INCL_UNIXEM_INTERNAL_H_UTIL -#define UNIXEM_INCL_UNIXEM_INTERNAL_H_UTIL - -/* ///////////////////////////////////////////////////////////////////////////// - * Version - */ - -#ifndef UNIXEM_DOCUMENTATION_SKIP_SECTION -# define UNIXEM_VER_UNIXEM_INTERNAL_H_UTIL_MAJOR 1 -# define UNIXEM_VER_UNIXEM_INTERNAL_H_UTIL_MINOR 0 -# define UNIXEM_VER_UNIXEM_INTERNAL_H_UTIL_REVISION 1 -# define UNIXEM_VER_UNIXEM_INTERNAL_H_UTIL_EDIT 1 -#endif /* !UNIXEM_DOCUMENTATION_SKIP_SECTION */ - -/* ///////////////////////////////////////////////////////////////////////////// - * Includes - */ - -#include <unixem/unixem.h> - -/* ///////////////////////////////////////////////////////////////////////////// - * Macros - */ - -#ifndef NUM_ELEMENTS -# define NUM_ELEMENTS(x) (sizeof(x) / sizeof(0[x])) -#endif /* !NUM_ELEMENTS */ - -/* ///////////////////////////////////////////////////////////////////////////// - * Function declarations - */ - -#ifdef __cplusplus -extern "C" -{ -#endif /* __cplusplus */ - -int errno_from_Win32(unsigned long); - -/** Gets the drive letter of the current working directory - * - * \retval Either an uppercase letter, or '\0' on failure; - */ -char get_current_drive(void); - -#ifdef __cplusplus -} /* extern "C" */ -#endif /* __cplusplus */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#endif /* UNIXEM_INCL_UNIXEM_INTERNAL_H_UTIL */ - -/* ////////////////////////////////////////////////////////////////////////// */ diff --git a/Utilities/CAI/cai_dll/inc/inc_unix2win/unixem/unixem.h b/Utilities/CAI/cai_dll/inc/inc_unix2win/unixem/unixem.h deleted file mode 100755 index 24442d87db..0000000000 --- a/Utilities/CAI/cai_dll/inc/inc_unix2win/unixem/unixem.h +++ /dev/null @@ -1,98 +0,0 @@ -/* ///////////////////////////////////////////////////////////////////////////// - * File: unixem/unixem.h - * - * Purpose: Root header for the UNIXEm API. - * - * Created: 29th August 2005 - * Updated: 2nd September 2005 - * - * Home: http://synesis.com.au/software/ - * - * Copyright 1994-2005, Matthew Wilson and Synesis Software - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions are met: - * - * - Redistributions of source code must retain the above copyright notice, this - * list of conditions and the following disclaimer. - * - Redistributions in binary form must reproduce the above copyright notice, - * this list of conditions and the following disclaimer in the documentation - * and/or other materials provided with the distribution. - * - Neither the names of Matthew Wilson and Synesis Software nor the names of - * any contributors may be used to endorse or promote products derived from - * this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" - * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE - * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE - * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE - * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR - * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - * ////////////////////////////////////////////////////////////////////////// */ - - -/** \file unixem/unixem.h Root header for the UNIXEm API - */ - -#ifndef UNIXEM_INCL_UNIXEM_H_UNIXEM -#define UNIXEM_INCL_UNIXEM_H_UNIXEM - -/* ///////////////////////////////////////////////////////////////////////////// - * Version - */ - -#ifndef UNIXEM_DOCUMENTATION_SKIP_SECTION -# define UNIXEM_VER_UNIXEM_H_UNIXEM_MAJOR 1 -# define UNIXEM_VER_UNIXEM_H_UNIXEM_MINOR 0 -# define UNIXEM_VER_UNIXEM_H_UNIXEM_REVISION 1 -# define UNIXEM_VER_UNIXEM_H_UNIXEM_EDIT 1 -#endif /* !UNIXEM_DOCUMENTATION_SKIP_SECTION */ - -/** \def UNIXEM_VER_MAJOR - * The major version number of UNIXEm - */ - -/** \def UNIXEM_VER_MINOR - * The minor version number of UNIXEm - */ - -/** \def UNIXEM_VER_REVISION - * The revision version number of UNIXEm - */ - -/** \def UNIXEM_VER - * The current composite version number of UNIXEm - */ - -#define UNIXEM_VER_MAJOR 1 -#define UNIXEM_VER_MINOR 6 -#define UNIXEM_VER_REVISION 1 - -#ifndef UNIXEM_DOCUMENTATION_SKIP_SECTION -# define UNIXEM_VER_1_0_1 0x01000100 -# define UNIXEM_VER_1_1_1 0x01010100 -# define UNIXEM_VER_1_2_1 0x01020100 -# define UNIXEM_VER_1_3_1 0x01030100 -# define UNIXEM_VER_1_4_1 0x01040100 -# define UNIXEM_VER_1_5_1 0x01050100 -# define UNIXEM_VER_1_5_2 0x01050200 -# define UNIXEM_VER_1_5_3 0x01050300 -# define UNIXEM_VER_1_6_1 0x01060100 - -# define UNIXEM_VER UNIXEM_VER_1_6_1 -#else /* ? UNIXEM_DOCUMENTATION_SKIP_SECTION */ -# define UNIXEM_VER 0x01060100 -#endif /* !UNIXEM_DOCUMENTATION_SKIP_SECTION */ - -/* ////////////////////////////////////////////////////////////////////////// */ - -#endif /* UNIXEM_INCL_UNIXEM_H_UNIXEM */ - -/* ////////////////////////////////////////////////////////////////////////// */ diff --git a/Utilities/CAI/cai_dll/inc/jchuff.h b/Utilities/CAI/cai_dll/inc/jchuff.h deleted file mode 100755 index fa4643a4e7..0000000000 --- a/Utilities/CAI/cai_dll/inc/jchuff.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * jchuff.h - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains declarations for Huffman entropy encoding routines - * that are shared between the sequential encoder (jchuff.c) and the - * progressive encoder (jcphuff.c). No other modules need to see these. - */ - -/* Derived data constructed for each Huffman table */ - -typedef struct { - unsigned int ehufco[256]; /* code for each symbol */ - char ehufsi[256]; /* length of code for each symbol */ - /* If no code has been allocated for a symbol S, ehufsi[S] contains 0 */ -} c_derived_tbl; - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_make_c_derived_tbl jMkCDerived -#define jpeg_gen_optimal_table jGenOptTbl -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - -/* Expand a Huffman table definition into the derived format */ -EXTERN(void) jpeg_make_c_derived_tbl - JPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, c_derived_tbl ** pdtbl)); - -/* Generate an optimal table definition given the specified counts */ -EXTERN(void) jpeg_gen_optimal_table - JPP((j_compress_ptr cinfo, JHUFF_TBL * htbl, long freq[])); diff --git a/Utilities/CAI/cai_dll/inc/jconfig.h b/Utilities/CAI/cai_dll/inc/jconfig.h deleted file mode 100755 index 1673c5d99c..0000000000 --- a/Utilities/CAI/cai_dll/inc/jconfig.h +++ /dev/null @@ -1,50 +0,0 @@ -/* jconfig.vc --- jconfig.h for Microsoft Visual C++ on Windows 95 or NT. */ -/* see jconfig.doc for explanations */ - -#ifndef _JCONFIG_H_ -#define _JCONFIG_H_ - -#define HAVE_PROTOTYPES -#define HAVE_UNSIGNED_CHAR -#define HAVE_UNSIGNED_SHORT -/* #define void char */ -/* #define const */ -#undef CHAR_IS_UNSIGNED -#define HAVE_STDDEF_H -#define HAVE_STDLIB_H -#undef NEED_BSD_STRINGS -#undef NEED_SYS_TYPES_H -#undef NEED_FAR_POINTERS /* we presume a 32-bit flat memory model */ -#undef NEED_SHORT_EXTERNAL_NAMES -#undef INCOMPLETE_TYPES_BROKEN - -/* Define "boolean" as unsigned char, not int, per Windows custom */ -#ifndef __RPCNDR_H__ /* don't conflict if rpcndr.h already read */ -typedef unsigned char boolean; -#endif -#define HAVE_BOOLEAN /* prevent jmorecfg.h from redefining it */ - - -#ifdef JPEG_INTERNALS - -#undef RIGHT_SHIFT_IS_UNSIGNED - -#endif /* JPEG_INTERNALS */ - -#ifdef JPEG_CJPEG_DJPEG - -#define BMP_SUPPORTED /* BMP image file format */ -#define GIF_SUPPORTED /* GIF image file format */ -#define PPM_SUPPORTED /* PBMPLUS PPM/PGM image file format */ -#undef RLE_SUPPORTED /* Utah RLE image file format */ -#define TARGA_SUPPORTED /* Targa image file format */ - -#define TWO_FILE_COMMANDLINE /* optional */ -#define USE_SETMODE /* Microsoft has setmode() */ -#undef NEED_SIGNAL_CATCHER -#undef DONT_USE_B_MODE -#undef PROGRESS_REPORT /* optional */ - -#endif /* JPEG_CJPEG_DJPEG */ - -#endif diff --git a/Utilities/CAI/cai_dll/inc/jdct.h b/Utilities/CAI/cai_dll/inc/jdct.h deleted file mode 100755 index 04192a266a..0000000000 --- a/Utilities/CAI/cai_dll/inc/jdct.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - * jdct.h - * - * Copyright (C) 1994-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This include file contains common declarations for the forward and - * inverse DCT modules. These declarations are private to the DCT managers - * (jcdctmgr.c, jddctmgr.c) and the individual DCT algorithms. - * The individual DCT algorithms are kept in separate files to ease - * machine-dependent tuning (e.g., assembly coding). - */ - - -/* - * A forward DCT routine is given a pointer to a work area of type DCTELEM[]; - * the DCT is to be performed in-place in that buffer. Type DCTELEM is int - * for 8-bit samples, INT32 for 12-bit samples. (NOTE: Floating-point DCT - * implementations use an array of type FAST_FLOAT, instead.) - * The DCT inputs are expected to be signed (range +-CENTERJSAMPLE). - * The DCT outputs are returned scaled up by a factor of 8; they therefore - * have a range of +-8K for 8-bit data, +-128K for 12-bit data. This - * convention improves accuracy in integer implementations and saves some - * work in floating-point ones. - * Quantization of the output coefficients is done by jcdctmgr.c. - */ - -#if BITS_IN_JSAMPLE == 8 -typedef int DCTELEM; /* 16 or 32 bits is fine */ -#else -typedef INT32 DCTELEM; /* must have 32 bits */ -#endif - -typedef JMETHOD(void, forward_DCT_method_ptr, (DCTELEM * data)); -typedef JMETHOD(void, float_DCT_method_ptr, (FAST_FLOAT * data)); - - -/* - * An inverse DCT routine is given a pointer to the input JBLOCK and a pointer - * to an output sample array. The routine must dequantize the input data as - * well as perform the IDCT; for dequantization, it uses the multiplier table - * pointed to by compptr->dct_table. The output data is to be placed into the - * sample array starting at a specified column. (Any row offset needed will - * be applied to the array pointer before it is passed to the IDCT code.) - * Note that the number of samples emitted by the IDCT routine is - * DCT_scaled_size * DCT_scaled_size. - */ - -/* typedef inverse_DCT_method_ptr is declared in jpegint.h */ - -/* - * Each IDCT routine has its own ideas about the best dct_table element type. - */ - -typedef MULTIPLIER ISLOW_MULT_TYPE; /* short or int, whichever is faster */ -#if BITS_IN_JSAMPLE == 8 -typedef MULTIPLIER IFAST_MULT_TYPE; /* 16 bits is OK, use short if faster */ -#define IFAST_SCALE_BITS 2 /* fractional bits in scale factors */ -#else -typedef INT32 IFAST_MULT_TYPE; /* need 32 bits for scaled quantizers */ -#define IFAST_SCALE_BITS 13 /* fractional bits in scale factors */ -#endif -typedef FAST_FLOAT FLOAT_MULT_TYPE; /* preferred floating type */ - - -/* - * Each IDCT routine is responsible for range-limiting its results and - * converting them to unsigned form (0..MAXJSAMPLE). The raw outputs could - * be quite far out of range if the input data is corrupt, so a bulletproof - * range-limiting step is required. We use a mask-and-table-lookup method - * to do the combined operations quickly. See the comments with - * prepare_range_limit_table (in jdmaster.c) for more info. - */ - -#define IDCT_range_limit(cinfo) ((cinfo)->sample_range_limit + CENTERJSAMPLE) - -#define RANGE_MASK (MAXJSAMPLE * 4 + 3) /* 2 bits wider than legal samples */ - - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_fdct_islow jFDislow -#define jpeg_fdct_ifast jFDifast -#define jpeg_fdct_float jFDfloat -#define jpeg_idct_islow jRDislow -#define jpeg_idct_ifast jRDifast -#define jpeg_idct_float jRDfloat -#define jpeg_idct_4x4 jRD4x4 -#define jpeg_idct_2x2 jRD2x2 -#define jpeg_idct_1x1 jRD1x1 -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - -/* Extern declarations for the forward and inverse DCT routines. */ - -EXTERN(void) jpeg_fdct_islow JPP((DCTELEM * data)); -EXTERN(void) jpeg_fdct_ifast JPP((DCTELEM * data)); -EXTERN(void) jpeg_fdct_float JPP((FAST_FLOAT * data)); - -EXTERN(void) jpeg_idct_islow - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_ifast - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_float - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_4x4 - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_2x2 - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); -EXTERN(void) jpeg_idct_1x1 - JPP((j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, JSAMPARRAY output_buf, JDIMENSION output_col)); - - -/* - * Macros for handling fixed-point arithmetic; these are used by many - * but not all of the DCT/IDCT modules. - * - * All values are expected to be of type INT32. - * Fractional constants are scaled left by CONST_BITS bits. - * CONST_BITS is defined within each module using these macros, - * and may differ from one module to the next. - */ - -#define ONE ((INT32) 1) -#define CONST_SCALE (ONE << CONST_BITS) - -/* Convert a positive real constant to an integer scaled by CONST_SCALE. - * Caution: some C compilers fail to reduce "FIX(constant)" at compile time, - * thus causing a lot of useless floating-point operations at run time. - */ - -#define FIX(x) ((INT32) ((x) * CONST_SCALE + 0.5)) - -/* Descale and correctly round an INT32 value that's scaled by N bits. - * We assume RIGHT_SHIFT rounds towards minus infinity, so adding - * the fudge factor is correct for either sign of X. - */ - -#define DESCALE(x,n) RIGHT_SHIFT((x) + (ONE << ((n)-1)), n) - -/* Multiply an INT32 variable by an INT32 constant to yield an INT32 result. - * This macro is used only when the two inputs will actually be no more than - * 16 bits wide, so that a 16x16->32 bit multiply can be used instead of a - * full 32x32 multiply. This provides a useful speedup on many machines. - * Unfortunately there is no way to specify a 16x16->32 multiply portably - * in C, but some C compilers will do the right thing if you provide the - * correct combination of casts. - */ - -#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ -#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT16) (const))) -#endif -#ifdef SHORTxLCONST_32 /* known to work with Microsoft C 6.0 */ -#define MULTIPLY16C16(var,const) (((INT16) (var)) * ((INT32) (const))) -#endif - -#ifndef MULTIPLY16C16 /* default definition */ -#define MULTIPLY16C16(var,const) ((var) * (const)) -#endif - -/* Same except both inputs are variables. */ - -#ifdef SHORTxSHORT_32 /* may work if 'int' is 32 bits */ -#define MULTIPLY16V16(var1,var2) (((INT16) (var1)) * ((INT16) (var2))) -#endif - -#ifndef MULTIPLY16V16 /* default definition */ -#define MULTIPLY16V16(var1,var2) ((var1) * (var2)) -#endif diff --git a/Utilities/CAI/cai_dll/inc/jdhuff.h b/Utilities/CAI/cai_dll/inc/jdhuff.h deleted file mode 100755 index bcc3ab1271..0000000000 --- a/Utilities/CAI/cai_dll/inc/jdhuff.h +++ /dev/null @@ -1,202 +0,0 @@ -/* - * jdhuff.h - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains declarations for Huffman entropy decoding routines - * that are shared between the sequential decoder (jdhuff.c) and the - * progressive decoder (jdphuff.c). No other modules need to see these. - */ - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_make_d_derived_tbl jMkDDerived -#define jpeg_fill_bit_buffer jFilBitBuf -#define jpeg_huff_decode jHufDecode -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Derived data constructed for each Huffman table */ - -#define HUFF_LOOKAHEAD 8 /* # of bits of lookahead */ - -typedef struct { - /* Basic tables: (element [0] of each array is unused) */ - INT32 mincode[17]; /* smallest code of length k */ - INT32 maxcode[18]; /* largest code of length k (-1 if none) */ - /* (maxcode[17] is a sentinel to ensure jpeg_huff_decode terminates) */ - int valptr[17]; /* huffval[] index of 1st symbol of length k */ - - /* Link to public Huffman table (needed only in jpeg_huff_decode) */ - JHUFF_TBL *pub; - - /* Lookahead tables: indexed by the next HUFF_LOOKAHEAD bits of - * the input data stream. If the next Huffman code is no more - * than HUFF_LOOKAHEAD bits long, we can obtain its length and - * the corresponding symbol directly from these tables. - */ - int look_nbits[1<<HUFF_LOOKAHEAD]; /* # bits, or 0 if too long */ - UINT8 look_sym[1<<HUFF_LOOKAHEAD]; /* symbol, or unused */ -} d_derived_tbl; - -/* Expand a Huffman table definition into the derived format */ -EXTERN(void) jpeg_make_d_derived_tbl JPP((j_decompress_ptr cinfo, - JHUFF_TBL * htbl, d_derived_tbl ** pdtbl)); - - -/* - * Fetching the next N bits from the input stream is a time-critical operation - * for the Huffman decoders. We implement it with a combination of inline - * macros and out-of-line subroutines. Note that N (the number of bits - * demanded at one time) never exceeds 15 for JPEG use. - * - * We read source bytes into get_buffer and dole out bits as needed. - * If get_buffer already contains enough bits, they are fetched in-line - * by the macros CHECK_BIT_BUFFER and GET_BITS. When there aren't enough - * bits, jpeg_fill_bit_buffer is called; it will attempt to fill get_buffer - * as full as possible (not just to the number of bits needed; this - * prefetching reduces the overhead cost of calling jpeg_fill_bit_buffer). - * Note that jpeg_fill_bit_buffer may return FALSE to indicate suspension. - * On TRUE return, jpeg_fill_bit_buffer guarantees that get_buffer contains - * at least the requested number of bits --- dummy zeroes are inserted if - * necessary. - */ - -typedef INT32 bit_buf_type; /* type of bit-extraction buffer */ -#define BIT_BUF_SIZE 32 /* size of buffer in bits */ - -/* If long is > 32 bits on your machine, and shifting/masking longs is - * reasonably fast, making bit_buf_type be long and setting BIT_BUF_SIZE - * appropriately should be a win. Unfortunately we can't do this with - * something like #define BIT_BUF_SIZE (sizeof(bit_buf_type)*8) - * because not all machines measure sizeof in 8-bit bytes. - */ - -typedef struct { /* Bitreading state saved across MCUs */ - bit_buf_type get_buffer; /* current bit-extraction buffer */ - int bits_left; /* # of unused bits in it */ - boolean printed_eod; /* flag to suppress multiple warning msgs */ -} bitread_perm_state; - -typedef struct { /* Bitreading working state within an MCU */ - /* current data source state */ - const JOCTET * next_input_byte; /* => next byte to read from source */ - size_t bytes_in_buffer; /* # of bytes remaining in source buffer */ - int unread_marker; /* nonzero if we have hit a marker */ - /* bit input buffer --- note these values are kept in register variables, - * not in this struct, inside the inner loops. - */ - bit_buf_type get_buffer; /* current bit-extraction buffer */ - int bits_left; /* # of unused bits in it */ - /* pointers needed by jpeg_fill_bit_buffer */ - j_decompress_ptr cinfo; /* back link to decompress master record */ - boolean * printed_eod_ptr; /* => flag in permanent state */ -} bitread_working_state; - -/* Macros to declare and load/save bitread local variables. */ -#define BITREAD_STATE_VARS \ - register bit_buf_type get_buffer; \ - register int bits_left; \ - bitread_working_state br_state - -#define BITREAD_LOAD_STATE(cinfop,permstate) \ - br_state.cinfo = cinfop; \ - br_state.next_input_byte = cinfop->src->next_input_byte; \ - br_state.bytes_in_buffer = cinfop->src->bytes_in_buffer; \ - br_state.unread_marker = cinfop->unread_marker; \ - get_buffer = permstate.get_buffer; \ - bits_left = permstate.bits_left; \ - br_state.printed_eod_ptr = & permstate.printed_eod - -#define BITREAD_SAVE_STATE(cinfop,permstate) \ - cinfop->src->next_input_byte = br_state.next_input_byte; \ - cinfop->src->bytes_in_buffer = br_state.bytes_in_buffer; \ - cinfop->unread_marker = br_state.unread_marker; \ - permstate.get_buffer = get_buffer; \ - permstate.bits_left = bits_left - -/* - * These macros provide the in-line portion of bit fetching. - * Use CHECK_BIT_BUFFER to ensure there are N bits in get_buffer - * before using GET_BITS, PEEK_BITS, or DROP_BITS. - * The variables get_buffer and bits_left are assumed to be locals, - * but the state struct might not be (jpeg_huff_decode needs this). - * CHECK_BIT_BUFFER(state,n,action); - * Ensure there are N bits in get_buffer; if suspend, take action. - * val = GET_BITS(n); - * Fetch next N bits. - * val = PEEK_BITS(n); - * Fetch next N bits without removing them from the buffer. - * DROP_BITS(n); - * Discard next N bits. - * The value N should be a simple variable, not an expression, because it - * is evaluated multiple times. - */ - -#define CHECK_BIT_BUFFER(state,nbits,action) \ - { if (bits_left < (nbits)) { \ - if (! jpeg_fill_bit_buffer(&(state),get_buffer,bits_left,nbits)) \ - { action; } \ - get_buffer = (state).get_buffer; bits_left = (state).bits_left; } } - -#define GET_BITS(nbits) \ - (((int) (get_buffer >> (bits_left -= (nbits)))) & ((1<<(nbits))-1)) - -#define PEEK_BITS(nbits) \ - (((int) (get_buffer >> (bits_left - (nbits)))) & ((1<<(nbits))-1)) - -#define DROP_BITS(nbits) \ - (bits_left -= (nbits)) - -/* Load up the bit buffer to a depth of at least nbits */ -EXTERN(boolean) jpeg_fill_bit_buffer - JPP((bitread_working_state * state, register bit_buf_type get_buffer, - register int bits_left, int nbits)); - - -/* - * Code for extracting next Huffman-coded symbol from input bit stream. - * Again, this is time-critical and we make the main paths be macros. - * - * We use a lookahead table to process codes of up to HUFF_LOOKAHEAD bits - * without looping. Usually, more than 95% of the Huffman codes will be 8 - * or fewer bits long. The few overlength codes are handled with a loop, - * which need not be inline code. - * - * Notes about the HUFF_DECODE macro: - * 1. Near the end of the data segment, we may fail to get enough bits - * for a lookahead. In that case, we do it the hard way. - * 2. If the lookahead table contains no entry, the next code must be - * more than HUFF_LOOKAHEAD bits long. - * 3. jpeg_huff_decode returns -1 if forced to suspend. - */ - -#define HUFF_DECODE(result,state,htbl,failaction,slowlabel) \ -{ register int nb, look; \ - if (bits_left < HUFF_LOOKAHEAD) { \ - if (! jpeg_fill_bit_buffer(&state,get_buffer,bits_left, 0)) {failaction;} \ - get_buffer = state.get_buffer; bits_left = state.bits_left; \ - if (bits_left < HUFF_LOOKAHEAD) { \ - nb = 1; goto slowlabel; \ - } \ - } \ - look = PEEK_BITS(HUFF_LOOKAHEAD); \ - if ((nb = htbl->look_nbits[look]) != 0) { \ - DROP_BITS(nb); \ - result = htbl->look_sym[look]; \ - } else { \ - nb = HUFF_LOOKAHEAD+1; \ -slowlabel: \ - if ((result=jpeg_huff_decode(&state,get_buffer,bits_left,htbl,nb)) < 0) \ - { failaction; } \ - get_buffer = state.get_buffer; bits_left = state.bits_left; \ - } \ -} - -/* Out-of-line case for Huffman code fetching */ -EXTERN(int) jpeg_huff_decode - JPP((bitread_working_state * state, register bit_buf_type get_buffer, - register int bits_left, d_derived_tbl * htbl, int min_bits)); diff --git a/Utilities/CAI/cai_dll/inc/jerror.h b/Utilities/CAI/cai_dll/inc/jerror.h deleted file mode 100755 index fc2fffeac2..0000000000 --- a/Utilities/CAI/cai_dll/inc/jerror.h +++ /dev/null @@ -1,291 +0,0 @@ -/* - * jerror.h - * - * Copyright (C) 1994-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the error and message codes for the JPEG library. - * Edit this file to add new codes, or to translate the message strings to - * some other language. - * A set of error-reporting macros are defined too. Some applications using - * the JPEG library may wish to include this file to get the error codes - * and/or the macros. - */ - -/* - * To define the enum list of message codes, include this file without - * defining macro JMESSAGE. To create a message string table, include it - * again with a suitable JMESSAGE definition (see jerror.c for an example). - */ -#ifndef JMESSAGE -#ifndef JERROR_H -/* First time through, define the enum list */ -#define JMAKE_ENUM_LIST -#else -/* Repeated inclusions of this file are no-ops unless JMESSAGE is defined */ -#define JMESSAGE(code,string) -#endif /* JERROR_H */ -#endif /* JMESSAGE */ - -#ifdef JMAKE_ENUM_LIST - -typedef enum { - -#define JMESSAGE(code,string) code , - -#endif /* JMAKE_ENUM_LIST */ - -JMESSAGE(JMSG_NOMESSAGE, "Bogus message code %d") /* Must be first entry! */ - -/* For maintenance convenience, list is alphabetical by message code name */ -JMESSAGE(JERR_ARITH_NOTIMPL, - "Sorry, there are legal restrictions on arithmetic coding") -JMESSAGE(JERR_BAD_ALIGN_TYPE, "ALIGN_TYPE is wrong, please fix") -JMESSAGE(JERR_BAD_ALLOC_CHUNK, "MAX_ALLOC_CHUNK is wrong, please fix") -JMESSAGE(JERR_BAD_BUFFER_MODE, "Bogus buffer control mode") -JMESSAGE(JERR_BAD_COMPONENT_ID, "Invalid component ID %d in SOS") -JMESSAGE(JERR_BAD_DCT_COEF, "DCT coefficient out of range") -JMESSAGE(JERR_BAD_DCTSIZE, "IDCT output block size %d not supported") -JMESSAGE(JERR_BAD_HUFF_TABLE, "Bogus Huffman table definition") -JMESSAGE(JERR_BAD_IN_COLORSPACE, "Bogus input colorspace") -JMESSAGE(JERR_BAD_J_COLORSPACE, "Bogus JPEG colorspace") -JMESSAGE(JERR_BAD_LENGTH, "Bogus marker length") -JMESSAGE(JERR_BAD_LIB_VERSION, - "Wrong JPEG library version: library is %d, caller expects %d") -JMESSAGE(JERR_BAD_MCU_SIZE, "Sampling factors too large for interleaved scan") -JMESSAGE(JERR_BAD_POOL_ID, "Invalid memory pool code %d") -JMESSAGE(JERR_BAD_PRECISION, "Unsupported JPEG data precision %d") -JMESSAGE(JERR_BAD_PROGRESSION, - "Invalid progressive parameters Ss=%d Se=%d Ah=%d Al=%d") -JMESSAGE(JERR_BAD_PROG_SCRIPT, - "Invalid progressive parameters at scan script entry %d") -JMESSAGE(JERR_BAD_SAMPLING, "Bogus sampling factors") -JMESSAGE(JERR_BAD_SCAN_SCRIPT, "Invalid scan script at entry %d") -JMESSAGE(JERR_BAD_STATE, "Improper call to JPEG library in state %d") -JMESSAGE(JERR_BAD_STRUCT_SIZE, - "JPEG parameter struct mismatch: library thinks size is %u, caller expects %u") -JMESSAGE(JERR_BAD_VIRTUAL_ACCESS, "Bogus virtual array access") -JMESSAGE(JERR_BUFFER_SIZE, "Buffer passed to JPEG library is too small") -JMESSAGE(JERR_CANT_SUSPEND, "Suspension not allowed here") -JMESSAGE(JERR_CCIR601_NOTIMPL, "CCIR601 sampling not implemented yet") -JMESSAGE(JERR_COMPONENT_COUNT, "Too many color components: %d, max %d") -JMESSAGE(JERR_CONVERSION_NOTIMPL, "Unsupported color conversion request") -JMESSAGE(JERR_DAC_INDEX, "Bogus DAC index %d") -JMESSAGE(JERR_DAC_VALUE, "Bogus DAC value 0x%x") -JMESSAGE(JERR_DHT_INDEX, "Bogus DHT index %d") -JMESSAGE(JERR_DQT_INDEX, "Bogus DQT index %d") -JMESSAGE(JERR_EMPTY_IMAGE, "Empty JPEG image (DNL not supported)") -JMESSAGE(JERR_EMS_READ, "Read from EMS failed") -JMESSAGE(JERR_EMS_WRITE, "Write to EMS failed") -JMESSAGE(JERR_EOI_EXPECTED, "Didn't expect more than one scan") -JMESSAGE(JERR_FILE_READ, "Input file read error") -JMESSAGE(JERR_FILE_WRITE, "Output file write error --- out of disk space?") -JMESSAGE(JERR_FRACT_SAMPLE_NOTIMPL, "Fractional sampling not implemented yet") -JMESSAGE(JERR_HUFF_CLEN_OVERFLOW, "Huffman code size table overflow") -JMESSAGE(JERR_HUFF_MISSING_CODE, "Missing Huffman code table entry") -JMESSAGE(JERR_IMAGE_TOO_BIG, "Maximum supported image dimension is %u pixels") -JMESSAGE(JERR_INPUT_EMPTY, "Empty input file") -JMESSAGE(JERR_INPUT_EOF, "Premature end of input file") -JMESSAGE(JERR_MISMATCHED_QUANT_TABLE, - "Cannot transcode due to multiple use of quantization table %d") -JMESSAGE(JERR_MISSING_DATA, "Scan script does not transmit all data") -JMESSAGE(JERR_MODE_CHANGE, "Invalid color quantization mode change") -JMESSAGE(JERR_NOTIMPL, "Not implemented yet") -JMESSAGE(JERR_NOT_COMPILED, "Requested feature was omitted at compile time") -JMESSAGE(JERR_NO_BACKING_STORE, "Backing store not supported") -JMESSAGE(JERR_NO_HUFF_TABLE, "Huffman table 0x%02x was not defined") -JMESSAGE(JERR_NO_IMAGE, "JPEG datastream contains no image") -JMESSAGE(JERR_NO_QUANT_TABLE, "Quantization table 0x%02x was not defined") -JMESSAGE(JERR_NO_SOI, "Not a JPEG file: starts with 0x%02x 0x%02x") -JMESSAGE(JERR_OUT_OF_MEMORY, "Insufficient memory (case %d)") -JMESSAGE(JERR_QUANT_COMPONENTS, - "Cannot quantize more than %d color components") -JMESSAGE(JERR_QUANT_FEW_COLORS, "Cannot quantize to fewer than %d colors") -JMESSAGE(JERR_QUANT_MANY_COLORS, "Cannot quantize to more than %d colors") -JMESSAGE(JERR_SOF_DUPLICATE, "Invalid JPEG file structure: two SOF markers") -JMESSAGE(JERR_SOF_NO_SOS, "Invalid JPEG file structure: missing SOS marker") -JMESSAGE(JERR_SOF_UNSUPPORTED, "Unsupported JPEG process: SOF type 0x%02x") -JMESSAGE(JERR_SOI_DUPLICATE, "Invalid JPEG file structure: two SOI markers") -JMESSAGE(JERR_SOS_NO_SOF, "Invalid JPEG file structure: SOS before SOF") -JMESSAGE(JERR_TFILE_CREATE, "Failed to create temporary file %s") -JMESSAGE(JERR_TFILE_READ, "Read failed on temporary file") -JMESSAGE(JERR_TFILE_SEEK, "Seek failed on temporary file") -JMESSAGE(JERR_TFILE_WRITE, - "Write failed on temporary file --- out of disk space?") -JMESSAGE(JERR_TOO_LITTLE_DATA, "Application transferred too few scanlines") -JMESSAGE(JERR_UNKNOWN_MARKER, "Unsupported marker type 0x%02x") -JMESSAGE(JERR_VIRTUAL_BUG, "Virtual array controller messed up") -JMESSAGE(JERR_WIDTH_OVERFLOW, "Image too wide for this implementation") -JMESSAGE(JERR_XMS_READ, "Read from XMS failed") -JMESSAGE(JERR_XMS_WRITE, "Write to XMS failed") -JMESSAGE(JMSG_COPYRIGHT, JCOPYRIGHT) -JMESSAGE(JMSG_VERSION, JVERSION) -JMESSAGE(JTRC_16BIT_TABLES, - "Caution: quantization tables are too coarse for baseline JPEG") -JMESSAGE(JTRC_ADOBE, - "Adobe APP14 marker: version %d, flags 0x%04x 0x%04x, transform %d") -JMESSAGE(JTRC_APP0, "Unknown APP0 marker (not JFIF), length %u") -JMESSAGE(JTRC_APP14, "Unknown APP14 marker (not Adobe), length %u") -JMESSAGE(JTRC_DAC, "Define Arithmetic Table 0x%02x: 0x%02x") -JMESSAGE(JTRC_DHT, "Define Huffman Table 0x%02x") -JMESSAGE(JTRC_DQT, "Define Quantization Table %d precision %d") -JMESSAGE(JTRC_DRI, "Define Restart Interval %u") -JMESSAGE(JTRC_EMS_CLOSE, "Freed EMS handle %u") -JMESSAGE(JTRC_EMS_OPEN, "Obtained EMS handle %u") -JMESSAGE(JTRC_EOI, "End Of Image") -JMESSAGE(JTRC_HUFFBITS, " %3d %3d %3d %3d %3d %3d %3d %3d") -JMESSAGE(JTRC_JFIF, "JFIF APP0 marker: version %d.%02d, density %dx%d %d") -JMESSAGE(JTRC_JFIF_BADTHUMBNAILSIZE, - "Warning: thumbnail image size does not match data length %u") -JMESSAGE(JTRC_JFIF_EXTENSION, - "JFIF extension marker: type 0x%02x, length %u") -JMESSAGE(JTRC_JFIF_THUMBNAIL, " with %d x %d thumbnail image") -JMESSAGE(JTRC_MISC_MARKER, "Miscellaneous marker 0x%02x, length %u") -JMESSAGE(JTRC_PARMLESS_MARKER, "Unexpected marker 0x%02x") -JMESSAGE(JTRC_QUANTVALS, " %4u %4u %4u %4u %4u %4u %4u %4u") -JMESSAGE(JTRC_QUANT_3_NCOLORS, "Quantizing to %d = %d*%d*%d colors") -JMESSAGE(JTRC_QUANT_NCOLORS, "Quantizing to %d colors") -JMESSAGE(JTRC_QUANT_SELECTED, "Selected %d colors for quantization") -JMESSAGE(JTRC_RECOVERY_ACTION, "At marker 0x%02x, recovery action %d") -JMESSAGE(JTRC_RST, "RST%d") -JMESSAGE(JTRC_SMOOTH_NOTIMPL, - "Smoothing not supported with nonstandard sampling ratios") -JMESSAGE(JTRC_SOF, "Start Of Frame 0x%02x: width=%u, height=%u, components=%d") -JMESSAGE(JTRC_SOF_COMPONENT, " Component %d: %dhx%dv q=%d") -JMESSAGE(JTRC_SOI, "Start of Image") -JMESSAGE(JTRC_SOS, "Start Of Scan: %d components") -JMESSAGE(JTRC_SOS_COMPONENT, " Component %d: dc=%d ac=%d") -JMESSAGE(JTRC_SOS_PARAMS, " Ss=%d, Se=%d, Ah=%d, Al=%d") -JMESSAGE(JTRC_TFILE_CLOSE, "Closed temporary file %s") -JMESSAGE(JTRC_TFILE_OPEN, "Opened temporary file %s") -JMESSAGE(JTRC_THUMB_JPEG, - "JFIF extension marker: JPEG-compressed thumbnail image, length %u") -JMESSAGE(JTRC_THUMB_PALETTE, - "JFIF extension marker: palette thumbnail image, length %u") -JMESSAGE(JTRC_THUMB_RGB, - "JFIF extension marker: RGB thumbnail image, length %u") -JMESSAGE(JTRC_UNKNOWN_IDS, - "Unrecognized component IDs %d %d %d, assuming YCbCr") -JMESSAGE(JTRC_XMS_CLOSE, "Freed XMS handle %u") -JMESSAGE(JTRC_XMS_OPEN, "Obtained XMS handle %u") -JMESSAGE(JWRN_ADOBE_XFORM, "Unknown Adobe color transform code %d") -JMESSAGE(JWRN_BOGUS_PROGRESSION, - "Inconsistent progression sequence for component %d coefficient %d") -JMESSAGE(JWRN_EXTRANEOUS_DATA, - "Corrupt JPEG data: %u extraneous bytes before marker 0x%02x") -JMESSAGE(JWRN_HIT_MARKER, "Corrupt JPEG data: premature end of data segment") -JMESSAGE(JWRN_HUFF_BAD_CODE, "Corrupt JPEG data: bad Huffman code") -JMESSAGE(JWRN_JFIF_MAJOR, "Warning: unknown JFIF revision number %d.%02d") -JMESSAGE(JWRN_JPEG_EOF, "Premature end of JPEG file") -JMESSAGE(JWRN_MUST_RESYNC, - "Corrupt JPEG data: found marker 0x%02x instead of RST%d") -JMESSAGE(JWRN_NOT_SEQUENTIAL, "Invalid SOS parameters for sequential JPEG") -JMESSAGE(JWRN_TOO_MUCH_DATA, "Application transferred too many scanlines") - -#ifdef JMAKE_ENUM_LIST - - JMSG_LASTMSGCODE -} J_MESSAGE_CODE; - -#undef JMAKE_ENUM_LIST -#endif /* JMAKE_ENUM_LIST */ - -/* Zap JMESSAGE macro so that future re-inclusions do nothing by default */ -#undef JMESSAGE - - -#ifndef JERROR_H -#define JERROR_H - -/* Macros to simplify using the error and trace message stuff */ -/* The first parameter is either type of cinfo pointer */ - -/* Fatal errors (print message and exit) */ -#define ERREXIT(cinfo,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT1(cinfo,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT2(cinfo,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT3(cinfo,code,p1,p2,p3) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (cinfo)->err->msg_parm.i[2] = (p3), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXIT4(cinfo,code,p1,p2,p3,p4) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (cinfo)->err->msg_parm.i[2] = (p3), \ - (cinfo)->err->msg_parm.i[3] = (p4), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) -#define ERREXITS(cinfo,code,str) \ - ((cinfo)->err->msg_code = (code), \ - strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ - (*(cinfo)->err->error_exit) ((j_common_ptr) (cinfo))) - -#define MAKESTMT(stuff) do { stuff } while (0) - -/* Nonfatal errors (we can keep going, but the data is probably corrupt) */ -#define WARNMS(cinfo,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) -#define WARNMS1(cinfo,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) -#define WARNMS2(cinfo,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), -1)) - -/* Informational/debugging messages */ -#define TRACEMS(cinfo,lvl,code) \ - ((cinfo)->err->msg_code = (code), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS1(cinfo,lvl,code,p1) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS2(cinfo,lvl,code,p1,p2) \ - ((cinfo)->err->msg_code = (code), \ - (cinfo)->err->msg_parm.i[0] = (p1), \ - (cinfo)->err->msg_parm.i[1] = (p2), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) -#define TRACEMS3(cinfo,lvl,code,p1,p2,p3) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS4(cinfo,lvl,code,p1,p2,p3,p4) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS5(cinfo,lvl,code,p1,p2,p3,p4,p5) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - _mp[4] = (p5); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMS8(cinfo,lvl,code,p1,p2,p3,p4,p5,p6,p7,p8) \ - MAKESTMT(int * _mp = (cinfo)->err->msg_parm.i; \ - _mp[0] = (p1); _mp[1] = (p2); _mp[2] = (p3); _mp[3] = (p4); \ - _mp[4] = (p5); _mp[5] = (p6); _mp[6] = (p7); _mp[7] = (p8); \ - (cinfo)->err->msg_code = (code); \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl)); ) -#define TRACEMSS(cinfo,lvl,code,str) \ - ((cinfo)->err->msg_code = (code), \ - strncpy((cinfo)->err->msg_parm.s, (str), JMSG_STR_PARM_MAX), \ - (*(cinfo)->err->emit_message) ((j_common_ptr) (cinfo), (lvl))) - -#endif /* JERROR_H */ diff --git a/Utilities/CAI/cai_dll/inc/jinclude.h b/Utilities/CAI/cai_dll/inc/jinclude.h deleted file mode 100755 index 0a4f15146a..0000000000 --- a/Utilities/CAI/cai_dll/inc/jinclude.h +++ /dev/null @@ -1,91 +0,0 @@ -/* - * jinclude.h - * - * Copyright (C) 1991-1994, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file exists to provide a single place to fix any problems with - * including the wrong system include files. (Common problems are taken - * care of by the standard jconfig symbols, but on really weird systems - * you may have to edit this file.) - * - * NOTE: this file is NOT intended to be included by applications using the - * JPEG library. Most applications need only include jpeglib.h. - */ - - -/* Include auto-config file to find out which system include files we need. */ - -#include "jconfig.h" /* auto configuration options */ -#define JCONFIG_INCLUDED /* so that jpeglib.h doesn't do it again */ - -/* - * We need the NULL macro and size_t typedef. - * On an ANSI-conforming system it is sufficient to include <stddef.h>. - * Otherwise, we get them from <stdlib.h> or <stdio.h>; we may have to - * pull in <sys/types.h> as well. - * Note that the core JPEG library does not require <stdio.h>; - * only the default error handler and data source/destination modules do. - * But we must pull it in because of the references to FILE in jpeglib.h. - * You can remove those references if you want to compile without <stdio.h>. - */ - -#ifdef HAVE_STDDEF_H -#include <stddef.h> -#endif - -#ifdef HAVE_STDLIB_H -#include <stdlib.h> -#endif - -#ifdef NEED_SYS_TYPES_H -#include <sys/types.h> -#endif - -#include <stdio.h> - -/* - * We need memory copying and zeroing functions, plus strncpy(). - * ANSI and System V implementations declare these in <string.h>. - * BSD doesn't have the mem() functions, but it does have bcopy()/bzero(). - * Some systems may declare memset and memcpy in <memory.h>. - * - * NOTE: we assume the size parameters to these functions are of type size_t. - * Change the casts in these macros if not! - */ - -#ifdef NEED_BSD_STRINGS - -#include <strings.h> -#define MEMZERO(target,size) bzero((void *)(target), (size_t)(size)) -#define MEMCOPY(dest,src,size) bcopy((const void *)(src), (void *)(dest), (size_t)(size)) - -#else /* not BSD, assume ANSI/SysV string lib */ - -#include <string.h> -#define MEMZERO(target,size) memset((void *)(target), 0, (size_t)(size)) -#define MEMCOPY(dest,src,size) memcpy((void *)(dest), (const void *)(src), (size_t)(size)) - -#endif - -/* - * In ANSI C, and indeed any rational implementation, size_t is also the - * type returned by sizeof(). However, it seems there are some irrational - * implementations out there, in which sizeof() returns an int even though - * size_t is defined as long or unsigned long. To ensure consistent results - * we always use this SIZEOF() macro in place of using sizeof() directly. - */ - -#define SIZEOF(object) ((size_t) sizeof(object)) - -/* - * The modules that use fread() and fwrite() always invoke them through - * these macros. On some systems you may need to twiddle the argument casts. - * CAUTION: argument order is different from underlying functions! - */ - -#define JFREAD(file,buf,sizeofbuf) \ - ((size_t) fread((void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) -#define JFWRITE(file,buf,sizeofbuf) \ - ((size_t) fwrite((const void *) (buf), (size_t) 1, (size_t) (sizeofbuf), (file))) diff --git a/Utilities/CAI/cai_dll/inc/jmemsys.h b/Utilities/CAI/cai_dll/inc/jmemsys.h deleted file mode 100755 index 6d4c7f2ae4..0000000000 --- a/Utilities/CAI/cai_dll/inc/jmemsys.h +++ /dev/null @@ -1,183 +0,0 @@ -/* - * jmemsys.h - * - * Copyright (C) 1992-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This include file defines the interface between the system-independent - * and system-dependent portions of the JPEG memory manager. No other - * modules need include it. (The system-independent portion is jmemmgr.c; - * there are several different versions of the system-dependent portion.) - * - * This file works as-is for the system-dependent memory managers supplied - * in the IJG distribution. You may need to modify it if you write a - * custom memory manager. If system-dependent changes are needed in - * this file, the best method is to #ifdef them based on a configuration - * symbol supplied in jconfig.h, as we have done with USE_MSDOS_MEMMGR. - */ - - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_get_small jGetSmall -#define jpeg_free_small jFreeSmall -#define jpeg_get_large jGetLarge -#define jpeg_free_large jFreeLarge -#define jpeg_mem_available jMemAvail -#define jpeg_open_backing_store jOpenBackStore -#define jpeg_mem_init jMemInit -#define jpeg_mem_term jMemTerm -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* - * These two functions are used to allocate and release small chunks of - * memory. (Typically the total amount requested through jpeg_get_small is - * no more than 20K or so; this will be requested in chunks of a few K each.) - * Behavior should be the same as for the standard library functions malloc - * and free; in particular, jpeg_get_small must return NULL on failure. - * On most systems, these ARE malloc and free. jpeg_free_small is passed the - * size of the object being freed, just in case it's needed. - * On an 80x86 machine using small-data memory model, these manage near heap. - */ - -EXTERN(void *) jpeg_get_small JPP((j_common_ptr cinfo, size_t sizeofobject)); -EXTERN(void) jpeg_free_small JPP((j_common_ptr cinfo, void * object, - size_t sizeofobject)); - -/* - * These two functions are used to allocate and release large chunks of - * memory (up to the total free space designated by jpeg_mem_available). - * The interface is the same as above, except that on an 80x86 machine, - * far pointers are used. On most other machines these are identical to - * the jpeg_get/free_small routines; but we keep them separate anyway, - * in case a different allocation strategy is desirable for large chunks. - */ - -EXTERN(void FAR *) jpeg_get_large JPP((j_common_ptr cinfo, - size_t sizeofobject)); -EXTERN(void) jpeg_free_large JPP((j_common_ptr cinfo, void FAR * object, - size_t sizeofobject)); - -/* - * The macro MAX_ALLOC_CHUNK designates the maximum number of bytes that may - * be requested in a single call to jpeg_get_large (and jpeg_get_small for that - * matter, but that case should never come into play). This macro is needed - * to model the 64Kb-segment-size limit of far addressing on 80x86 machines. - * On those machines, we expect that jconfig.h will provide a proper value. - * On machines with 32-bit flat address spaces, any large constant may be used. - * - * NB: jmemmgr.c expects that MAX_ALLOC_CHUNK will be representable as type - * size_t and will be a multiple of sizeof(align_type). - */ - -#ifndef MAX_ALLOC_CHUNK /* may be overridden in jconfig.h */ -#define MAX_ALLOC_CHUNK 1000000000L -#endif - -/* - * This routine computes the total space still available for allocation by - * jpeg_get_large. If more space than this is needed, backing store will be - * used. NOTE: any memory already allocated must not be counted. - * - * There is a minimum space requirement, corresponding to the minimum - * feasible buffer sizes; jmemmgr.c will request that much space even if - * jpeg_mem_available returns zero. The maximum space needed, enough to hold - * all working storage in memory, is also passed in case it is useful. - * Finally, the total space already allocated is passed. If no better - * method is available, cinfo->mem->max_memory_to_use - already_allocated - * is often a suitable calculation. - * - * It is OK for jpeg_mem_available to underestimate the space available - * (that'll just lead to more backing-store access than is really necessary). - * However, an overestimate will lead to failure. Hence it's wise to subtract - * a slop factor from the true available space. 5% should be enough. - * - * On machines with lots of virtual memory, any large constant may be returned. - * Conversely, zero may be returned to always use the minimum amount of memory. - */ - -EXTERN(long) jpeg_mem_available JPP((j_common_ptr cinfo, - long min_bytes_needed, - long max_bytes_needed, - long already_allocated)); - - -/* - * This structure holds whatever state is needed to access a single - * backing-store object. The read/write/close method pointers are called - * by jmemmgr.c to manipulate the backing-store object; all other fields - * are private to the system-dependent backing store routines. - */ - -#define TEMP_NAME_LENGTH 64 /* max length of a temporary file's name */ - -#ifdef USE_MSDOS_MEMMGR /* DOS-specific junk */ - -typedef unsigned short XMSH; /* type of extended-memory handles */ -typedef unsigned short EMSH; /* type of expanded-memory handles */ - -typedef union { - short file_handle; /* DOS file handle if it's a temp file */ - XMSH xms_handle; /* handle if it's a chunk of XMS */ - EMSH ems_handle; /* handle if it's a chunk of EMS */ -} handle_union; - -#endif /* USE_MSDOS_MEMMGR */ - -typedef struct backing_store_struct * backing_store_ptr; - -typedef struct backing_store_struct { - /* Methods for reading/writing/closing this backing-store object */ - JMETHOD(void, read_backing_store, (j_common_ptr cinfo, - backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count)); - JMETHOD(void, write_backing_store, (j_common_ptr cinfo, - backing_store_ptr info, - void FAR * buffer_address, - long file_offset, long byte_count)); - JMETHOD(void, close_backing_store, (j_common_ptr cinfo, - backing_store_ptr info)); - - /* Private fields for system-dependent backing-store management */ -#ifdef USE_MSDOS_MEMMGR - /* For the MS-DOS manager (jmemdos.c), we need: */ - handle_union handle; /* reference to backing-store storage object */ - char temp_name[TEMP_NAME_LENGTH]; /* name if it's a file */ -#else - /* For a typical implementation with temp files, we need: */ - FILE * temp_file; /* stdio reference to temp file */ - char temp_name[TEMP_NAME_LENGTH]; /* name of temp file */ -#endif -} backing_store_info; - -/* - * Initial opening of a backing-store object. This must fill in the - * read/write/close pointers in the object. The read/write routines - * may take an error exit if the specified maximum file size is exceeded. - * (If jpeg_mem_available always returns a large value, this routine can - * just take an error exit.) - */ - -EXTERN(void) jpeg_open_backing_store JPP((j_common_ptr cinfo, - backing_store_ptr info, - long total_bytes_needed)); - - -/* - * These routines take care of any system-dependent initialization and - * cleanup required. jpeg_mem_init will be called before anything is - * allocated (and, therefore, nothing in cinfo is of use except the error - * manager pointer). It should return a suitable default value for - * max_memory_to_use; this may subsequently be overridden by the surrounding - * application. (Note that max_memory_to_use is only important if - * jpeg_mem_available chooses to consult it ... no one else will.) - * jpeg_mem_term may assume that all requested memory has been freed and that - * all opened backing-store objects have been closed. - */ - -EXTERN(long) jpeg_mem_init JPP((j_common_ptr cinfo)); -EXTERN(void) jpeg_mem_term JPP((j_common_ptr cinfo)); diff --git a/Utilities/CAI/cai_dll/inc/jmorecfg.h b/Utilities/CAI/cai_dll/inc/jmorecfg.h deleted file mode 100755 index dbd0f14147..0000000000 --- a/Utilities/CAI/cai_dll/inc/jmorecfg.h +++ /dev/null @@ -1,369 +0,0 @@ -/* - * jmorecfg.h - * - * Copyright (C) 1991-1997, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains additional configuration options that customize the - * JPEG software for special applications or support machine-dependent - * optimizations. Most users will not need to touch this file. - */ - -#ifndef _JMORECFG_H_ -#define _JMORECFG_H_ - -/* - * Define BITS_IN_JSAMPLE as either - * 8 for 8-bit sample values (the usual setting) - * 12 for 12-bit sample values - * Only 8 and 12 are legal data precisions for lossy JPEG according to the - * JPEG standard, and the IJG code does not support anything else! - * We do not support run-time selection of data precision, sorry. - */ - -#define BITS_IN_JSAMPLE 8 /* use 8 or 12 */ - - -/* - * Maximum number of components (color channels) allowed in JPEG image. - * To meet the letter of the JPEG spec, set this to 255. However, darn - * few applications need more than 4 channels (maybe 5 for CMYK + alpha - * mask). We recommend 10 as a reasonable compromise; use 4 if you are - * really short on memory. (Each allowed component costs a hundred or so - * bytes of storage, whether actually used in an image or not.) - */ - -#define MAX_COMPONENTS 10 /* maximum number of image components */ - - -/* - * Basic data types. - * You may need to change these if you have a machine with unusual data - * type sizes; for example, "char" not 8 bits, "short" not 16 bits, - * or "long" not 32 bits. We don't care whether "int" is 16 or 32 bits, - * but it had better be at least 16. - */ - -/* Representation of a single sample (pixel element value). - * We frequently allocate large arrays of these, so it's important to keep - * them small. But if you have memory to burn and access to char or short - * arrays is very slow on your hardware, you might want to change these. - */ - -#if BITS_IN_JSAMPLE == 8 -/* JSAMPLE should be the smallest type that will hold the values 0..255. - * You can use a signed char by having GETJSAMPLE mask it with 0xFF. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JSAMPLE; -#ifdef CHAR_IS_UNSIGNED -#define GETJSAMPLE(value) ((int) (value)) -#else -#define GETJSAMPLE(value) ((int) (value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - -#define MAXJSAMPLE 255 -#define CENTERJSAMPLE 128 - -#endif /* BITS_IN_JSAMPLE == 8 */ - - -#if BITS_IN_JSAMPLE == 12 -/* JSAMPLE should be the smallest type that will hold the values 0..4095. - * On nearly all machines "short" will do nicely. - */ - -typedef short JSAMPLE; -#define GETJSAMPLE(value) ((int) (value)) - -#define MAXJSAMPLE 4095 -#define CENTERJSAMPLE 2048 - -#endif /* BITS_IN_JSAMPLE == 12 */ - - -/* Representation of a DCT frequency coefficient. - * This should be a signed value of at least 16 bits; "short" is usually OK. - * Again, we allocate large arrays of these, but you can change to int - * if you have memory to burn and "short" is really slow. - */ - -typedef short JCOEF; - - -/* Compressed datastreams are represented as arrays of JOCTET. - * These must be EXACTLY 8 bits wide, at least once they are written to - * external storage. Note that when using the stdio data source/destination - * managers, this is also the data type passed to fread/fwrite. - */ - -#ifdef HAVE_UNSIGNED_CHAR - -typedef unsigned char JOCTET; -#define GETJOCTET(value) (value) - -#else /* not HAVE_UNSIGNED_CHAR */ - -typedef char JOCTET; -#ifdef CHAR_IS_UNSIGNED -#define GETJOCTET(value) (value) -#else -#define GETJOCTET(value) ((value) & 0xFF) -#endif /* CHAR_IS_UNSIGNED */ - -#endif /* HAVE_UNSIGNED_CHAR */ - - -/* These typedefs are used for various table entries and so forth. - * They must be at least as wide as specified; but making them too big - * won't cost a huge amount of memory, so we don't provide special - * extraction code like we did for JSAMPLE. (In other words, these - * typedefs live at a different point on the speed/space tradeoff curve.) - */ - -/* UINT8 must hold at least the values 0..255. */ - -#ifdef HAVE_UNSIGNED_CHAR -typedef unsigned char UINT8; -#else /* not HAVE_UNSIGNED_CHAR */ -#ifdef CHAR_IS_UNSIGNED -typedef char UINT8; -#else /* not CHAR_IS_UNSIGNED */ -typedef short UINT8; -#endif /* CHAR_IS_UNSIGNED */ -#endif /* HAVE_UNSIGNED_CHAR */ - -/* UINT16 must hold at least the values 0..65535. */ - -#ifdef HAVE_UNSIGNED_SHORT -typedef unsigned short UINT16; -#else /* not HAVE_UNSIGNED_SHORT */ -typedef unsigned int UINT16; -#endif /* HAVE_UNSIGNED_SHORT */ - -/* INT16 must hold at least the values -32768..32767. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT16 */ -typedef short INT16; -#endif - -/* INT32 must hold at least signed 32-bit values. */ - -#ifndef XMD_H /* X11/xmd.h correctly defines INT32 */ -typedef int INT32; -#endif - -/* Datatype used for image dimensions. The JPEG standard only supports - * images up to 64K*64K due to 16-bit fields in SOF markers. Therefore - * "unsigned int" is sufficient on all machines. However, if you need to - * handle larger images and you don't mind deviating from the spec, you - * can change this datatype. - */ - -typedef unsigned int JDIMENSION; - -#define JPEG_MAX_DIMENSION 65500L /* a tad under 64K to prevent overflows */ - - -/* These macros are used in all function definitions and extern declarations. - * You could modify them if you need to change function linkage conventions; - * in particular, you'll need to do that to make the library a Windows DLL. - * Another application is to make all functions global for use with debuggers - * or code profilers that require it. - */ - -/* a function called through method pointers: */ -#define METHODDEF(type) static type -/* a function used only in its module: */ -#define LOCAL(type) static type -/* a function referenced thru EXTERNs: */ -#define GLOBAL(type) type -/* a reference to a GLOBAL function: */ -#define EXTERN(type) extern type - - -/* This macro is used to declare a "method", that is, a function pointer. - * We want to supply prototype parameters if the compiler can cope. - * Note that the arglist parameter must be parenthesized! - * Again, you can customize this if you need special linkage keywords. - */ - -#ifdef HAVE_PROTOTYPES -#define JMETHOD(type,methodname,arglist) type (*methodname) arglist -#else -#define JMETHOD(type,methodname,arglist) type (*methodname) () -#endif - - -/* Here is the pseudo-keyword for declaring pointers that must be "far" - * on 80x86 machines. Most of the specialized coding for 80x86 is handled - * by just saying "FAR *" where such a pointer is needed. In a few places - * explicit coding is needed; see uses of the NEED_FAR_POINTERS symbol. - */ - -#ifndef FAR -#ifdef NEED_FAR_POINTERS -#define FAR far -#else -#define FAR -#endif -#endif - - -/* - * On a few systems, type boolean and/or its values FALSE, TRUE may appear - * in standard header files. Or you may have conflicts with application- - * specific header files that you want to include together with these files. - * Defining HAVE_BOOLEAN before including jpeglib.h should make it work. - */ - -#ifndef HAVE_BOOLEAN -typedef int boolean; -#endif -#ifndef FALSE /* in case these macros already exist */ -#define FALSE 0 /* values of boolean */ -#endif -#ifndef TRUE -#define TRUE 1 -#endif - - -/* - * The remaining options affect code selection within the JPEG library, - * but they don't need to be visible to most applications using the library. - * To minimize application namespace pollution, the symbols won't be - * defined unless JPEG_INTERNALS or JPEG_INTERNAL_OPTIONS has been defined. - */ - -#ifdef JPEG_INTERNALS -#define JPEG_INTERNAL_OPTIONS -#endif - -#ifdef JPEG_INTERNAL_OPTIONS - - -/* - * These defines indicate whether to include various optional functions. - * Undefining some of these symbols will produce a smaller but less capable - * library. Note that you can leave certain source files out of the - * compilation/linking process if you've #undef'd the corresponding symbols. - * (You may HAVE to do that if your compiler doesn't like null source files.) - */ - -/* Arithmetic coding is unsupported for legal reasons. Complaints to IBM. */ - -/* Capability options common to encoder and decoder: */ - -#define DCT_ISLOW_SUPPORTED /* slow but accurate integer algorithm */ -#define DCT_IFAST_SUPPORTED /* faster, less accurate integer method */ -#define DCT_FLOAT_SUPPORTED /* floating-point: accurate, fast on fast HW */ - -/* Encoder capability options: */ - -#undef C_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define C_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define C_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define ENTROPY_OPT_SUPPORTED /* Optimization of entropy coding parms? */ -/* Note: if you selected 12-bit data precision, it is dangerous to turn off - * ENTROPY_OPT_SUPPORTED. The standard Huffman tables are only good for 8-bit - * precision, so jchuff.c normally uses entropy optimization to compute - * usable tables for higher precision. If you don't want to do optimization, - * you'll have to supply different default Huffman tables. - * The exact same statements apply for progressive JPEG: the default tables - * don't work for progressive mode. (This may get fixed, however.) - */ -#define INPUT_SMOOTHING_SUPPORTED /* Input image smoothing option? */ - -/* Decoder capability options: */ - -#undef D_ARITH_CODING_SUPPORTED /* Arithmetic coding back end? */ -#define D_MULTISCAN_FILES_SUPPORTED /* Multiple-scan JPEG files? */ -#define D_PROGRESSIVE_SUPPORTED /* Progressive JPEG? (Requires MULTISCAN)*/ -#define SAVE_MARKERS_SUPPORTED /* jpeg_save_markers() needed? */ -#define BLOCK_SMOOTHING_SUPPORTED /* Block smoothing? (Progressive only) */ -#define IDCT_SCALING_SUPPORTED /* Output rescaling via IDCT? */ -#undef UPSAMPLE_SCALING_SUPPORTED /* Output rescaling at upsample stage? */ -#define UPSAMPLE_MERGING_SUPPORTED /* Fast path for sloppy upsampling? */ -#define QUANT_1PASS_SUPPORTED /* 1-pass color quantization? */ -#define QUANT_2PASS_SUPPORTED /* 2-pass color quantization? */ - -/* more capability options later, no doubt */ - - -/* - * Ordering of RGB data in scanlines passed to or from the application. - * If your application wants to deal with data in the order B,G,R, just - * change these macros. You can also deal with formats such as R,G,B,X - * (one extra byte per pixel) by changing RGB_PIXELSIZE. Note that changing - * the offsets will also change the order in which colormap data is organized. - * RESTRICTIONS: - * 1. The sample applications cjpeg,djpeg do NOT support modified RGB formats. - * 2. These macros only affect RGB<=>YCbCr color conversion, so they are not - * useful if you are using JPEG color spaces other than YCbCr or grayscale. - * 3. The color quantizer modules will not behave desirably if RGB_PIXELSIZE - * is not 3 (they don't understand about dummy color components!). So you - * can't use color quantization if you change that value. - */ - -#define RGB_RED 0 /* Offset of Red in an RGB scanline element */ -#define RGB_GREEN 1 /* Offset of Green */ -#define RGB_BLUE 2 /* Offset of Blue */ -#define RGB_PIXELSIZE 3 /* JSAMPLEs per RGB scanline element */ - - -/* Definitions for speed-related optimizations. */ - - -/* If your compiler supports inline functions, define INLINE - * as the inline keyword; otherwise define it as empty. - */ - -#ifndef INLINE -#ifdef __GNUC__ /* for instance, GNU C knows about inline */ -#define INLINE __inline__ -#endif -#ifndef INLINE -#define INLINE /* default is to define it as empty */ -#endif -#endif - - -/* On some machines (notably 68000 series) "int" is 32 bits, but multiplying - * two 16-bit shorts is faster than multiplying two ints. Define MULTIPLIER - * as short on such a machine. MULTIPLIER must be at least 16 bits wide. - */ - -#ifndef MULTIPLIER -#define MULTIPLIER int /* type for fastest integer multiply */ -#endif - - -/* FAST_FLOAT should be either float or double, whichever is done faster - * by your compiler. (Note that this type is only used in the floating point - * DCT routines, so it only matters if you've defined DCT_FLOAT_SUPPORTED.) - * Typically, float is faster in ANSI C compilers, while double is faster in - * pre-ANSI compilers (because they insist on converting to double anyway). - * The code below therefore chooses float if we have ANSI-style prototypes. - */ - -#ifndef FAST_FLOAT -#ifdef HAVE_PROTOTYPES -#define FAST_FLOAT float -#else -#define FAST_FLOAT double -#endif -#endif - -#endif /* JPEG_INTERNAL_OPTIONS */ - -#endif \ No newline at end of file diff --git a/Utilities/CAI/cai_dll/inc/jpegint.h b/Utilities/CAI/cai_dll/inc/jpegint.h deleted file mode 100755 index 7ba30c3fa9..0000000000 --- a/Utilities/CAI/cai_dll/inc/jpegint.h +++ /dev/null @@ -1,388 +0,0 @@ -/* - * jpegint.h - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file provides common declarations for the various JPEG modules. - * These declarations are considered internal to the JPEG library; most - * applications using the library shouldn't need to include this file. - */ - - -/* Declarations for both compression & decompression */ - -typedef enum { /* Operating modes for buffer controllers */ - JBUF_PASS_THRU, /* Plain stripwise operation */ - /* Remaining modes require a full-image buffer to have been created */ - JBUF_SAVE_SOURCE, /* Run source subobject only, save output */ - JBUF_CRANK_DEST, /* Run dest subobject only, using saved data */ - JBUF_SAVE_AND_PASS /* Run both subobjects, save output */ -} J_BUF_MODE; - -/* Values of global_state field (jdapi.c has some dependencies on ordering!) */ -#define CSTATE_START 100 /* after create_compress */ -#define CSTATE_SCANNING 101 /* start_compress done, write_scanlines OK */ -#define CSTATE_RAW_OK 102 /* start_compress done, write_raw_data OK */ -#define CSTATE_WRCOEFS 103 /* jpeg_write_coefficients done */ -#define DSTATE_START 200 /* after create_decompress */ -#define DSTATE_INHEADER 201 /* reading header markers, no SOS yet */ -#define DSTATE_READY 202 /* found SOS, ready for start_decompress */ -#define DSTATE_PRELOAD 203 /* reading multiscan file in start_decompress*/ -#define DSTATE_PRESCAN 204 /* performing dummy pass for 2-pass quant */ -#define DSTATE_SCANNING 205 /* start_decompress done, read_scanlines OK */ -#define DSTATE_RAW_OK 206 /* start_decompress done, read_raw_data OK */ -#define DSTATE_BUFIMAGE 207 /* expecting jpeg_start_output */ -#define DSTATE_BUFPOST 208 /* looking for SOS/EOI in jpeg_finish_output */ -#define DSTATE_RDCOEFS 209 /* reading file in jpeg_read_coefficients */ -#define DSTATE_STOPPING 210 /* looking for EOI in jpeg_finish_decompress */ - - -/* Declarations for compression modules */ - -/* Master control module */ -struct jpeg_comp_master { - JMETHOD(void, prepare_for_pass, (j_compress_ptr cinfo)); - JMETHOD(void, pass_startup, (j_compress_ptr cinfo)); - JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); - - /* State variables made visible to other modules */ - boolean call_pass_startup; /* True if pass_startup must be called */ - boolean is_last_pass; /* True during last pass */ -}; - -/* Main buffer control (downsampled-data buffer) */ -struct jpeg_c_main_controller { - JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(void, process_data, (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail)); -}; - -/* Compression preprocessing (downsampling input buffer control) */ -struct jpeg_c_prep_controller { - JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(void, pre_process_data, (j_compress_ptr cinfo, - JSAMPARRAY input_buf, - JDIMENSION *in_row_ctr, - JDIMENSION in_rows_avail, - JSAMPIMAGE output_buf, - JDIMENSION *out_row_group_ctr, - JDIMENSION out_row_groups_avail)); -}; - -/* Coefficient buffer control */ -struct jpeg_c_coef_controller { - JMETHOD(void, start_pass, (j_compress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(boolean, compress_data, (j_compress_ptr cinfo, - JSAMPIMAGE input_buf)); -}; - -/* Colorspace conversion */ -struct jpeg_color_converter { - JMETHOD(void, start_pass, (j_compress_ptr cinfo)); - JMETHOD(void, color_convert, (j_compress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPIMAGE output_buf, - JDIMENSION output_row, int num_rows)); -}; - -/* Downsampling */ -struct jpeg_downsampler { - JMETHOD(void, start_pass, (j_compress_ptr cinfo)); - JMETHOD(void, downsample, (j_compress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION in_row_index, - JSAMPIMAGE output_buf, - JDIMENSION out_row_group_index)); - - boolean need_context_rows; /* TRUE if need rows above & below */ -}; - -/* Forward DCT (also controls coefficient quantization) */ -struct jpeg_forward_dct { - JMETHOD(void, start_pass, (j_compress_ptr cinfo)); - /* perhaps this should be an array??? */ - JMETHOD(void, forward_DCT, (j_compress_ptr cinfo, - jpeg_component_info * compptr, - JSAMPARRAY sample_data, JBLOCKROW coef_blocks, - JDIMENSION start_row, JDIMENSION start_col, - JDIMENSION num_blocks)); -}; - -/* Entropy encoding */ -struct jpeg_entropy_encoder { - JMETHOD(void, start_pass, (j_compress_ptr cinfo, boolean gather_statistics)); - JMETHOD(boolean, encode_mcu, (j_compress_ptr cinfo, JBLOCKROW *MCU_data)); - JMETHOD(void, finish_pass, (j_compress_ptr cinfo)); -}; - -/* Marker writing */ -struct jpeg_marker_writer { - /* write_any_marker is exported for use by applications */ - /* Probably only COM and APPn markers should be written */ - JMETHOD(void, write_any_marker, (j_compress_ptr cinfo, int marker, - const JOCTET *dataptr, unsigned int datalen)); - JMETHOD(void, write_file_header, (j_compress_ptr cinfo)); - JMETHOD(void, write_frame_header, (j_compress_ptr cinfo)); - JMETHOD(void, write_scan_header, (j_compress_ptr cinfo)); - JMETHOD(void, write_file_trailer, (j_compress_ptr cinfo)); - JMETHOD(void, write_tables_only, (j_compress_ptr cinfo)); -}; - - -/* Declarations for decompression modules */ - -/* Master control module */ -struct jpeg_decomp_master { - JMETHOD(void, prepare_for_output_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, finish_output_pass, (j_decompress_ptr cinfo)); - - /* State variables made visible to other modules */ - boolean is_dummy_pass; /* True during 1st pass for 2-pass quant */ -}; - -/* Input control module */ -struct jpeg_input_controller { - JMETHOD(int, consume_input, (j_decompress_ptr cinfo)); - JMETHOD(void, reset_input_controller, (j_decompress_ptr cinfo)); - JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, finish_input_pass, (j_decompress_ptr cinfo)); - - /* State variables made visible to other modules */ - boolean has_multiple_scans; /* True if file has multiple scans */ - boolean eoi_reached; /* True when EOI has been consumed */ -}; - -/* Main buffer control (downsampled-data buffer) */ -struct jpeg_d_main_controller { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(void, process_data, (j_decompress_ptr cinfo, - JSAMPARRAY output_buf, JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); -}; - -/* Coefficient buffer control */ -struct jpeg_d_coef_controller { - JMETHOD(void, start_input_pass, (j_decompress_ptr cinfo)); - JMETHOD(int, consume_data, (j_decompress_ptr cinfo)); - JMETHOD(void, start_output_pass, (j_decompress_ptr cinfo)); - JMETHOD(int, decompress_data, (j_decompress_ptr cinfo, - JSAMPIMAGE output_buf)); - /* Pointer to array of coefficient virtual arrays, or NULL if none */ - jvirt_barray_ptr *coef_arrays; -}; - -/* Decompression postprocessing (color quantization buffer control) */ -struct jpeg_d_post_controller { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo, J_BUF_MODE pass_mode)); - JMETHOD(void, post_process_data, (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, - JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, - JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); -}; - -/* Marker reading & parsing */ -struct jpeg_marker_reader { - JMETHOD(void, reset_marker_reader, (j_decompress_ptr cinfo)); - /* Read markers until SOS or EOI. - * Returns same codes as are defined for jpeg_consume_input: - * JPEG_SUSPENDED, JPEG_REACHED_SOS, or JPEG_REACHED_EOI. - */ - JMETHOD(int, read_markers, (j_decompress_ptr cinfo)); - /* Read a restart marker --- exported for use by entropy decoder only */ - jpeg_marker_parser_method read_restart_marker; - /* Application-overridable marker processing methods */ - jpeg_marker_parser_method process_COM; - jpeg_marker_parser_method process_APPn[16]; - - /* State of marker reader --- nominally internal, but applications - * supplying COM or APPn handlers might like to know the state. - */ - boolean saw_SOI; /* found SOI? */ - boolean saw_SOF; /* found SOF? */ - int next_restart_num; /* next restart number expected (0-7) */ - unsigned int discarded_bytes; /* # of bytes skipped looking for a marker */ -}; - -/* Entropy decoding */ -struct jpeg_entropy_decoder { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); - JMETHOD(boolean, decode_mcu, (j_decompress_ptr cinfo, - JBLOCKROW *MCU_data)); -}; - -/* Inverse DCT (also performs dequantization) */ -typedef JMETHOD(void, inverse_DCT_method_ptr, - (j_decompress_ptr cinfo, jpeg_component_info * compptr, - JCOEFPTR coef_block, - JSAMPARRAY output_buf, JDIMENSION output_col)); - -struct jpeg_inverse_dct { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); - /* It is useful to allow each component to have a separate IDCT method. */ - inverse_DCT_method_ptr inverse_DCT[MAX_COMPONENTS]; -}; - -/* Upsampling (note that upsampler must also call color converter) */ -struct jpeg_upsampler { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, upsample, (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, - JDIMENSION *in_row_group_ctr, - JDIMENSION in_row_groups_avail, - JSAMPARRAY output_buf, - JDIMENSION *out_row_ctr, - JDIMENSION out_rows_avail)); - - boolean need_context_rows; /* TRUE if need rows above & below */ -}; - -/* Colorspace conversion */ -struct jpeg_color_deconverter { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, color_convert, (j_decompress_ptr cinfo, - JSAMPIMAGE input_buf, JDIMENSION input_row, - JSAMPARRAY output_buf, int num_rows)); -}; - -/* Color quantization or color precision reduction */ -struct jpeg_color_quantizer { - JMETHOD(void, start_pass, (j_decompress_ptr cinfo, boolean is_pre_scan)); - JMETHOD(void, color_quantize, (j_decompress_ptr cinfo, - JSAMPARRAY input_buf, JSAMPARRAY output_buf, - int num_rows)); - JMETHOD(void, finish_pass, (j_decompress_ptr cinfo)); - JMETHOD(void, new_color_map, (j_decompress_ptr cinfo)); -}; - - -/* Miscellaneous useful macros */ - -#undef MAX -#define MAX(a,b) ((a) > (b) ? (a) : (b)) -#undef MIN -#define MIN(a,b) ((a) < (b) ? (a) : (b)) - - -/* We assume that right shift corresponds to signed division by 2 with - * rounding towards minus infinity. This is correct for typical "arithmetic - * shift" instructions that shift in copies of the sign bit. But some - * C compilers implement >> with an unsigned shift. For these machines you - * must define RIGHT_SHIFT_IS_UNSIGNED. - * RIGHT_SHIFT provides a proper signed right shift of an INT32 quantity. - * It is only applied with constant shift counts. SHIFT_TEMPS must be - * included in the variables of any routine using RIGHT_SHIFT. - */ - -#ifdef RIGHT_SHIFT_IS_UNSIGNED -#define SHIFT_TEMPS INT32 shift_temp; -#define RIGHT_SHIFT(x,shft) \ - ((shift_temp = (x)) < 0 ? \ - (shift_temp >> (shft)) | ((~((INT32) 0)) << (32-(shft))) : \ - (shift_temp >> (shft))) -#else -#define SHIFT_TEMPS -#define RIGHT_SHIFT(x,shft) ((x) >> (shft)) -#endif - - -/* Short forms of external names for systems with brain-damaged linkers. */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jinit_compress_master jICompress -#define jinit_c_master_control jICMaster -#define jinit_c_main_controller jICMainC -#define jinit_c_prep_controller jICPrepC -#define jinit_c_coef_controller jICCoefC -#define jinit_color_converter jICColor -#define jinit_downsampler jIDownsampler -#define jinit_forward_dct jIFDCT -#define jinit_huff_encoder jIHEncoder -#define jinit_phuff_encoder jIPHEncoder -#define jinit_marker_writer jIMWriter -#define jinit_master_decompress jIDMaster -#define jinit_d_main_controller jIDMainC -#define jinit_d_coef_controller jIDCoefC -#define jinit_d_post_controller jIDPostC -#define jinit_input_controller jIInCtlr -#define jinit_marker_reader jIMReader -#define jinit_huff_decoder jIHDecoder -#define jinit_phuff_decoder jIPHDecoder -#define jinit_inverse_dct jIIDCT -#define jinit_upsampler jIUpsampler -#define jinit_color_deconverter jIDColor -#define jinit_1pass_quantizer jI1Quant -#define jinit_2pass_quantizer jI2Quant -#define jinit_merged_upsampler jIMUpsampler -#define jinit_memory_mgr jIMemMgr -#define jdiv_round_up jDivRound -#define jround_up jRound -#define jcopy_sample_rows jCopySamples -#define jcopy_block_row jCopyBlocks -#define jzero_far jZeroFar -#define jpeg_zigzag_order jZIGTable -#define jpeg_natural_order jZAGTable -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Compression module initialization routines */ -EXTERN(void) jinit_compress_master JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_c_master_control JPP((j_compress_ptr cinfo, - boolean transcode_only)); -EXTERN(void) jinit_c_main_controller JPP((j_compress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_c_prep_controller JPP((j_compress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_c_coef_controller JPP((j_compress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_color_converter JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_downsampler JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_forward_dct JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_huff_encoder JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_phuff_encoder JPP((j_compress_ptr cinfo)); -EXTERN(void) jinit_marker_writer JPP((j_compress_ptr cinfo)); -/* Decompression module initialization routines */ -EXTERN(void) jinit_master_decompress JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_d_main_controller JPP((j_decompress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_d_coef_controller JPP((j_decompress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_d_post_controller JPP((j_decompress_ptr cinfo, - boolean need_full_buffer)); -EXTERN(void) jinit_input_controller JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_marker_reader JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_huff_decoder JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_phuff_decoder JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_inverse_dct JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_upsampler JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_color_deconverter JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_1pass_quantizer JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_2pass_quantizer JPP((j_decompress_ptr cinfo)); -EXTERN(void) jinit_merged_upsampler JPP((j_decompress_ptr cinfo)); -/* Memory manager initialization */ -EXTERN(void) jinit_memory_mgr JPP((j_common_ptr cinfo)); - -/* Utility routines in jutils.c */ -EXTERN(long) jdiv_round_up JPP((long a, long b)); -EXTERN(long) jround_up JPP((long a, long b)); -EXTERN(void) jcopy_sample_rows JPP((JSAMPARRAY input_array, int source_row, - JSAMPARRAY output_array, int dest_row, - int num_rows, JDIMENSION num_cols)); -EXTERN(void) jcopy_block_row JPP((JBLOCKROW input_row, JBLOCKROW output_row, - JDIMENSION num_blocks)); -EXTERN(void) jzero_far JPP((void FAR * target, size_t bytestozero)); -/* Constant tables in jutils.c */ -extern const int jpeg_zigzag_order[]; /* natural coef order to zigzag order */ -extern const int jpeg_natural_order[]; /* zigzag coef order to natural order */ - -/* Suppress undefined-structure complaints if necessary. */ - -#ifdef INCOMPLETE_TYPES_BROKEN -#ifndef AM_MEMORY_MANAGER /* only jmemmgr.c defines these */ -struct jvirt_sarray_control { long dummy; }; -struct jvirt_barray_control { long dummy; }; -#endif -#endif /* INCOMPLETE_TYPES_BROKEN */ diff --git a/Utilities/CAI/cai_dll/inc/jpeglib.h b/Utilities/CAI/cai_dll/inc/jpeglib.h deleted file mode 100755 index d1be8ddeff..0000000000 --- a/Utilities/CAI/cai_dll/inc/jpeglib.h +++ /dev/null @@ -1,1096 +0,0 @@ -/* - * jpeglib.h - * - * Copyright (C) 1991-1998, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file defines the application interface for the JPEG library. - * Most applications using the library need only include this file, - * and perhaps jerror.h if they want to know the exact error codes. - */ - -#ifndef JPEGLIB_H -#define JPEGLIB_H - -/* - * First we include the configuration files that record how this - * installation of the JPEG library is set up. jconfig.h can be - * generated automatically for many systems. jmorecfg.h contains - * manual configuration options that most people need not worry about. - */ - -#ifndef JCONFIG_INCLUDED /* in case jinclude.h already did */ -#include "jconfig.h" /* widely used configuration options */ -#endif -#include "jmorecfg.h" /* seldom changed options */ - - -/* Version ID for the JPEG library. - * Might be useful for tests like "#if JPEG_LIB_VERSION >= 60". - */ - -#define JPEG_LIB_VERSION 62 /* Version 6b */ - - -/* Various constants determining the sizes of things. - * All of these are specified by the JPEG standard, so don't change them - * if you want to be compatible. - */ - -#define DCTSIZE 8 /* The basic DCT block is 8x8 samples */ -#define DCTSIZE2 64 /* DCTSIZE squared; # of elements in a block */ -#define NUM_QUANT_TBLS 4 /* Quantization tables are numbered 0..3 */ -#define NUM_HUFF_TBLS 4 /* Huffman tables are numbered 0..3 */ -#define NUM_ARITH_TBLS 16 /* Arith-coding tables are numbered 0..15 */ -#define MAX_COMPS_IN_SCAN 4 /* JPEG limit on # of components in one scan */ -#define MAX_SAMP_FACTOR 4 /* JPEG limit on sampling factors */ -/* Unfortunately, some bozo at Adobe saw no reason to be bound by the standard; - * the PostScript DCT filter can emit files with many more than 10 blocks/MCU. - * If you happen to run across such a file, you can up D_MAX_BLOCKS_IN_MCU - * to handle it. We even let you do this from the jconfig.h file. However, - * we strongly discourage changing C_MAX_BLOCKS_IN_MCU; just because Adobe - * sometimes emits noncompliant files doesn't mean you should too. - */ -#define C_MAX_BLOCKS_IN_MCU 10 /* compressor's limit on blocks per MCU */ -#ifndef D_MAX_BLOCKS_IN_MCU -#define D_MAX_BLOCKS_IN_MCU 10 /* decompressor's limit on blocks per MCU */ -#endif - - -/* Data structures for images (arrays of samples and of DCT coefficients). - * On 80x86 machines, the image arrays are too big for near pointers, - * but the pointer arrays can fit in near memory. - */ - -typedef JSAMPLE FAR *JSAMPROW; /* ptr to one image row of pixel samples. */ -typedef JSAMPROW *JSAMPARRAY; /* ptr to some rows (a 2-D sample array) */ -typedef JSAMPARRAY *JSAMPIMAGE; /* a 3-D sample array: top index is color */ - -typedef JCOEF JBLOCK[DCTSIZE2]; /* one block of coefficients */ -typedef JBLOCK FAR *JBLOCKROW; /* pointer to one row of coefficient blocks */ -typedef JBLOCKROW *JBLOCKARRAY; /* a 2-D array of coefficient blocks */ -typedef JBLOCKARRAY *JBLOCKIMAGE; /* a 3-D array of coefficient blocks */ - -typedef JCOEF FAR *JCOEFPTR; /* useful in a couple of places */ - - -/* Types for JPEG compression parameters and working tables. */ - - -/* DCT coefficient quantization tables. */ - -typedef struct { - /* This array gives the coefficient quantizers in natural array order - * (not the zigzag order in which they are stored in a JPEG DQT marker). - * CAUTION: IJG versions prior to v6a kept this array in zigzag order. - */ - UINT16 quantval[DCTSIZE2]; /* quantization step for each coefficient */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JQUANT_TBL; - - -/* Huffman coding tables. */ - -typedef struct { - /* These two fields directly represent the contents of a JPEG DHT marker */ - UINT8 bits[17]; /* bits[k] = # of symbols with codes of */ - /* length k bits; bits[0] is unused */ - UINT8 huffval[256]; /* The symbols, in order of incr code length */ - /* This field is used only during compression. It's initialized FALSE when - * the table is created, and set TRUE when it's been output to the file. - * You could suppress output of a table by setting this to TRUE. - * (See jpeg_suppress_tables for an example.) - */ - boolean sent_table; /* TRUE when table has been output */ -} JHUFF_TBL; - - -/* Basic info about one component (color channel). */ - -typedef struct { - /* These values are fixed over the whole image. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOF marker. */ - int component_id; /* identifier for this component (0..255) */ - int component_index; /* its index in SOF or cinfo->comp_info[] */ - int h_samp_factor; /* horizontal sampling factor (1..4) */ - int v_samp_factor; /* vertical sampling factor (1..4) */ - int quant_tbl_no; /* quantization table selector (0..3) */ - /* These values may vary between scans. */ - /* For compression, they must be supplied by parameter setup; */ - /* for decompression, they are read from the SOS marker. */ - /* The decompressor output side may not use these variables. */ - int dc_tbl_no; /* DC entropy table selector (0..3) */ - int ac_tbl_no; /* AC entropy table selector (0..3) */ - - /* Remaining fields should be treated as private by applications. */ - - /* These values are computed during compression or decompression startup: */ - /* Component's size in DCT blocks. - * Any dummy blocks added to complete an MCU are not counted; therefore - * these values do not depend on whether a scan is interleaved or not. - */ - JDIMENSION width_in_blocks; - JDIMENSION height_in_blocks; - /* Size of a DCT block in samples. Always DCTSIZE for compression. - * For decompression this is the size of the output from one DCT block, - * reflecting any scaling we choose to apply during the IDCT step. - * Values of 1,2,4,8 are likely to be supported. Note that different - * components may receive different IDCT scalings. - */ - int DCT_scaled_size; - /* The downsampled dimensions are the component's actual, unpadded number - * of samples at the main buffer (preprocessing/compression interface), thus - * downsampled_width = ceil(image_width * Hi/Hmax) - * and similarly for height. For decompression, IDCT scaling is included, so - * downsampled_width = ceil(image_width * Hi/Hmax * DCT_scaled_size/DCTSIZE) - */ - JDIMENSION downsampled_width; /* actual width in samples */ - JDIMENSION downsampled_height; /* actual height in samples */ - /* This flag is used only for decompression. In cases where some of the - * components will be ignored (eg grayscale output from YCbCr image), - * we can skip most computations for the unused components. - */ - boolean component_needed; /* do we need the value of this component? */ - - /* These values are computed before starting a scan of the component. */ - /* The decompressor output side may not use these variables. */ - int MCU_width; /* number of blocks per MCU, horizontally */ - int MCU_height; /* number of blocks per MCU, vertically */ - int MCU_blocks; /* MCU_width * MCU_height */ - int MCU_sample_width; /* MCU width in samples, MCU_width*DCT_scaled_size */ - int last_col_width; /* # of non-dummy blocks across in last MCU */ - int last_row_height; /* # of non-dummy blocks down in last MCU */ - - /* Saved quantization table for component; NULL if none yet saved. - * See jdinput.c comments about the need for this information. - * This field is currently used only for decompression. - */ - JQUANT_TBL * quant_table; - - /* Private per-component storage for DCT or IDCT subsystem. */ - void * dct_table; -} jpeg_component_info; - - -/* The script for encoding a multiple-scan file is an array of these: */ - -typedef struct { - int comps_in_scan; /* number of components encoded in this scan */ - int component_index[MAX_COMPS_IN_SCAN]; /* their SOF/comp_info[] indexes */ - int Ss, Se; /* progressive JPEG spectral selection parms */ - int Ah, Al; /* progressive JPEG successive approx. parms */ -} jpeg_scan_info; - -/* The decompressor can save APPn and COM markers in a list of these: */ - -typedef struct jpeg_marker_struct FAR * jpeg_saved_marker_ptr; - -struct jpeg_marker_struct { - jpeg_saved_marker_ptr next; /* next in list, or NULL */ - UINT8 marker; /* marker code: JPEG_COM, or JPEG_APP0+n */ - unsigned int original_length; /* # bytes of data in the file */ - unsigned int data_length; /* # bytes of data saved at data[] */ - JOCTET FAR * data; /* the data contained in the marker */ - /* the marker length word is not counted in data_length or original_length */ -}; - -/* Known color spaces. */ - -typedef enum { - JCS_UNKNOWN, /* error/unspecified */ - JCS_GRAYSCALE, /* monochrome */ - JCS_RGB, /* red/green/blue */ - JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */ - JCS_CMYK, /* C/M/Y/K */ - JCS_YCCK /* Y/Cb/Cr/K */ -} J_COLOR_SPACE; - -/* DCT/IDCT algorithm options. */ - -typedef enum { - JDCT_ISLOW, /* slow but accurate integer algorithm */ - JDCT_IFAST, /* faster, less accurate integer method */ - JDCT_FLOAT /* floating-point: accurate, fast on fast HW */ -} J_DCT_METHOD; - -#ifndef JDCT_DEFAULT /* may be overridden in jconfig.h */ -#define JDCT_DEFAULT JDCT_ISLOW -#endif -#ifndef JDCT_FASTEST /* may be overridden in jconfig.h */ -#define JDCT_FASTEST JDCT_IFAST -#endif - -/* Dithering options for decompression. */ - -typedef enum { - JDITHER_NONE, /* no dithering */ - JDITHER_ORDERED, /* simple ordered dither */ - JDITHER_FS /* Floyd-Steinberg error diffusion dither */ -} J_DITHER_MODE; - - -/* Common fields between JPEG compression and decompression master structs. */ - -#define jpeg_common_fields \ - struct jpeg_error_mgr * err; /* Error handler module */\ - struct jpeg_memory_mgr * mem; /* Memory manager module */\ - struct jpeg_progress_mgr * progress; /* Progress monitor, or NULL if none */\ - void * client_data; /* Available for use by application */\ - boolean is_decompressor; /* So common code can tell which is which */\ - int global_state /* For checking call sequence validity */ - -/* Routines that are to be used by both halves of the library are declared - * to receive a pointer to this structure. There are no actual instances of - * jpeg_common_struct, only of jpeg_compress_struct and jpeg_decompress_struct. - */ -struct jpeg_common_struct { - jpeg_common_fields; /* Fields common to both master struct types */ - /* Additional fields follow in an actual jpeg_compress_struct or - * jpeg_decompress_struct. All three structs must agree on these - * initial fields! (This would be a lot cleaner in C++.) - */ -}; - -typedef struct jpeg_common_struct * j_common_ptr; -typedef struct jpeg_compress_struct * j_compress_ptr; -typedef struct jpeg_decompress_struct * j_decompress_ptr; - - -/* Master record for a compression instance */ - -struct jpeg_compress_struct { - jpeg_common_fields; /* Fields shared with jpeg_decompress_struct */ - - /* Destination for compressed data */ - struct jpeg_destination_mgr * dest; - - /* Description of source image --- these fields must be filled in by - * outer application before starting compression. in_color_space must - * be correct before you can even call jpeg_set_defaults(). - */ - - JDIMENSION image_width; /* input image width */ - JDIMENSION image_height; /* input image height */ - int input_components; /* # of color components in input image */ - J_COLOR_SPACE in_color_space; /* colorspace of input image */ - - double input_gamma; /* image gamma of input image */ - - /* Compression parameters --- these fields must be set before calling - * jpeg_start_compress(). We recommend calling jpeg_set_defaults() to - * initialize everything to reasonable defaults, then changing anything - * the application specifically wants to change. That way you won't get - * burnt when new parameters are added. Also note that there are several - * helper routines to simplify changing parameters. - */ - - int data_precision; /* bits of precision in image data */ - - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - int num_scans; /* # of entries in scan_info array */ - const jpeg_scan_info * scan_info; /* script for multi-scan file, or NULL */ - /* The default value of scan_info is NULL, which causes a single-scan - * sequential JPEG file to be emitted. To create a multi-scan file, - * set num_scans and scan_info to point to an array of scan definitions. - */ - - boolean raw_data_in; /* TRUE=caller supplies downsampled data */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - boolean optimize_coding; /* TRUE=optimize entropy encoding parms */ - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - int smoothing_factor; /* 1..100, or 0 for no input smoothing */ - J_DCT_METHOD dct_method; /* DCT algorithm selector */ - - /* The restart interval can be specified in absolute MCUs by setting - * restart_interval, or in MCU rows by setting restart_in_rows - * (in which case the correct restart_interval will be figured - * for each scan). - */ - unsigned int restart_interval; /* MCUs per restart, or 0 for no restart */ - int restart_in_rows; /* if > 0, MCU rows per restart interval */ - - /* Parameters controlling emission of special markers. */ - - boolean write_JFIF_header; /* should a JFIF marker be written? */ - UINT8 JFIF_major_version; /* What to write for the JFIF version number */ - UINT8 JFIF_minor_version; - /* These three values are not used by the JPEG code, merely copied */ - /* into the JFIF APP0 marker. density_unit can be 0 for unknown, */ - /* 1 for dots/inch, or 2 for dots/cm. Note that the pixel aspect */ - /* ratio is defined by X_density/Y_density even when density_unit=0. */ - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean write_Adobe_marker; /* should an Adobe marker be written? */ - - /* State variable: index of next scanline to be written to - * jpeg_write_scanlines(). Application may use this to control its - * processing loop, e.g., "while (next_scanline < image_height)". - */ - - JDIMENSION next_scanline; /* 0 .. image_height-1 */ - - /* Remaining fields are known throughout compressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during compression startup - */ - boolean progressive_mode; /* TRUE if scan script uses progressive mode */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows to be input to coef ctlr */ - /* The coefficient controller receives data in units of MCU rows as defined - * for fully interleaved scans (whether the JPEG file is interleaved or not). - * There are v_samp_factor * DCTSIZE sample rows of each component in an - * "iMCU" (interleaved MCU) row. - */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[C_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - /* - * Links to compression subobjects (methods and private variables of modules) - */ - struct jpeg_comp_master * master; - struct jpeg_c_main_controller * main; - struct jpeg_c_prep_controller * prep; - struct jpeg_c_coef_controller * coef; - struct jpeg_marker_writer * marker; - struct jpeg_color_converter * cconvert; - struct jpeg_downsampler * downsample; - struct jpeg_forward_dct * fdct; - struct jpeg_entropy_encoder * entropy; - jpeg_scan_info * script_space; /* workspace for jpeg_simple_progression */ - int script_space_size; -}; - - -/* Master record for a decompression instance */ - -struct jpeg_decompress_struct { - jpeg_common_fields; /* Fields shared with jpeg_compress_struct */ - - /* Source of compressed data */ - struct jpeg_source_mgr * src; - - /* Basic description of image --- filled in by jpeg_read_header(). */ - /* Application may inspect these values to decide how to process image. */ - - JDIMENSION image_width; /* nominal image width (from SOF marker) */ - JDIMENSION image_height; /* nominal image height */ - int num_components; /* # of color components in JPEG image */ - J_COLOR_SPACE jpeg_color_space; /* colorspace of JPEG image */ - - /* Decompression processing parameters --- these fields must be set before - * calling jpeg_start_decompress(). Note that jpeg_read_header() initializes - * them to default values. - */ - - J_COLOR_SPACE out_color_space; /* colorspace for output */ - - unsigned int scale_num, scale_denom; /* fraction by which to scale image */ - - double output_gamma; /* image gamma wanted in output */ - - boolean buffered_image; /* TRUE=multiple output passes */ - boolean raw_data_out; /* TRUE=downsampled data wanted */ - - J_DCT_METHOD dct_method; /* IDCT algorithm selector */ - boolean do_fancy_upsampling; /* TRUE=apply fancy upsampling */ - boolean do_block_smoothing; /* TRUE=apply interblock smoothing */ - - boolean quantize_colors; /* TRUE=colormapped output wanted */ - /* the following are ignored if not quantize_colors: */ - J_DITHER_MODE dither_mode; /* type of color dithering to use */ - boolean two_pass_quantize; /* TRUE=use two-pass color quantization */ - int desired_number_of_colors; /* max # colors to use in created colormap */ - /* these are significant only in buffered-image mode: */ - boolean enable_1pass_quant; /* enable future use of 1-pass quantizer */ - boolean enable_external_quant;/* enable future use of external colormap */ - boolean enable_2pass_quant; /* enable future use of 2-pass quantizer */ - - /* Description of actual output image that will be returned to application. - * These fields are computed by jpeg_start_decompress(). - * You can also use jpeg_calc_output_dimensions() to determine these values - * in advance of calling jpeg_start_decompress(). - */ - - JDIMENSION output_width; /* scaled image width */ - JDIMENSION output_height; /* scaled image height */ - int out_color_components; /* # of color components in out_color_space */ - int output_components; /* # of color components returned */ - /* output_components is 1 (a colormap index) when quantizing colors; - * otherwise it equals out_color_components. - */ - int rec_outbuf_height; /* min recommended height of scanline buffer */ - /* If the buffer passed to jpeg_read_scanlines() is less than this many rows - * high, space and time will be wasted due to unnecessary data copying. - * Usually rec_outbuf_height will be 1 or 2, at most 4. - */ - - /* When quantizing colors, the output colormap is described by these fields. - * The application can supply a colormap by setting colormap non-NULL before - * calling jpeg_start_decompress; otherwise a colormap is created during - * jpeg_start_decompress or jpeg_start_output. - * The map has out_color_components rows and actual_number_of_colors columns. - */ - int actual_number_of_colors; /* number of entries in use */ - JSAMPARRAY colormap; /* The color map as a 2-D pixel array */ - - /* State variables: these variables indicate the progress of decompression. - * The application may examine these but must not modify them. - */ - - /* Row index of next scanline to be read from jpeg_read_scanlines(). - * Application may use this to control its processing loop, e.g., - * "while (output_scanline < output_height)". - */ - JDIMENSION output_scanline; /* 0 .. output_height-1 */ - - /* Current input scan number and number of iMCU rows completed in scan. - * These indicate the progress of the decompressor input side. - */ - int input_scan_number; /* Number of SOS markers seen so far */ - JDIMENSION input_iMCU_row; /* Number of iMCU rows completed */ - - /* The "output scan number" is the notional scan being displayed by the - * output side. The decompressor will not allow output scan/row number - * to get ahead of input scan/row, but it can fall arbitrarily far behind. - */ - int output_scan_number; /* Nominal scan number being displayed */ - JDIMENSION output_iMCU_row; /* Number of iMCU rows read */ - - /* Current progression status. coef_bits[c][i] indicates the precision - * with which component c's DCT coefficient i (in zigzag order) is known. - * It is -1 when no data has yet been received, otherwise it is the point - * transform (shift) value for the most recent scan of the coefficient - * (thus, 0 at completion of the progression). - * This pointer is NULL when reading a non-progressive file. - */ - int (*coef_bits)[DCTSIZE2]; /* -1 or current Al value for each coef */ - - /* Internal JPEG parameters --- the application usually need not look at - * these fields. Note that the decompressor output side may not use - * any parameters that can change between scans. - */ - - /* Quantization and Huffman tables are carried forward across input - * datastreams when processing abbreviated JPEG datastreams. - */ - - JQUANT_TBL * quant_tbl_ptrs[NUM_QUANT_TBLS]; - /* ptrs to coefficient quantization tables, or NULL if not defined */ - - JHUFF_TBL * dc_huff_tbl_ptrs[NUM_HUFF_TBLS]; - JHUFF_TBL * ac_huff_tbl_ptrs[NUM_HUFF_TBLS]; - /* ptrs to Huffman coding tables, or NULL if not defined */ - - /* These parameters are never carried across datastreams, since they - * are given in SOF/SOS markers or defined to be reset by SOI. - */ - - int data_precision; /* bits of precision in image data */ - - jpeg_component_info * comp_info; - /* comp_info[i] describes component that appears i'th in SOF */ - - boolean progressive_mode; /* TRUE if SOFn specifies progressive mode */ - boolean arith_code; /* TRUE=arithmetic coding, FALSE=Huffman */ - - UINT8 arith_dc_L[NUM_ARITH_TBLS]; /* L values for DC arith-coding tables */ - UINT8 arith_dc_U[NUM_ARITH_TBLS]; /* U values for DC arith-coding tables */ - UINT8 arith_ac_K[NUM_ARITH_TBLS]; /* Kx values for AC arith-coding tables */ - - unsigned int restart_interval; /* MCUs per restart interval, or 0 for no restart */ - - /* These fields record data obtained from optional markers recognized by - * the JPEG library. - */ - boolean saw_JFIF_marker; /* TRUE iff a JFIF APP0 marker was found */ - /* Data copied from JFIF marker; only valid if saw_JFIF_marker is TRUE: */ - UINT8 JFIF_major_version; /* JFIF version number */ - UINT8 JFIF_minor_version; - UINT8 density_unit; /* JFIF code for pixel size units */ - UINT16 X_density; /* Horizontal pixel density */ - UINT16 Y_density; /* Vertical pixel density */ - boolean saw_Adobe_marker; /* TRUE iff an Adobe APP14 marker was found */ - UINT8 Adobe_transform; /* Color transform code from Adobe marker */ - - boolean CCIR601_sampling; /* TRUE=first samples are cosited */ - - /* Aside from the specific data retained from APPn markers known to the - * library, the uninterpreted contents of any or all APPn and COM markers - * can be saved in a list for examination by the application. - */ - jpeg_saved_marker_ptr marker_list; /* Head of list of saved markers */ - - /* Remaining fields are known throughout decompressor, but generally - * should not be touched by a surrounding application. - */ - - /* - * These fields are computed during decompression startup - */ - int max_h_samp_factor; /* largest h_samp_factor */ - int max_v_samp_factor; /* largest v_samp_factor */ - - int min_DCT_scaled_size; /* smallest DCT_scaled_size of any component */ - - JDIMENSION total_iMCU_rows; /* # of iMCU rows in image */ - /* The coefficient controller's input and output progress is measured in - * units of "iMCU" (interleaved MCU) rows. These are the same as MCU rows - * in fully interleaved JPEG scans, but are used whether the scan is - * interleaved or not. We define an iMCU row as v_samp_factor DCT block - * rows of each component. Therefore, the IDCT output contains - * v_samp_factor*DCT_scaled_size sample rows of a component per iMCU row. - */ - - JSAMPLE * sample_range_limit; /* table for fast range-limiting */ - - /* - * These fields are valid during any one scan. - * They describe the components and MCUs actually appearing in the scan. - * Note that the decompressor output side must not use these fields. - */ - int comps_in_scan; /* # of JPEG components in this scan */ - jpeg_component_info * cur_comp_info[MAX_COMPS_IN_SCAN]; - /* *cur_comp_info[i] describes component that appears i'th in SOS */ - - JDIMENSION MCUs_per_row; /* # of MCUs across the image */ - JDIMENSION MCU_rows_in_scan; /* # of MCU rows in the image */ - - int blocks_in_MCU; /* # of DCT blocks per MCU */ - int MCU_membership[D_MAX_BLOCKS_IN_MCU]; - /* MCU_membership[i] is index in cur_comp_info of component owning */ - /* i'th block in an MCU */ - - int Ss, Se, Ah, Al; /* progressive JPEG parameters for scan */ - - /* This field is shared between entropy decoder and marker parser. - * It is either zero or the code of a JPEG marker that has been - * read from the data source, but has not yet been processed. - */ - int unread_marker; - - /* - * Links to decompression subobjects (methods, private variables of modules) - */ - struct jpeg_decomp_master * master; - struct jpeg_d_main_controller * main; - struct jpeg_d_coef_controller * coef; - struct jpeg_d_post_controller * post; - struct jpeg_input_controller * inputctl; - struct jpeg_marker_reader * marker; - struct jpeg_entropy_decoder * entropy; - struct jpeg_inverse_dct * idct; - struct jpeg_upsampler * upsample; - struct jpeg_color_deconverter * cconvert; - struct jpeg_color_quantizer * cquantize; -}; - - -/* "Object" declarations for JPEG modules that may be supplied or called - * directly by the surrounding application. - * As with all objects in the JPEG library, these structs only define the - * publicly visible methods and state variables of a module. Additional - * private fields may exist after the public ones. - */ - - -/* Error handler object */ - -struct jpeg_error_mgr { - /* Error exit handler: does not return to caller */ - JMETHOD(void, error_exit, (j_common_ptr cinfo)); - /* Conditionally emit a trace or warning message */ - JMETHOD(void, emit_message, (j_common_ptr cinfo, int msg_level)); - /* Routine that actually outputs a trace or error message */ - JMETHOD(void, output_message, (j_common_ptr cinfo)); - /* Format a message string for the most recent JPEG error or message */ - JMETHOD(void, format_message, (j_common_ptr cinfo, char * buffer)); -#define JMSG_LENGTH_MAX 200 /* recommended size of format_message buffer */ - /* Reset error state variables at start of a new image */ - JMETHOD(void, reset_error_mgr, (j_common_ptr cinfo)); - - /* The message ID code and any parameters are saved here. - * A message can have one string parameter or up to 8 int parameters. - */ - int msg_code; -#define JMSG_STR_PARM_MAX 80 - union { - int i[8]; - char s[JMSG_STR_PARM_MAX]; - } msg_parm; - - /* Standard state variables for error facility */ - - int trace_level; /* max msg_level that will be displayed */ - - /* For recoverable corrupt-data errors, we emit a warning message, - * but keep going unless emit_message chooses to abort. emit_message - * should count warnings in num_warnings. The surrounding application - * can check for bad data by seeing if num_warnings is nonzero at the - * end of processing. - */ - long num_warnings; /* number of corrupt-data warnings */ - - /* These fields point to the table(s) of error message strings. - * An application can change the table pointer to switch to a different - * message list (typically, to change the language in which errors are - * reported). Some applications may wish to add additional error codes - * that will be handled by the JPEG library error mechanism; the second - * table pointer is used for this purpose. - * - * First table includes all errors generated by JPEG library itself. - * Error code 0 is reserved for a "no such error string" message. - */ - const char * const * jpeg_message_table; /* Library errors */ - int last_jpeg_message; /* Table contains strings 0..last_jpeg_message */ - /* Second table can be added by application (see cjpeg/djpeg for example). - * It contains strings numbered first_addon_message..last_addon_message. - */ - const char * const * addon_message_table; /* Non-library errors */ - int first_addon_message; /* code for first string in addon table */ - int last_addon_message; /* code for last string in addon table */ -}; - - -/* Progress monitor object */ - -struct jpeg_progress_mgr { - JMETHOD(void, progress_monitor, (j_common_ptr cinfo)); - - long pass_counter; /* work units completed in this pass */ - long pass_limit; /* total number of work units in this pass */ - int completed_passes; /* passes completed so far */ - int total_passes; /* total number of passes expected */ -}; - - -/* Data destination object for compression */ - -struct jpeg_destination_mgr { - JOCTET * next_output_byte; /* => next byte to write in buffer */ - size_t free_in_buffer; /* # of byte spaces remaining in buffer */ - - JMETHOD(void, init_destination, (j_compress_ptr cinfo)); - JMETHOD(boolean, empty_output_buffer, (j_compress_ptr cinfo)); - JMETHOD(void, term_destination, (j_compress_ptr cinfo)); -}; - - -/* Data source object for decompression */ - -struct jpeg_source_mgr { - const JOCTET * next_input_byte; /* => next byte to read from buffer */ - size_t bytes_in_buffer; /* # of bytes remaining in buffer */ - - JMETHOD(void, init_source, (j_decompress_ptr cinfo)); - JMETHOD(boolean, fill_input_buffer, (j_decompress_ptr cinfo)); - JMETHOD(void, skip_input_data, (j_decompress_ptr cinfo, long num_bytes)); - JMETHOD(boolean, resync_to_restart, (j_decompress_ptr cinfo, int desired)); - JMETHOD(void, term_source, (j_decompress_ptr cinfo)); -}; - - -/* Memory manager object. - * Allocates "small" objects (a few K total), "large" objects (tens of K), - * and "really big" objects (virtual arrays with backing store if needed). - * The memory manager does not allow individual objects to be freed; rather, - * each created object is assigned to a pool, and whole pools can be freed - * at once. This is faster and more convenient than remembering exactly what - * to free, especially where malloc()/free() are not too speedy. - * NB: alloc routines never return NULL. They exit to error_exit if not - * successful. - */ - -#define JPOOL_PERMANENT 0 /* lasts until master record is destroyed */ -#define JPOOL_IMAGE 1 /* lasts until done with image/datastream */ -#define JPOOL_NUMPOOLS 2 - -typedef struct jvirt_sarray_control * jvirt_sarray_ptr; -typedef struct jvirt_barray_control * jvirt_barray_ptr; - - -struct jpeg_memory_mgr { - /* Method pointers */ - JMETHOD(void *, alloc_small, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(void FAR *, alloc_large, (j_common_ptr cinfo, int pool_id, - size_t sizeofobject)); - JMETHOD(JSAMPARRAY, alloc_sarray, (j_common_ptr cinfo, int pool_id, - JDIMENSION samplesperrow, - JDIMENSION numrows)); - JMETHOD(JBLOCKARRAY, alloc_barray, (j_common_ptr cinfo, int pool_id, - JDIMENSION blocksperrow, - JDIMENSION numrows)); - JMETHOD(jvirt_sarray_ptr, request_virt_sarray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION samplesperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(jvirt_barray_ptr, request_virt_barray, (j_common_ptr cinfo, - int pool_id, - boolean pre_zero, - JDIMENSION blocksperrow, - JDIMENSION numrows, - JDIMENSION maxaccess)); - JMETHOD(void, realize_virt_arrays, (j_common_ptr cinfo)); - JMETHOD(JSAMPARRAY, access_virt_sarray, (j_common_ptr cinfo, - jvirt_sarray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(JBLOCKARRAY, access_virt_barray, (j_common_ptr cinfo, - jvirt_barray_ptr ptr, - JDIMENSION start_row, - JDIMENSION num_rows, - boolean writable)); - JMETHOD(void, free_pool, (j_common_ptr cinfo, int pool_id)); - JMETHOD(void, self_destruct, (j_common_ptr cinfo)); - - /* Limit on memory allocation for this JPEG object. (Note that this is - * merely advisory, not a guaranteed maximum; it only affects the space - * used for virtual-array buffers.) May be changed by outer application - * after creating the JPEG object. - */ - long max_memory_to_use; - - /* Maximum allocation request accepted by alloc_large. */ - long max_alloc_chunk; -}; - - -/* Routine signature for application-supplied marker processing methods. - * Need not pass marker code since it is stored in cinfo->unread_marker. - */ -typedef JMETHOD(boolean, jpeg_marker_parser_method, (j_decompress_ptr cinfo)); - - -/* Declarations for routines called by application. - * The JPP macro hides prototype parameters from compilers that can't cope. - * Note JPP requires double parentheses. - */ - -#ifdef HAVE_PROTOTYPES -#define JPP(arglist) arglist -#else -#define JPP(arglist) () -#endif - - -/* Short forms of external names for systems with brain-damaged linkers. - * We shorten external names to be unique in the first six letters, which - * is good enough for all known systems. - * (If your compiler itself needs names to be unique in less than 15 - * characters, you are out of luck. Get a better compiler.) - */ - -#ifdef NEED_SHORT_EXTERNAL_NAMES -#define jpeg_std_error jStdError -#define jpeg_CreateCompress jCreaCompress -#define jpeg_CreateDecompress jCreaDecompress -#define jpeg_destroy_compress jDestCompress -#define jpeg_destroy_decompress jDestDecompress -#define jpeg_stdio_dest jStdDest -#define jpeg_stdio_src jStdSrc -#define jpeg_set_defaults jSetDefaults -#define jpeg_set_colorspace jSetColorspace -#define jpeg_default_colorspace jDefColorspace -#define jpeg_set_quality jSetQuality -#define jpeg_set_linear_quality jSetLQuality -#define jpeg_add_quant_table jAddQuantTable -#define jpeg_quality_scaling jQualityScaling -#define jpeg_simple_progression jSimProgress -#define jpeg_suppress_tables jSuppressTables -#define jpeg_alloc_quant_table jAlcQTable -#define jpeg_alloc_huff_table jAlcHTable -#define jpeg_start_compress jStrtCompress -#define jpeg_write_scanlines jWrtScanlines -#define jpeg_finish_compress jFinCompress -#define jpeg_write_raw_data jWrtRawData -#define jpeg_write_marker jWrtMarker -#define jpeg_write_m_header jWrtMHeader -#define jpeg_write_m_byte jWrtMByte -#define jpeg_write_tables jWrtTables -#define jpeg_read_header jReadHeader -#define jpeg_start_decompress jStrtDecompress -#define jpeg_read_scanlines jReadScanlines -#define jpeg_finish_decompress jFinDecompress -#define jpeg_read_raw_data jReadRawData -#define jpeg_has_multiple_scans jHasMultScn -#define jpeg_start_output jStrtOutput -#define jpeg_finish_output jFinOutput -#define jpeg_input_complete jInComplete -#define jpeg_new_colormap jNewCMap -#define jpeg_consume_input jConsumeInput -#define jpeg_calc_output_dimensions jCalcDimensions -#define jpeg_save_markers jSaveMarkers -#define jpeg_set_marker_processor jSetMarker -#define jpeg_read_coefficients jReadCoefs -#define jpeg_write_coefficients jWrtCoefs -#define jpeg_copy_critical_parameters jCopyCrit -#define jpeg_abort_compress jAbrtCompress -#define jpeg_abort_decompress jAbrtDecompress -#define jpeg_abort jAbort -#define jpeg_destroy jDestroy -#define jpeg_resync_to_restart jResyncRestart -#endif /* NEED_SHORT_EXTERNAL_NAMES */ - - -/* Default error-management setup */ -EXTERN(struct jpeg_error_mgr *) jpeg_std_error - JPP((struct jpeg_error_mgr * err)); - -/* Initialization of JPEG compression objects. - * jpeg_create_compress() and jpeg_create_decompress() are the exported - * names that applications should call. These expand to calls on - * jpeg_CreateCompress and jpeg_CreateDecompress with additional information - * passed for version mismatch checking. - * NB: you must set up the error-manager BEFORE calling jpeg_create_xxx. - */ -#define jpeg_create_compress(cinfo) \ - jpeg_CreateCompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_compress_struct)) -#define jpeg_create_decompress(cinfo) \ - jpeg_CreateDecompress((cinfo), JPEG_LIB_VERSION, \ - (size_t) sizeof(struct jpeg_decompress_struct)) -EXTERN(void) jpeg_CreateCompress JPP((j_compress_ptr cinfo, - int version, size_t structsize)); -EXTERN(void) jpeg_CreateDecompress JPP((j_decompress_ptr cinfo, - int version, size_t structsize)); -/* Destruction of JPEG compression objects */ -EXTERN(void) jpeg_destroy_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_destroy_decompress JPP((j_decompress_ptr cinfo)); - -/* Standard data source and destination managers: stdio streams. */ -/* Caller is responsible for opening the file before and closing after. */ -EXTERN(void) jpeg_stdio_dest JPP((j_compress_ptr cinfo, FILE * outfile)); -EXTERN(void) jpeg_stdio_src JPP((j_decompress_ptr cinfo, FILE * infile)); - -/* Default parameter setup for compression */ -EXTERN(void) jpeg_set_defaults JPP((j_compress_ptr cinfo)); -/* Compression parameter setup aids */ -EXTERN(void) jpeg_set_colorspace JPP((j_compress_ptr cinfo, - J_COLOR_SPACE colorspace)); -EXTERN(void) jpeg_default_colorspace JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_set_quality JPP((j_compress_ptr cinfo, int quality, - boolean force_baseline)); -EXTERN(void) jpeg_set_linear_quality JPP((j_compress_ptr cinfo, - int scale_factor, - boolean force_baseline)); -EXTERN(void) jpeg_add_quant_table JPP((j_compress_ptr cinfo, int which_tbl, - const unsigned int *basic_table, - int scale_factor, - boolean force_baseline)); -EXTERN(int) jpeg_quality_scaling JPP((int quality)); -EXTERN(void) jpeg_simple_progression JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_suppress_tables JPP((j_compress_ptr cinfo, - boolean suppress)); -EXTERN(JQUANT_TBL *) jpeg_alloc_quant_table JPP((j_common_ptr cinfo)); -EXTERN(JHUFF_TBL *) jpeg_alloc_huff_table JPP((j_common_ptr cinfo)); - -/* Main entry points for compression */ -EXTERN(void) jpeg_start_compress JPP((j_compress_ptr cinfo, - boolean write_all_tables)); -EXTERN(JDIMENSION) jpeg_write_scanlines JPP((j_compress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION num_lines)); -EXTERN(void) jpeg_finish_compress JPP((j_compress_ptr cinfo)); - -/* Replaces jpeg_write_scanlines when writing raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_write_raw_data JPP((j_compress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION num_lines)); - -/* Write a special marker. See libjpeg.doc concerning safe usage. */ -EXTERN(void) jpeg_write_marker - JPP((j_compress_ptr cinfo, int marker, - const JOCTET * dataptr, unsigned int datalen)); -/* Same, but piecemeal. */ -EXTERN(void) jpeg_write_m_header - JPP((j_compress_ptr cinfo, int marker, unsigned int datalen)); -EXTERN(void) jpeg_write_m_byte - JPP((j_compress_ptr cinfo, int val)); - -/* Alternate compression function: just write an abbreviated table file */ -EXTERN(void) jpeg_write_tables JPP((j_compress_ptr cinfo)); - -/* Decompression startup: read start of JPEG datastream to see what's there */ -EXTERN(int) jpeg_read_header JPP((j_decompress_ptr cinfo, - boolean require_image)); -/* Return value is one of: */ -#define JPEG_SUSPENDED 0 /* Suspended due to lack of input data */ -#define JPEG_HEADER_OK 1 /* Found valid image datastream */ -#define JPEG_HEADER_TABLES_ONLY 2 /* Found valid table-specs-only datastream */ -/* If you pass require_image = TRUE (normal case), you need not check for - * a TABLES_ONLY return code; an abbreviated file will cause an error exit. - * JPEG_SUSPENDED is only possible if you use a data source module that can - * give a suspension return (the stdio source module doesn't). - */ - -/* Main entry points for decompression */ -EXTERN(boolean) jpeg_start_decompress JPP((j_decompress_ptr cinfo)); -EXTERN(JDIMENSION) jpeg_read_scanlines JPP((j_decompress_ptr cinfo, - JSAMPARRAY scanlines, - JDIMENSION max_lines)); -EXTERN(boolean) jpeg_finish_decompress JPP((j_decompress_ptr cinfo)); - -/* Replaces jpeg_read_scanlines when reading raw downsampled data. */ -EXTERN(JDIMENSION) jpeg_read_raw_data JPP((j_decompress_ptr cinfo, - JSAMPIMAGE data, - JDIMENSION max_lines)); - -/* Additional entry points for buffered-image mode. */ -EXTERN(boolean) jpeg_has_multiple_scans JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_start_output JPP((j_decompress_ptr cinfo, - int scan_number)); -EXTERN(boolean) jpeg_finish_output JPP((j_decompress_ptr cinfo)); -EXTERN(boolean) jpeg_input_complete JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_new_colormap JPP((j_decompress_ptr cinfo)); -EXTERN(int) jpeg_consume_input JPP((j_decompress_ptr cinfo)); -/* Return value is one of: */ -/* #define JPEG_SUSPENDED 0 Suspended due to lack of input data */ -#define JPEG_REACHED_SOS 1 /* Reached start of new scan */ -#define JPEG_REACHED_EOI 2 /* Reached end of image */ -#define JPEG_ROW_COMPLETED 3 /* Completed one iMCU row */ -#define JPEG_SCAN_COMPLETED 4 /* Completed last iMCU row of a scan */ - -/* Precalculate output dimensions for current decompression parameters. */ -EXTERN(void) jpeg_calc_output_dimensions JPP((j_decompress_ptr cinfo)); - -/* Control saving of COM and APPn markers into marker_list. */ -EXTERN(void) jpeg_save_markers - JPP((j_decompress_ptr cinfo, int marker_code, - unsigned int length_limit)); - -/* Install a special processing method for COM or APPn markers. */ -EXTERN(void) jpeg_set_marker_processor - JPP((j_decompress_ptr cinfo, int marker_code, - jpeg_marker_parser_method routine)); - -/* Read or write raw DCT coefficients --- useful for lossless transcoding. */ -EXTERN(jvirt_barray_ptr *) jpeg_read_coefficients JPP((j_decompress_ptr cinfo)); -EXTERN(void) jpeg_write_coefficients JPP((j_compress_ptr cinfo, - jvirt_barray_ptr * coef_arrays)); -EXTERN(void) jpeg_copy_critical_parameters JPP((j_decompress_ptr srcinfo, - j_compress_ptr dstinfo)); - -/* If you choose to abort compression or decompression before completing - * jpeg_finish_(de)compress, then you need to clean up to release memory, - * temporary files, etc. You can just call jpeg_destroy_(de)compress - * if you're done with the JPEG object, but if you want to clean it up and - * reuse it, call this: - */ -EXTERN(void) jpeg_abort_compress JPP((j_compress_ptr cinfo)); -EXTERN(void) jpeg_abort_decompress JPP((j_decompress_ptr cinfo)); - -/* Generic versions of jpeg_abort and jpeg_destroy that work on either - * flavor of JPEG object. These may be more convenient in some places. - */ -EXTERN(void) jpeg_abort JPP((j_common_ptr cinfo)); -EXTERN(void) jpeg_destroy JPP((j_common_ptr cinfo)); - -/* Default restart-marker-resync procedure for use by data source modules */ -EXTERN(boolean) jpeg_resync_to_restart JPP((j_decompress_ptr cinfo, - int desired)); - - -/* These marker codes are exported since applications and data source modules - * are likely to want to use them. - */ - -#define JPEG_RST0 0xD0 /* RST0 marker code */ -#define JPEG_EOI 0xD9 /* EOI marker code */ -#define JPEG_APP0 0xE0 /* APP0 marker code */ -#define JPEG_COM 0xFE /* COM marker code */ - - -/* If we have a brain-damaged compiler that emits warnings (or worse, errors) - * for structure definitions that are never filled in, keep it quiet by - * supplying dummy definitions for the various substructures. - */ - -#ifdef INCOMPLETE_TYPES_BROKEN -#ifndef JPEG_INTERNALS /* will be defined in jpegint.h */ -struct jvirt_sarray_control { long dummy; }; -struct jvirt_barray_control { long dummy; }; -struct jpeg_comp_master { long dummy; }; -struct jpeg_c_main_controller { long dummy; }; -struct jpeg_c_prep_controller { long dummy; }; -struct jpeg_c_coef_controller { long dummy; }; -struct jpeg_marker_writer { long dummy; }; -struct jpeg_color_converter { long dummy; }; -struct jpeg_downsampler { long dummy; }; -struct jpeg_forward_dct { long dummy; }; -struct jpeg_entropy_encoder { long dummy; }; -struct jpeg_decomp_master { long dummy; }; -struct jpeg_d_main_controller { long dummy; }; -struct jpeg_d_coef_controller { long dummy; }; -struct jpeg_d_post_controller { long dummy; }; -struct jpeg_input_controller { long dummy; }; -struct jpeg_marker_reader { long dummy; }; -struct jpeg_entropy_decoder { long dummy; }; -struct jpeg_inverse_dct { long dummy; }; -struct jpeg_upsampler { long dummy; }; -struct jpeg_color_deconverter { long dummy; }; -struct jpeg_color_quantizer { long dummy; }; -#endif /* JPEG_INTERNALS */ -#endif /* INCOMPLETE_TYPES_BROKEN */ - - -/* - * The JPEG library modules define JPEG_INTERNALS before including this file. - * The internal structure declarations are read only when that is true. - * Applications using the library should not include jpegint.h, but may wish - * to include jerror.h. - */ - -#ifdef JPEG_INTERNALS -#include "jpegint.h" /* fetch private declarations */ -#include "jerror.h" /* fetch error codes too */ -#endif - -#endif /* JPEGLIB_H */ diff --git a/Utilities/CAI/cai_dll/inc/jversion.h b/Utilities/CAI/cai_dll/inc/jversion.h deleted file mode 100755 index b903be7d46..0000000000 --- a/Utilities/CAI/cai_dll/inc/jversion.h +++ /dev/null @@ -1,14 +0,0 @@ -/* - * jversion.h - * - * Copyright (C) 1991-1996, Thomas G. Lane. - * This file is part of the Independent JPEG Group's software. - * For conditions of distribution and use, see the accompanying README file. - * - * This file contains software version identification. - */ - - -#define JVERSION "6a 7-Feb-96" - -#define JCOPYRIGHT "Copyright (C) 1996, Thomas G. Lane" diff --git a/Utilities/CAI/cai_dll/inc/machdep.h b/Utilities/CAI/cai_dll/inc/machdep.h deleted file mode 100755 index 055749fc48..0000000000 --- a/Utilities/CAI/cai_dll/inc/machdep.h +++ /dev/null @@ -1,258 +0,0 @@ -/* $Header: machdep.h,v 1.1 96/07/15 15:06:52 cmf Exp $ */ - -/* - * Copyright (c) 1988, 1989, 1990, 1991 Sam Leffler - * Copyright (c) 1991 Silicon Graphics, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, provided - * that (i) the above copyright notices and this permission notice appear in - * all copies of the software and related documentation, and (ii) the names of - * Sam Leffler and Silicon Graphics may not be used in any advertising or - * publicity relating to the software without the specific, prior written - * permission of Sam Leffler and Silicon Graphics. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR - * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, - * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF - * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - -#ifndef _MACHDEP_ -#define _MACHDEP_ -/* - * Machine dependent definitions: - * o floating point formats - * o byte ordering - * - * NB, there are lots of assumptions here: - * - 32-bit natural integers (sign extension code) - * - native float is 4 bytes (floating point conversion) - * - native double is 8 bytes (floating point conversion) - */ - -#if defined(sun) || defined(sparc) || defined(stellar) || defined(MIPSEB) || defined(hpux) || defined(apollo) || defined(NeXT) || defined(_IBMR2) -#define BIGENDIAN 1 -#define IEEEFP -#endif /* sun || sparc || stellar || MIPSEB || hpux || apollo || NeXT || _IBMR2 */ - -/* MIPSEL = MIPS w/ Little Endian byte ordering (e.g. DEC 3100) */ -#if defined(MIPSEL) -#define BIGENDIAN 0 -#define IEEEFP -#endif /* MIPSEL */ - -#ifdef transputer -#define BIGENDIAN 0 -#define IEEEFP /* IEEE floating point supported */ -#endif /* transputer */ - -#if defined(m386) || defined(M_I86) || defined(i386) -#define BIGENDIAN 0 -#define IEEEFP /* IEEE floating point supported */ -#endif /* m386 || M_I86 || i386 */ - -#ifdef IEEEFP -typedef struct ieeedouble nativedouble; -typedef struct ieeefloat nativefloat; -#define ISFRACTION(e) (1022 - 4 <= (e) && (e) <= 1022 + 15) -#define EXTRACTFRACTION(dp, fract) \ - ((fract) = ((unsigned long)(1<<31)|((dp)->native.mant<<11)|\ - ((dp)->native.mant2>>21)) >> (1022+16-(dp)->native.exp)) -#define EXTRACTEXPONENT(dp, exponent) ((exponent) = (dp)->native.exp) -#define NATIVE2IEEEFLOAT(fp) -#define IEEEFLOAT2NATIVE(fp) -#define IEEEDOUBLE2NATIVE(dp) - -#define TIFFSwabArrayOfFloat(fp,n) TIFFSwabArrayOfLong((unsigned long *)fp,n) -#define TIFFSwabArrayOfDouble(dp,n) TIFFSwabArrayOfLong((unsigned long *)dp,2*n) -#endif /* IEEEFP */ - -#ifdef tahoe -#define BIGENDIAN 1 - -typedef struct { - unsigned sign:1; - unsigned exp:8; - unsigned mant:23; - unsigned mant2; -} nativedouble; -typedef struct { - unsigned sign:1; - unsigned exp:8; - unsigned mant:23; -} nativefloat; -#define ISFRACTION(e) (128 - 4 <= (e) && (e) <= 128 + 15) -#define EXTRACTFRACTION(dp, fract) \ - ((fract) = ((1<<31)|((dp)->native.mant<<8)|((dp)->native.mant2>>15)) >> \ - (128+16-(dp)->native.exp)) -#define EXTRACTEXPONENT(dp, exponent) ((exponent) = (dp)->native.exp - 2) -/* - * Beware, over/under-flow in conversions will - * result in garbage values -- handling it would - * require a subroutine call or lots more code. - */ -#define NATIVE2IEEEFLOAT(fp) { \ - if ((fp)->native.exp) \ - (fp)->ieee.exp = (fp)->native.exp - 129 + 127; /* alter bias */\ -} -#define IEEEFLOAT2NATIVE(fp) { \ - if ((fp)->ieee.exp) \ - (fp)->native.exp = (fp)->ieee.exp - 127 + 129; /* alter bias */\ -} -#define IEEEDOUBLE2NATIVE(dp) { \ - if ((dp)->native.exp = (dp)->ieee.exp) \ - (dp)->native.exp += -1023 + 129; \ - (dp)->native.mant = ((dp)->ieee.mant<<3)|((dp)->native.mant2>>29); \ - (dp)->native.mant2 <<= 3; \ -} -/* the following is to work around a compiler bug... */ -#define SIGNEXTEND(a,b) { char ch; ch = (a); (b) = ch; } - -#define TIFFSwabArrayOfFloat(fp,n) TIFFSwabArrayOfLong((unsigned long *)fp,n) -#define TIFFSwabArrayOfDouble(dp,n) TIFFSwabArrayOfLong((unsigned long *)dp,2*n) -#endif /* tahoe */ - -#ifdef vax -#define BIGENDIAN 0 - -typedef struct { - unsigned mant1:7; - unsigned exp:8; - unsigned sign:1; - unsigned mant2:16; - unsigned mant3; -} nativedouble; -typedef struct { - unsigned mant1:7; - unsigned exp:8; - unsigned sign:1; - unsigned mant2:16; -} nativefloat; -#define ISFRACTION(e) (128 - 4 <= (e) && (e) <= 128 + 15) -#define EXTRACTFRACTION(dp, fract) \ - ((fract) = ((1<<31)|((dp)->native.mant1<<16)|(dp)->native.mant2)) >> \ - (128+16-(dp)->native.exp)) -#define EXTRACTEXPONENT(dp, exponent) ((exponent) = (dp)->native.exp - 2) -/* - * Beware, these do not handle over/under-flow - * during conversion from ieee to native format. - */ -#define NATIVE2IEEEFLOAT(fp) { \ - float_t t; \ - if (t.ieee.exp = (fp)->native.exp) \ - t.ieee.exp += -129 + 127; \ - t.ieee.sign = (fp)->native.sign; \ - t.ieee.mant = ((fp)->native.mant1<<16)|(fp)->native.mant2; \ - *(fp) = t; \ -} -#define IEEEFLOAT2NATIVE(fp) { \ - float_t t; int v = (fp)->ieee.exp; \ - if (v) v += -127 + 129; /* alter bias of exponent */\ - t.native.exp = v; /* implicit truncation of exponent */\ - t.native.sign = (fp)->ieee.sign; \ - v = (fp)->ieee.mant; \ - t.native.mant1 = v >> 16; \ - t.native.mant2 = v;\ - *(fp) = v; \ -} -#define IEEEDOUBLE2NATIVE(dp) { \ - double_t t; int v = (dp)->ieee.exp; \ - if (v) v += -1023 + 129; /* if can alter bias of exponent */\ - t.native.exp = v; /* implicit truncation of exponent */\ - v = (dp)->ieee.mant; \ - t.native.sign = (dp)->ieee.sign; \ - t.native.mant1 = v >> 16; \ - t.native.mant2 = v;\ - t.native.mant3 = (dp)->mant2; \ - *(dp) = t; \ -} - -#define TIFFSwabArrayOfFloat(fp,n) TIFFSwabArrayOfLong((unsigned long *)fp,n) -#define TIFFSwabArrayOfDouble(dp,n) TIFFSwabArrayOfLong((unsigned long *)dp,2*n) -#endif /* vax */ - -/* - * These unions are used during floating point - * conversions. The macros given above define - * the conversion operations. - */ - -typedef struct ieeedouble { -#if BIGENDIAN == 1 -#if !defined(_IBMR2) - unsigned sign:1; - unsigned exp:11; - unsigned long mant:20; - unsigned mant2; -#else /* _IBMR2 */ - unsigned sign:1; - unsigned exp:11; - unsigned mant:20; - unsigned mant2; -#endif /* _IBMR2 */ -#else -#if !defined(vax) -#ifdef INT_16_BIT /* MSDOS C compilers */ - unsigned long mant2; - unsigned long mant:20; - unsigned long exp:11; - unsigned long sign:1; -#else /* 32 bit ints */ - unsigned mant2; - unsigned long mant:20; - unsigned exp:11; - unsigned sign:1; -#endif /* 32 bit ints */ -#else - unsigned long mant:20; - unsigned exp:11; - unsigned sign:1; - unsigned mant2; -#endif /* !vax */ -#endif -} ieeedouble; -typedef struct ieeefloat { -#if BIGENDIAN == 1 -#if !defined(_IBMR2) - unsigned sign:1; - unsigned exp:8; - unsigned long mant:23; -#else /* _IBMR2 */ - unsigned sign:1; - unsigned exp:8; - unsigned mant:23; -#endif /* _IBMR2 */ -#else -#ifdef INT_16_BIT /* MSDOS C compilers */ - unsigned long mant:23; - unsigned long exp:8; - unsigned long sign:1; -#else /* 32 bit ints */ - unsigned long mant:23; - unsigned exp:8; - unsigned sign:1; -#endif /* 32 bit ints */ -#endif -} ieeefloat; - -typedef union { - ieeedouble ieee; - nativedouble native; - char b[8]; - double d; -} double_t; - -typedef union { - ieeefloat ieee; - nativefloat native; - char b[4]; - float f; -} float_t; -#endif /* _MACHDEP_ */ diff --git a/Utilities/CAI/cai_dll/inc/port.h b/Utilities/CAI/cai_dll/inc/port.h deleted file mode 100755 index 806bedfa6b..0000000000 --- a/Utilities/CAI/cai_dll/inc/port.h +++ /dev/null @@ -1,32 +0,0 @@ -/* - * Warning, this file was automatically created by the TIFF configure script - * VERSION: v3.5.5 - * DATE: Fri Oct 6 16:24:03 MET DST 2000 - * TARGET: sparc-sun-solaris2.7 - * CCOMPILER: /usr/local/bin/gcc-2.95.2 19991024 (release) - */ -#ifndef _PORT_ -#define _PORT_ 1 -#ifdef __cplusplus -extern "C" { -#endif -#include <sys/types.h> -#define HOST_FILLORDER FILLORDER_MSB2LSB -#define HOST_BIGENDIAN 1 -#define HAVE_MMAP 1 -#include <stdio.h> -#include <unistd.h> -#include <string.h> -#include <stdlib.h> -#include <fcntl.h> -typedef double dblparam_t; -#ifdef __STRICT_ANSI__ -#define INLINE __inline__ -#else -#define INLINE inline -#endif -#define GLOBALDATA(TYPE,NAME) extern TYPE NAME -#ifdef __cplusplus -} -#endif -#endif diff --git a/Utilities/CAI/cai_dll/inc/t4.h b/Utilities/CAI/cai_dll/inc/t4.h deleted file mode 100755 index fa4f5f75d0..0000000000 --- a/Utilities/CAI/cai_dll/inc/t4.h +++ /dev/null @@ -1,285 +0,0 @@ -/* $Id$ */ - -/* - * Copyright (c) 1988-1997 Sam Leffler - * Copyright (c) 1991-1997 Silicon Graphics, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, provided - * that (i) the above copyright notices and this permission notice appear in - * all copies of the software and related documentation, and (ii) the names of - * Sam Leffler and Silicon Graphics may not be used in any advertising or - * publicity relating to the software without the specific, prior written - * permission of Sam Leffler and Silicon Graphics. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR - * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, - * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF - * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - -#ifndef _T4_ -#define _T4_ -/* - * CCITT T.4 1D Huffman runlength codes and - * related definitions. Given the small sizes - * of these tables it does not seem - * worthwhile to make code & length 8 bits. - */ -typedef struct tableentry { - unsigned short length; /* bit length of g3 code */ - unsigned short code; /* g3 code */ - short runlen; /* run length in bits */ -} tableentry; - -#define EOL 0x001 /* EOL code value - 0000 0000 0000 1 */ - -/* status values returned instead of a run length */ -#define G3CODE_EOL -1 /* NB: ACT_EOL - ACT_WRUNT */ -#define G3CODE_INVALID -2 /* NB: ACT_INVALID - ACT_WRUNT */ -#define G3CODE_EOF -3 /* end of input data */ -#define G3CODE_INCOMP -4 /* incomplete run code */ - -/* - * Note that these tables are ordered such that the - * index into the table is known to be either the - * run length, or (run length / 64) + a fixed offset. - * - * NB: The G3CODE_INVALID entries are only used - * during state generation (see mkg3states.c). - */ -#ifdef G3CODES -const tableentry TIFFFaxWhiteCodes[] = { - { 8, 0x35, 0 }, /* 0011 0101 */ - { 6, 0x7, 1 }, /* 0001 11 */ - { 4, 0x7, 2 }, /* 0111 */ - { 4, 0x8, 3 }, /* 1000 */ - { 4, 0xB, 4 }, /* 1011 */ - { 4, 0xC, 5 }, /* 1100 */ - { 4, 0xE, 6 }, /* 1110 */ - { 4, 0xF, 7 }, /* 1111 */ - { 5, 0x13, 8 }, /* 1001 1 */ - { 5, 0x14, 9 }, /* 1010 0 */ - { 5, 0x7, 10 }, /* 0011 1 */ - { 5, 0x8, 11 }, /* 0100 0 */ - { 6, 0x8, 12 }, /* 0010 00 */ - { 6, 0x3, 13 }, /* 0000 11 */ - { 6, 0x34, 14 }, /* 1101 00 */ - { 6, 0x35, 15 }, /* 1101 01 */ - { 6, 0x2A, 16 }, /* 1010 10 */ - { 6, 0x2B, 17 }, /* 1010 11 */ - { 7, 0x27, 18 }, /* 0100 111 */ - { 7, 0xC, 19 }, /* 0001 100 */ - { 7, 0x8, 20 }, /* 0001 000 */ - { 7, 0x17, 21 }, /* 0010 111 */ - { 7, 0x3, 22 }, /* 0000 011 */ - { 7, 0x4, 23 }, /* 0000 100 */ - { 7, 0x28, 24 }, /* 0101 000 */ - { 7, 0x2B, 25 }, /* 0101 011 */ - { 7, 0x13, 26 }, /* 0010 011 */ - { 7, 0x24, 27 }, /* 0100 100 */ - { 7, 0x18, 28 }, /* 0011 000 */ - { 8, 0x2, 29 }, /* 0000 0010 */ - { 8, 0x3, 30 }, /* 0000 0011 */ - { 8, 0x1A, 31 }, /* 0001 1010 */ - { 8, 0x1B, 32 }, /* 0001 1011 */ - { 8, 0x12, 33 }, /* 0001 0010 */ - { 8, 0x13, 34 }, /* 0001 0011 */ - { 8, 0x14, 35 }, /* 0001 0100 */ - { 8, 0x15, 36 }, /* 0001 0101 */ - { 8, 0x16, 37 }, /* 0001 0110 */ - { 8, 0x17, 38 }, /* 0001 0111 */ - { 8, 0x28, 39 }, /* 0010 1000 */ - { 8, 0x29, 40 }, /* 0010 1001 */ - { 8, 0x2A, 41 }, /* 0010 1010 */ - { 8, 0x2B, 42 }, /* 0010 1011 */ - { 8, 0x2C, 43 }, /* 0010 1100 */ - { 8, 0x2D, 44 }, /* 0010 1101 */ - { 8, 0x4, 45 }, /* 0000 0100 */ - { 8, 0x5, 46 }, /* 0000 0101 */ - { 8, 0xA, 47 }, /* 0000 1010 */ - { 8, 0xB, 48 }, /* 0000 1011 */ - { 8, 0x52, 49 }, /* 0101 0010 */ - { 8, 0x53, 50 }, /* 0101 0011 */ - { 8, 0x54, 51 }, /* 0101 0100 */ - { 8, 0x55, 52 }, /* 0101 0101 */ - { 8, 0x24, 53 }, /* 0010 0100 */ - { 8, 0x25, 54 }, /* 0010 0101 */ - { 8, 0x58, 55 }, /* 0101 1000 */ - { 8, 0x59, 56 }, /* 0101 1001 */ - { 8, 0x5A, 57 }, /* 0101 1010 */ - { 8, 0x5B, 58 }, /* 0101 1011 */ - { 8, 0x4A, 59 }, /* 0100 1010 */ - { 8, 0x4B, 60 }, /* 0100 1011 */ - { 8, 0x32, 61 }, /* 0011 0010 */ - { 8, 0x33, 62 }, /* 0011 0011 */ - { 8, 0x34, 63 }, /* 0011 0100 */ - { 5, 0x1B, 64 }, /* 1101 1 */ - { 5, 0x12, 128 }, /* 1001 0 */ - { 6, 0x17, 192 }, /* 0101 11 */ - { 7, 0x37, 256 }, /* 0110 111 */ - { 8, 0x36, 320 }, /* 0011 0110 */ - { 8, 0x37, 384 }, /* 0011 0111 */ - { 8, 0x64, 448 }, /* 0110 0100 */ - { 8, 0x65, 512 }, /* 0110 0101 */ - { 8, 0x68, 576 }, /* 0110 1000 */ - { 8, 0x67, 640 }, /* 0110 0111 */ - { 9, 0xCC, 704 }, /* 0110 0110 0 */ - { 9, 0xCD, 768 }, /* 0110 0110 1 */ - { 9, 0xD2, 832 }, /* 0110 1001 0 */ - { 9, 0xD3, 896 }, /* 0110 1001 1 */ - { 9, 0xD4, 960 }, /* 0110 1010 0 */ - { 9, 0xD5, 1024 }, /* 0110 1010 1 */ - { 9, 0xD6, 1088 }, /* 0110 1011 0 */ - { 9, 0xD7, 1152 }, /* 0110 1011 1 */ - { 9, 0xD8, 1216 }, /* 0110 1100 0 */ - { 9, 0xD9, 1280 }, /* 0110 1100 1 */ - { 9, 0xDA, 1344 }, /* 0110 1101 0 */ - { 9, 0xDB, 1408 }, /* 0110 1101 1 */ - { 9, 0x98, 1472 }, /* 0100 1100 0 */ - { 9, 0x99, 1536 }, /* 0100 1100 1 */ - { 9, 0x9A, 1600 }, /* 0100 1101 0 */ - { 6, 0x18, 1664 }, /* 0110 00 */ - { 9, 0x9B, 1728 }, /* 0100 1101 1 */ - { 11, 0x8, 1792 }, /* 0000 0001 000 */ - { 11, 0xC, 1856 }, /* 0000 0001 100 */ - { 11, 0xD, 1920 }, /* 0000 0001 101 */ - { 12, 0x12, 1984 }, /* 0000 0001 0010 */ - { 12, 0x13, 2048 }, /* 0000 0001 0011 */ - { 12, 0x14, 2112 }, /* 0000 0001 0100 */ - { 12, 0x15, 2176 }, /* 0000 0001 0101 */ - { 12, 0x16, 2240 }, /* 0000 0001 0110 */ - { 12, 0x17, 2304 }, /* 0000 0001 0111 */ - { 12, 0x1C, 2368 }, /* 0000 0001 1100 */ - { 12, 0x1D, 2432 }, /* 0000 0001 1101 */ - { 12, 0x1E, 2496 }, /* 0000 0001 1110 */ - { 12, 0x1F, 2560 }, /* 0000 0001 1111 */ - { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */ - { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */ - { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */ - { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */ - { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */ -}; - -const tableentry TIFFFaxBlackCodes[] = { - { 10, 0x37, 0 }, /* 0000 1101 11 */ - { 3, 0x2, 1 }, /* 010 */ - { 2, 0x3, 2 }, /* 11 */ - { 2, 0x2, 3 }, /* 10 */ - { 3, 0x3, 4 }, /* 011 */ - { 4, 0x3, 5 }, /* 0011 */ - { 4, 0x2, 6 }, /* 0010 */ - { 5, 0x3, 7 }, /* 0001 1 */ - { 6, 0x5, 8 }, /* 0001 01 */ - { 6, 0x4, 9 }, /* 0001 00 */ - { 7, 0x4, 10 }, /* 0000 100 */ - { 7, 0x5, 11 }, /* 0000 101 */ - { 7, 0x7, 12 }, /* 0000 111 */ - { 8, 0x4, 13 }, /* 0000 0100 */ - { 8, 0x7, 14 }, /* 0000 0111 */ - { 9, 0x18, 15 }, /* 0000 1100 0 */ - { 10, 0x17, 16 }, /* 0000 0101 11 */ - { 10, 0x18, 17 }, /* 0000 0110 00 */ - { 10, 0x8, 18 }, /* 0000 0010 00 */ - { 11, 0x67, 19 }, /* 0000 1100 111 */ - { 11, 0x68, 20 }, /* 0000 1101 000 */ - { 11, 0x6C, 21 }, /* 0000 1101 100 */ - { 11, 0x37, 22 }, /* 0000 0110 111 */ - { 11, 0x28, 23 }, /* 0000 0101 000 */ - { 11, 0x17, 24 }, /* 0000 0010 111 */ - { 11, 0x18, 25 }, /* 0000 0011 000 */ - { 12, 0xCA, 26 }, /* 0000 1100 1010 */ - { 12, 0xCB, 27 }, /* 0000 1100 1011 */ - { 12, 0xCC, 28 }, /* 0000 1100 1100 */ - { 12, 0xCD, 29 }, /* 0000 1100 1101 */ - { 12, 0x68, 30 }, /* 0000 0110 1000 */ - { 12, 0x69, 31 }, /* 0000 0110 1001 */ - { 12, 0x6A, 32 }, /* 0000 0110 1010 */ - { 12, 0x6B, 33 }, /* 0000 0110 1011 */ - { 12, 0xD2, 34 }, /* 0000 1101 0010 */ - { 12, 0xD3, 35 }, /* 0000 1101 0011 */ - { 12, 0xD4, 36 }, /* 0000 1101 0100 */ - { 12, 0xD5, 37 }, /* 0000 1101 0101 */ - { 12, 0xD6, 38 }, /* 0000 1101 0110 */ - { 12, 0xD7, 39 }, /* 0000 1101 0111 */ - { 12, 0x6C, 40 }, /* 0000 0110 1100 */ - { 12, 0x6D, 41 }, /* 0000 0110 1101 */ - { 12, 0xDA, 42 }, /* 0000 1101 1010 */ - { 12, 0xDB, 43 }, /* 0000 1101 1011 */ - { 12, 0x54, 44 }, /* 0000 0101 0100 */ - { 12, 0x55, 45 }, /* 0000 0101 0101 */ - { 12, 0x56, 46 }, /* 0000 0101 0110 */ - { 12, 0x57, 47 }, /* 0000 0101 0111 */ - { 12, 0x64, 48 }, /* 0000 0110 0100 */ - { 12, 0x65, 49 }, /* 0000 0110 0101 */ - { 12, 0x52, 50 }, /* 0000 0101 0010 */ - { 12, 0x53, 51 }, /* 0000 0101 0011 */ - { 12, 0x24, 52 }, /* 0000 0010 0100 */ - { 12, 0x37, 53 }, /* 0000 0011 0111 */ - { 12, 0x38, 54 }, /* 0000 0011 1000 */ - { 12, 0x27, 55 }, /* 0000 0010 0111 */ - { 12, 0x28, 56 }, /* 0000 0010 1000 */ - { 12, 0x58, 57 }, /* 0000 0101 1000 */ - { 12, 0x59, 58 }, /* 0000 0101 1001 */ - { 12, 0x2B, 59 }, /* 0000 0010 1011 */ - { 12, 0x2C, 60 }, /* 0000 0010 1100 */ - { 12, 0x5A, 61 }, /* 0000 0101 1010 */ - { 12, 0x66, 62 }, /* 0000 0110 0110 */ - { 12, 0x67, 63 }, /* 0000 0110 0111 */ - { 10, 0xF, 64 }, /* 0000 0011 11 */ - { 12, 0xC8, 128 }, /* 0000 1100 1000 */ - { 12, 0xC9, 192 }, /* 0000 1100 1001 */ - { 12, 0x5B, 256 }, /* 0000 0101 1011 */ - { 12, 0x33, 320 }, /* 0000 0011 0011 */ - { 12, 0x34, 384 }, /* 0000 0011 0100 */ - { 12, 0x35, 448 }, /* 0000 0011 0101 */ - { 13, 0x6C, 512 }, /* 0000 0011 0110 0 */ - { 13, 0x6D, 576 }, /* 0000 0011 0110 1 */ - { 13, 0x4A, 640 }, /* 0000 0010 0101 0 */ - { 13, 0x4B, 704 }, /* 0000 0010 0101 1 */ - { 13, 0x4C, 768 }, /* 0000 0010 0110 0 */ - { 13, 0x4D, 832 }, /* 0000 0010 0110 1 */ - { 13, 0x72, 896 }, /* 0000 0011 1001 0 */ - { 13, 0x73, 960 }, /* 0000 0011 1001 1 */ - { 13, 0x74, 1024 }, /* 0000 0011 1010 0 */ - { 13, 0x75, 1088 }, /* 0000 0011 1010 1 */ - { 13, 0x76, 1152 }, /* 0000 0011 1011 0 */ - { 13, 0x77, 1216 }, /* 0000 0011 1011 1 */ - { 13, 0x52, 1280 }, /* 0000 0010 1001 0 */ - { 13, 0x53, 1344 }, /* 0000 0010 1001 1 */ - { 13, 0x54, 1408 }, /* 0000 0010 1010 0 */ - { 13, 0x55, 1472 }, /* 0000 0010 1010 1 */ - { 13, 0x5A, 1536 }, /* 0000 0010 1101 0 */ - { 13, 0x5B, 1600 }, /* 0000 0010 1101 1 */ - { 13, 0x64, 1664 }, /* 0000 0011 0010 0 */ - { 13, 0x65, 1728 }, /* 0000 0011 0010 1 */ - { 11, 0x8, 1792 }, /* 0000 0001 000 */ - { 11, 0xC, 1856 }, /* 0000 0001 100 */ - { 11, 0xD, 1920 }, /* 0000 0001 101 */ - { 12, 0x12, 1984 }, /* 0000 0001 0010 */ - { 12, 0x13, 2048 }, /* 0000 0001 0011 */ - { 12, 0x14, 2112 }, /* 0000 0001 0100 */ - { 12, 0x15, 2176 }, /* 0000 0001 0101 */ - { 12, 0x16, 2240 }, /* 0000 0001 0110 */ - { 12, 0x17, 2304 }, /* 0000 0001 0111 */ - { 12, 0x1C, 2368 }, /* 0000 0001 1100 */ - { 12, 0x1D, 2432 }, /* 0000 0001 1101 */ - { 12, 0x1E, 2496 }, /* 0000 0001 1110 */ - { 12, 0x1F, 2560 }, /* 0000 0001 1111 */ - { 12, 0x1, G3CODE_EOL }, /* 0000 0000 0001 */ - { 9, 0x1, G3CODE_INVALID }, /* 0000 0000 1 */ - { 10, 0x1, G3CODE_INVALID }, /* 0000 0000 01 */ - { 11, 0x1, G3CODE_INVALID }, /* 0000 0000 001 */ - { 12, 0x0, G3CODE_INVALID }, /* 0000 0000 0000 */ -}; -#else -extern const tableentry TIFFFaxWhiteCodes[]; -extern const tableentry TIFFFaxBlackCodes[]; -#endif -#endif /* _T4_ */ diff --git a/Utilities/CAI/cai_dll/inc/tif_dir.h b/Utilities/CAI/cai_dll/inc/tif_dir.h deleted file mode 100755 index 59c671a123..0000000000 --- a/Utilities/CAI/cai_dll/inc/tif_dir.h +++ /dev/null @@ -1,268 +0,0 @@ -/* $Header: tif_dir.h,v 1.1 01/01/15 15:24:36 cmf Exp $ */ - -/* - * Copyright (c) 1988-1997 Sam Leffler - * Copyright (c) 1991-1997 Silicon Graphics, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, provided - * that (i) the above copyright notices and this permission notice appear in - * all copies of the software and related documentation, and (ii) the names of - * Sam Leffler and Silicon Graphics may not be used in any advertising or - * publicity relating to the software without the specific, prior written - * permission of Sam Leffler and Silicon Graphics. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR - * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, - * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF - * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - -#ifndef _TIFFDIR_ -#define _TIFFDIR_ -/* - * ``Library-private'' Directory-related Definitions. - */ - -/* - * Internal format of a TIFF directory entry. - */ -typedef struct { -#define FIELD_SETLONGS 3 - /* bit vector of fields that are set */ - u_long td_fieldsset[FIELD_SETLONGS]; - - uint32 td_imagewidth, td_imagelength, td_imagedepth; - uint32 td_tilewidth, td_tilelength, td_tiledepth; - uint32 td_subfiletype; - uint16 td_bitspersample; - uint16 td_sampleformat; - uint16 td_compression; - uint16 td_photometric; - uint16 td_threshholding; - uint16 td_fillorder; - uint16 td_orientation; - uint16 td_samplesperpixel; - uint32 td_rowsperstrip; - uint16 td_minsamplevalue, td_maxsamplevalue; - double td_sminsamplevalue, td_smaxsamplevalue; - float td_xresolution, td_yresolution; - uint16 td_resolutionunit; - uint16 td_planarconfig; - float td_xposition, td_yposition; - uint16 td_pagenumber[2]; - uint16* td_colormap[3]; - uint16 td_halftonehints[2]; - uint16 td_extrasamples; - uint16* td_sampleinfo; - double td_stonits; - char* td_documentname; - char* td_artist; - char* td_datetime; - char* td_hostcomputer; - char* td_imagedescription; - char* td_make; - char* td_model; - char* td_software; - char* td_pagename; - tstrip_t td_stripsperimage; - tstrip_t td_nstrips; /* size of offset & bytecount arrays */ - uint32* td_stripoffset; - uint32* td_stripbytecount; -#if SUBIFD_SUPPORT - uint16 td_nsubifd; - uint32* td_subifd; -#endif -#ifdef YCBCR_SUPPORT - float* td_ycbcrcoeffs; - uint16 td_ycbcrsubsampling[2]; - uint16 td_ycbcrpositioning; -#endif -#ifdef COLORIMETRY_SUPPORT - float* td_whitepoint; - float* td_primarychromas; - float* td_refblackwhite; - uint16* td_transferfunction[3]; -#endif -#ifdef CMYK_SUPPORT - uint16 td_inkset; - uint16 td_ninks; - uint16 td_dotrange[2]; - int td_inknameslen; - char* td_inknames; - char* td_targetprinter; -#endif -#ifdef ICC_SUPPORT - uint32 td_profileLength; - void *td_profileData; -#endif -#ifdef PHOTOSHOP_SUPPORT - uint32 td_photoshopLength; - void *td_photoshopData; -#endif -#ifdef IPTC_SUPPORT - uint32 td_richtiffiptcLength; - void *td_richtiffiptcData; -#endif - /* Begin Pixar Tag values. */ - uint32 td_imagefullwidth, td_imagefulllength; - char* td_textureformat; - char* td_wrapmodes; - float td_fovcot; - float* td_matrixWorldToScreen; - float* td_matrixWorldToCamera; - /* End Pixar Tag Values. */ -} TIFFDirectory; - -/* - * Field flags used to indicate fields that have - * been set in a directory, and to reference fields - * when manipulating a directory. - */ - -/* - * FIELD_IGNORE is used to signify tags that are to - * be processed but otherwise ignored. This permits - * antiquated tags to be quietly read and discarded. - * Note that a bit *is* allocated for ignored tags; - * this is understood by the directory reading logic - * which uses this fact to avoid special-case handling - */ -#define FIELD_IGNORE 0 - -/* multi-item fields */ -#define FIELD_IMAGEDIMENSIONS 1 -#define FIELD_TILEDIMENSIONS 2 -#define FIELD_RESOLUTION 3 -#define FIELD_POSITION 4 - -/* single-item fields */ -#define FIELD_SUBFILETYPE 5 -#define FIELD_BITSPERSAMPLE 6 -#define FIELD_COMPRESSION 7 -#define FIELD_PHOTOMETRIC 8 -#define FIELD_THRESHHOLDING 9 -#define FIELD_FILLORDER 10 -#define FIELD_DOCUMENTNAME 11 -#define FIELD_IMAGEDESCRIPTION 12 -#define FIELD_MAKE 13 -#define FIELD_MODEL 14 -#define FIELD_ORIENTATION 15 -#define FIELD_SAMPLESPERPIXEL 16 -#define FIELD_ROWSPERSTRIP 17 -#define FIELD_MINSAMPLEVALUE 18 -#define FIELD_MAXSAMPLEVALUE 19 -#define FIELD_PLANARCONFIG 20 -#define FIELD_PAGENAME 21 -#define FIELD_RESOLUTIONUNIT 22 -#define FIELD_PAGENUMBER 23 -#define FIELD_STRIPBYTECOUNTS 24 -#define FIELD_STRIPOFFSETS 25 -#define FIELD_COLORMAP 26 -#define FIELD_ARTIST 27 -#define FIELD_DATETIME 28 -#define FIELD_HOSTCOMPUTER 29 -#define FIELD_SOFTWARE 30 -#define FIELD_EXTRASAMPLES 31 -#define FIELD_SAMPLEFORMAT 32 -#define FIELD_SMINSAMPLEVALUE 33 -#define FIELD_SMAXSAMPLEVALUE 34 -#define FIELD_IMAGEDEPTH 35 -#define FIELD_TILEDEPTH 36 -#define FIELD_HALFTONEHINTS 37 -#define FIELD_YCBCRCOEFFICIENTS 38 -#define FIELD_YCBCRSUBSAMPLING 39 -#define FIELD_YCBCRPOSITIONING 40 -#define FIELD_REFBLACKWHITE 41 -#define FIELD_WHITEPOINT 42 -#define FIELD_PRIMARYCHROMAS 43 -#define FIELD_TRANSFERFUNCTION 44 -#define FIELD_INKSET 45 -#define FIELD_INKNAMES 46 -#define FIELD_DOTRANGE 47 -#define FIELD_TARGETPRINTER 48 -#define FIELD_SUBIFD 49 -#define FIELD_NUMBEROFINKS 50 -#define FIELD_ICCPROFILE 51 -#define FIELD_PHOTOSHOP 52 -#define FIELD_RICHTIFFIPTC 53 -#define FIELD_STONITS 54 -/* Begin PIXAR */ -#define FIELD_IMAGEFULLWIDTH 55 -#define FIELD_IMAGEFULLLENGTH 56 -#define FIELD_TEXTUREFORMAT 57 -#define FIELD_WRAPMODES 58 -#define FIELD_FOVCOT 59 -#define FIELD_MATRIX_WORLDTOSCREEN 60 -#define FIELD_MATRIX_WORLDTOCAMERA 61 -/* end of support for well-known tags; codec-private tags follow */ -#define FIELD_CODEC 62 /* base of codec-private tags */ -/* - * Pseudo-tags don't normally need field bits since they - * are not written to an output file (by definition). - * The library also has express logic to always query a - * codec for a pseudo-tag so allocating a field bit for - * one is a waste. If codec wants to promote the notion - * of a pseudo-tag being ``set'' or ``unset'' then it can - * do using internal state flags without polluting the - * field bit space defined for real tags. - */ -#define FIELD_PSEUDO 0 - -#define FIELD_LAST (32*FIELD_SETLONGS-1) - -#define TIFFExtractData(tif, type, v) \ - ((uint32) ((tif)->tif_header.tiff_magic == TIFF_BIGENDIAN ? \ - ((v) >> (tif)->tif_typeshift[type]) & (tif)->tif_typemask[type] : \ - (v) & (tif)->tif_typemask[type])) -#define TIFFInsertData(tif, type, v) \ - ((uint32) ((tif)->tif_header.tiff_magic == TIFF_BIGENDIAN ? \ - ((v) & (tif)->tif_typemask[type]) << (tif)->tif_typeshift[type] : \ - (v) & (tif)->tif_typemask[type])) - -typedef struct { - ttag_t field_tag; /* field's tag */ - short field_readcount; /* read count/TIFF_VARIABLE/TIFF_SPP */ - short field_writecount; /* write count/TIFF_VARIABLE */ - TIFFDataType field_type; /* type of associated data */ - u_short field_bit; /* bit in fieldsset bit vector */ - u_char field_oktochange; /* if true, can change while writing */ - u_char field_passcount; /* if true, pass dir count on set */ - char *field_name; /* ASCII name */ -} TIFFFieldInfo; - -#define TIFF_ANY TIFF_NOTYPE /* for field descriptor searching */ -#define TIFF_VARIABLE -1 /* marker for variable length tags */ -#define TIFF_SPP -2 /* marker for SamplesPerPixel tags */ -#define TIFF_VARIABLE2 -3 /* marker for uint32 var-length tags */ - -extern const int tiffDataWidth[]; /* table of tag datatype widths */ - -#define BITn(n) (((u_long)1L)<<((n)&0x1f)) -#define BITFIELDn(tif, n) ((tif)->tif_dir.td_fieldsset[(n)/32]) -#define TIFFFieldSet(tif, field) (BITFIELDn(tif, field) & BITn(field)) -#define TIFFSetFieldBit(tif, field) (BITFIELDn(tif, field) |= BITn(field)) -#define TIFFClrFieldBit(tif, field) (BITFIELDn(tif, field) &= ~BITn(field)) - -#define FieldSet(fields, f) (fields[(f)/32] & BITn(f)) -#define ResetFieldBit(fields, f) (fields[(f)/32] &= ~BITn(f)) - -#if defined(__cplusplus) -extern "C" { -#endif -extern void _TIFFSetupFieldInfo(TIFF*); -extern void _TIFFMergeFieldInfo(TIFF*, const TIFFFieldInfo[], int); -extern void _TIFFPrintFieldInfo(TIFF*, FILE*); -extern const TIFFFieldInfo* _TIFFFindFieldInfo(TIFF*, ttag_t, TIFFDataType); -extern const TIFFFieldInfo* _TIFFFieldWithTag(TIFF*, ttag_t); -extern TIFFDataType _TIFFSampleToTagType(TIFF*); -#if defined(__cplusplus) -} -#endif -#endif /* _TIFFDIR_ */ diff --git a/Utilities/CAI/cai_dll/inc/tif_fax3.h b/Utilities/CAI/cai_dll/inc/tif_fax3.h deleted file mode 100755 index a9f1fcb23b..0000000000 --- a/Utilities/CAI/cai_dll/inc/tif_fax3.h +++ /dev/null @@ -1,522 +0,0 @@ -/* $Id$ */ - -/* - * Copyright (c) 1990-1997 Sam Leffler - * Copyright (c) 1991-1997 Silicon Graphics, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, provided - * that (i) the above copyright notices and this permission notice appear in - * all copies of the software and related documentation, and (ii) the names of - * Sam Leffler and Silicon Graphics may not be used in any advertising or - * publicity relating to the software without the specific, prior written - * permission of Sam Leffler and Silicon Graphics. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR - * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, - * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF - * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - -#ifndef _FAX3_ -#define _FAX3_ -/* - * TIFF Library. - * - * CCITT Group 3 (T.4) and Group 4 (T.6) Decompression Support. - * - * Decoder support is derived, with permission, from the code - * in Frank Cringle's viewfax program; - * Copyright (C) 1990, 1995 Frank D. Cringle. - */ -#include "tiff.h" - -/* - * To override the default routine used to image decoded - * spans one can use the pseduo tag TIFFTAG_FAXFILLFUNC. - * The routine must have the type signature given below; - * for example: - * - * fillruns(unsigned char* buf, uint32* runs, uint32* erun, uint32 lastx) - * - * where buf is place to set the bits, runs is the array of b&w run - * lengths (white then black), erun is the last run in the array, and - * lastx is the width of the row in pixels. Fill routines can assume - * the run array has room for at least lastx runs and can overwrite - * data in the run array as needed (e.g. to append zero runs to bring - * the count up to a nice multiple). - */ -typedef void (*TIFFFaxFillFunc)(unsigned char*, uint32*, uint32*, uint32); - -/* - * The default run filler; made external for other decoders. - */ -#if defined(__cplusplus) -extern "C" { -#endif -extern void _TIFFFax3fillruns(unsigned char*, uint32*, uint32*, uint32); -#if defined(__cplusplus) -} -#endif - - -/* finite state machine codes */ -#define S_Null 0 -#define S_Pass 1 -#define S_Horiz 2 -#define S_V0 3 -#define S_VR 4 -#define S_VL 5 -#define S_Ext 6 -#define S_TermW 7 -#define S_TermB 8 -#define S_MakeUpW 9 -#define S_MakeUpB 10 -#define S_MakeUp 11 -#define S_EOL 12 - -typedef struct { /* state table entry */ - unsigned char State; /* see above */ - unsigned char Width; /* width of code in bits */ - uint32 Param; /* unsigned 32-bit run length in bits */ -} TIFFFaxTabEnt; - -extern const TIFFFaxTabEnt TIFFFaxMainTable[]; -extern const TIFFFaxTabEnt TIFFFaxWhiteTable[]; -extern const TIFFFaxTabEnt TIFFFaxBlackTable[]; - -/* - * The following macros define the majority of the G3/G4 decoder - * algorithm using the state tables defined elsewhere. To build - * a decoder you need some setup code and some glue code. Note - * that you may also need/want to change the way the NeedBits* - * macros get input data if, for example, you know the data to be - * decoded is properly aligned and oriented (doing so before running - * the decoder can be a big performance win). - * - * Consult the decoder in the TIFF library for an idea of what you - * need to define and setup to make use of these definitions. - * - * NB: to enable a debugging version of these macros define FAX3_DEBUG - * before including this file. Trace output goes to stdout. - */ - -#ifndef EndOfData -#define EndOfData() (cp >= ep) -#endif -/* - * Need <=8 or <=16 bits of input data. Unlike viewfax we - * cannot use/assume a word-aligned, properly bit swizzled - * input data set because data may come from an arbitrarily - * aligned, read-only source such as a memory-mapped file. - * Note also that the viewfax decoder does not check for - * running off the end of the input data buffer. This is - * possible for G3-encoded data because it prescans the input - * data to count EOL markers, but can cause problems for G4 - * data. In any event, we don't prescan and must watch for - * running out of data since we can't permit the library to - * scan past the end of the input data buffer. - * - * Finally, note that we must handle remaindered data at the end - * of a strip specially. The coder asks for a fixed number of - * bits when scanning for the next code. This may be more bits - * than are actually present in the data stream. If we appear - * to run out of data but still have some number of valid bits - * remaining then we makeup the requested amount with zeros and - * return successfully. If the returned data is incorrect then - * we should be called again and get a premature EOF error; - * otherwise we should get the right answer. - */ -#ifndef NeedBits8 -#define NeedBits8(n,eoflab) do { \ - if (BitsAvail < (n)) { \ - if (EndOfData()) { \ - if (BitsAvail == 0) /* no valid bits */ \ - goto eoflab; \ - BitsAvail = (n); /* pad with zeros */ \ - } else { \ - BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \ - BitsAvail += 8; \ - } \ - } \ -} while (0) -#endif -#ifndef NeedBits16 -#define NeedBits16(n,eoflab) do { \ - if (BitsAvail < (n)) { \ - if (EndOfData()) { \ - if (BitsAvail == 0) /* no valid bits */ \ - goto eoflab; \ - BitsAvail = (n); /* pad with zeros */ \ - } else { \ - BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \ - if ((BitsAvail += 8) < (n)) { \ - if (EndOfData()) { \ - /* NB: we know BitsAvail is non-zero here */ \ - BitsAvail = (n); /* pad with zeros */ \ - } else { \ - BitAcc |= ((uint32) bitmap[*cp++])<<BitsAvail; \ - BitsAvail += 8; \ - } \ - } \ - } \ - } \ -} while (0) -#endif -#define GetBits(n) (BitAcc & ((1<<(n))-1)) -#define ClrBits(n) do { \ - BitsAvail -= (n); \ - BitAcc >>= (n); \ -} while (0) - -#ifdef FAX3_DEBUG -static const char* StateNames[] = { - "Null ", - "Pass ", - "Horiz ", - "V0 ", - "VR ", - "VL ", - "Ext ", - "TermW ", - "TermB ", - "MakeUpW", - "MakeUpB", - "MakeUp ", - "EOL ", -}; -#define DEBUG_SHOW putchar(BitAcc & (1 << t) ? '1' : '0') -#define LOOKUP8(wid,tab,eoflab) do { \ - int t; \ - NeedBits8(wid,eoflab); \ - TabEnt = tab + GetBits(wid); \ - printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \ - StateNames[TabEnt->State], TabEnt->Param); \ - for (t = 0; t < TabEnt->Width; t++) \ - DEBUG_SHOW; \ - putchar('\n'); \ - fflush(stdout); \ - ClrBits(TabEnt->Width); \ -} while (0) -#define LOOKUP16(wid,tab,eoflab) do { \ - int t; \ - NeedBits16(wid,eoflab); \ - TabEnt = tab + GetBits(wid); \ - printf("%08lX/%d: %s%5d\t", (long) BitAcc, BitsAvail, \ - StateNames[TabEnt->State], TabEnt->Param); \ - for (t = 0; t < TabEnt->Width; t++) \ - DEBUG_SHOW; \ - putchar('\n'); \ - fflush(stdout); \ - ClrBits(TabEnt->Width); \ -} while (0) - -#define SETVAL(x) do { \ - *pa++ = RunLength + (x); \ - printf("SETVAL: %d\t%d\n", RunLength + (x), a0); \ - a0 += x; \ - RunLength = 0; \ -} while (0) -#else -#define LOOKUP8(wid,tab,eoflab) do { \ - NeedBits8(wid,eoflab); \ - TabEnt = tab + GetBits(wid); \ - ClrBits(TabEnt->Width); \ -} while (0) -#define LOOKUP16(wid,tab,eoflab) do { \ - NeedBits16(wid,eoflab); \ - TabEnt = tab + GetBits(wid); \ - ClrBits(TabEnt->Width); \ -} while (0) - -/* - * Append a run to the run length array for the - * current row and reset decoding state. - */ -#define SETVAL(x) do { \ - *pa++ = RunLength + (x); \ - a0 += (x); \ - RunLength = 0; \ -} while (0) -#endif - -/* - * Synchronize input decoding at the start of each - * row by scanning for an EOL (if appropriate) and - * skipping any trash data that might be present - * after a decoding error. Note that the decoding - * done elsewhere that recognizes an EOL only consumes - * 11 consecutive zero bits. This means that if EOLcnt - * is non-zero then we still need to scan for the final flag - * bit that is part of the EOL code. - */ -#define SYNC_EOL(eoflab) do { \ - if (EOLcnt == 0) { \ - for (;;) { \ - NeedBits16(11,eoflab); \ - if (GetBits(11) == 0) \ - break; \ - ClrBits(1); \ - } \ - } \ - for (;;) { \ - NeedBits8(8,eoflab); \ - if (GetBits(8)) \ - break; \ - ClrBits(8); \ - } \ - while (GetBits(1) == 0) \ - ClrBits(1); \ - ClrBits(1); /* EOL bit */ \ - EOLcnt = 0; /* reset EOL counter/flag */ \ -} while (0) - -/* - * Cleanup the array of runs after decoding a row. - * We adjust final runs to insure the user buffer is not - * overwritten and/or undecoded area is white filled. - */ -#define CLEANUP_RUNS() do { \ - if (RunLength) \ - SETVAL(0); \ - if (a0 != lastx) { \ - badlength(a0, lastx); \ - while (a0 > lastx && pa > thisrun) \ - a0 -= *--pa; \ - if (a0 < lastx) { \ - if (a0 < 0) \ - a0 = 0; \ - if ((pa-thisrun)&1) \ - SETVAL(0); \ - SETVAL(lastx - a0); \ - } else if (a0 > lastx) { \ - SETVAL(lastx); \ - SETVAL(0); \ - } \ - } \ -} while (0) - -/* - * Decode a line of 1D-encoded data. - * - * The line expanders are written as macros so that they can be reused - * but still have direct access to the local variables of the "calling" - * function. - * - * Note that unlike the original version we have to explicitly test for - * a0 >= lastx after each black/white run is decoded. This is because - * the original code depended on the input data being zero-padded to - * insure the decoder recognized an EOL before running out of data. - */ -#define EXPAND1D(eoflab) do { \ - for (;;) { \ - for (;;) { \ - LOOKUP16(12, TIFFFaxWhiteTable, eof1d); \ - switch (TabEnt->State) { \ - case S_EOL: \ - EOLcnt = 1; \ - goto done1d; \ - case S_TermW: \ - SETVAL(TabEnt->Param); \ - goto doneWhite1d; \ - case S_MakeUpW: \ - case S_MakeUp: \ - a0 += TabEnt->Param; \ - RunLength += TabEnt->Param; \ - break; \ - default: \ - unexpected("WhiteTable", a0); \ - goto done1d; \ - } \ - } \ - doneWhite1d: \ - if (a0 >= lastx) \ - goto done1d; \ - for (;;) { \ - LOOKUP16(13, TIFFFaxBlackTable, eof1d); \ - switch (TabEnt->State) { \ - case S_EOL: \ - EOLcnt = 1; \ - goto done1d; \ - case S_TermB: \ - SETVAL(TabEnt->Param); \ - goto doneBlack1d; \ - case S_MakeUpB: \ - case S_MakeUp: \ - a0 += TabEnt->Param; \ - RunLength += TabEnt->Param; \ - break; \ - default: \ - unexpected("BlackTable", a0); \ - goto done1d; \ - } \ - } \ - doneBlack1d: \ - if (a0 >= lastx) \ - goto done1d; \ - } \ -eof1d: \ - prematureEOF(a0); \ - CLEANUP_RUNS(); \ - goto eoflab; \ -done1d: \ - CLEANUP_RUNS(); \ -} while (0) - -/* - * Update the value of b1 using the array - * of runs for the reference line. - */ -#define CHECK_b1 do { \ - if (pa != thisrun) while (b1 <= a0 && b1 < lastx) { \ - b1 += pb[0] + pb[1]; \ - pb += 2; \ - } \ -} while (0) - -/* - * Expand a row of 2D-encoded data. - */ -#define EXPAND2D(eoflab) do { \ - while (a0 < lastx) { \ - LOOKUP8(7, TIFFFaxMainTable, eof2d); \ - switch (TabEnt->State) { \ - case S_Pass: \ - CHECK_b1; \ - b1 += *pb++; \ - RunLength += b1 - a0; \ - a0 = b1; \ - b1 += *pb++; \ - break; \ - case S_Horiz: \ - if ((pa-thisrun)&1) { \ - for (;;) { /* black first */ \ - LOOKUP16(13, TIFFFaxBlackTable, eof2d); \ - switch (TabEnt->State) { \ - case S_TermB: \ - SETVAL(TabEnt->Param); \ - goto doneWhite2da; \ - case S_MakeUpB: \ - case S_MakeUp: \ - a0 += TabEnt->Param; \ - RunLength += TabEnt->Param; \ - break; \ - default: \ - goto badBlack2d; \ - } \ - } \ - doneWhite2da:; \ - for (;;) { /* then white */ \ - LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \ - switch (TabEnt->State) { \ - case S_TermW: \ - SETVAL(TabEnt->Param); \ - goto doneBlack2da; \ - case S_MakeUpW: \ - case S_MakeUp: \ - a0 += TabEnt->Param; \ - RunLength += TabEnt->Param; \ - break; \ - default: \ - goto badWhite2d; \ - } \ - } \ - doneBlack2da:; \ - } else { \ - for (;;) { /* white first */ \ - LOOKUP16(12, TIFFFaxWhiteTable, eof2d); \ - switch (TabEnt->State) { \ - case S_TermW: \ - SETVAL(TabEnt->Param); \ - goto doneWhite2db; \ - case S_MakeUpW: \ - case S_MakeUp: \ - a0 += TabEnt->Param; \ - RunLength += TabEnt->Param; \ - break; \ - default: \ - goto badWhite2d; \ - } \ - } \ - doneWhite2db:; \ - for (;;) { /* then black */ \ - LOOKUP16(13, TIFFFaxBlackTable, eof2d); \ - switch (TabEnt->State) { \ - case S_TermB: \ - SETVAL(TabEnt->Param); \ - goto doneBlack2db; \ - case S_MakeUpB: \ - case S_MakeUp: \ - a0 += TabEnt->Param; \ - RunLength += TabEnt->Param; \ - break; \ - default: \ - goto badBlack2d; \ - } \ - } \ - doneBlack2db:; \ - } \ - CHECK_b1; \ - break; \ - case S_V0: \ - CHECK_b1; \ - SETVAL(b1 - a0); \ - b1 += *pb++; \ - break; \ - case S_VR: \ - CHECK_b1; \ - SETVAL(b1 - a0 + TabEnt->Param); \ - b1 += *pb++; \ - break; \ - case S_VL: \ - CHECK_b1; \ - SETVAL(b1 - a0 - TabEnt->Param); \ - b1 -= *--pb; \ - break; \ - case S_Ext: \ - *pa++ = lastx - a0; \ - extension(a0); \ - goto eol2d; \ - case S_EOL: \ - *pa++ = lastx - a0; \ - NeedBits8(5,eof2d); \ - if (GetBits(5)) \ - unexpected("EOL", a0); \ - EOLcnt = 1; \ - goto eol2d; \ - default: \ - badMain2d: \ - unexpected("MainTable", a0); \ - goto eol2d; \ - badBlack2d: \ - unexpected("BlackTable", a0); \ - goto eol2d; \ - badWhite2d: \ - unexpected("WhiteTable", a0); \ - goto eol2d; \ - eof2d: \ - prematureEOF(a0); \ - CLEANUP_RUNS(); \ - goto eoflab; \ - } \ - } \ - if (RunLength) { \ - if (RunLength + a0 < lastx) { \ - /* expect a final V0 */ \ - NeedBits8(1,eof2d); \ - if (!GetBits(1)) \ - goto badMain2d; \ - ClrBits(1); \ - } \ - SETVAL(0); \ - } \ -eol2d: \ - CLEANUP_RUNS(); \ -} while (0) -#endif /* _FAX3_ */ diff --git a/Utilities/CAI/cai_dll/inc/tif_predict.h b/Utilities/CAI/cai_dll/inc/tif_predict.h deleted file mode 100755 index 52ce8cba5a..0000000000 --- a/Utilities/CAI/cai_dll/inc/tif_predict.h +++ /dev/null @@ -1,61 +0,0 @@ -/* $Header: tif_predict.h,v 1.1 01/01/15 15:24:36 cmf Exp $ */ - -/* - * Copyright (c) 1995-1997 Sam Leffler - * Copyright (c) 1995-1997 Silicon Graphics, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, provided - * that (i) the above copyright notices and this permission notice appear in - * all copies of the software and related documentation, and (ii) the names of - * Sam Leffler and Silicon Graphics may not be used in any advertising or - * publicity relating to the software without the specific, prior written - * permission of Sam Leffler and Silicon Graphics. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR - * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, - * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF - * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - -#ifndef _TIFFPREDICT_ -#define _TIFFPREDICT_ -/* - * ``Library-private'' Support for the Predictor Tag - */ - -/* - * Codecs that want to support the Predictor tag must place - * this structure first in their private state block so that - * the predictor code can cast tif_data to find its state. - */ -typedef struct { - int predictor; /* predictor tag value */ - int stride; /* sample stride over data */ - tsize_t rowsize; /* tile/strip row size */ - - TIFFPostMethod pfunc; /* horizontal differencer/accumulator */ - TIFFCodeMethod coderow; /* parent codec encode/decode row */ - TIFFCodeMethod codestrip; /* parent codec encode/decode strip */ - TIFFCodeMethod codetile; /* parent codec encode/decode tile */ - TIFFVGetMethod vgetparent; /* super-class method */ - TIFFVSetMethod vsetparent; /* super-class method */ - TIFFPrintMethod printdir; /* super-class method */ - TIFFBoolMethod setupdecode; /* super-class method */ - TIFFBoolMethod setupencode; /* super-class method */ -} TIFFPredictorState; - -#if defined(__cplusplus) -extern "C" { -#endif -extern int TIFFPredictorInit(TIFF*); -#if defined(__cplusplus) -} -#endif -#endif /* _TIFFPREDICT_ */ diff --git a/Utilities/CAI/cai_dll/inc/tiff.h b/Utilities/CAI/cai_dll/inc/tiff.h deleted file mode 100755 index f4e08027c6..0000000000 --- a/Utilities/CAI/cai_dll/inc/tiff.h +++ /dev/null @@ -1,440 +0,0 @@ -/* $Header: tiff.h,v 1.3 01/01/15 15:24:31 cmf Exp $ */ - -/* - * Copyright (c) 1988-1997 Sam Leffler - * Copyright (c) 1991-1997 Silicon Graphics, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, provided - * that (i) the above copyright notices and this permission notice appear in - * all copies of the software and related documentation, and (ii) the names of - * Sam Leffler and Silicon Graphics may not be used in any advertising or - * publicity relating to the software without the specific, prior written - * permission of Sam Leffler and Silicon Graphics. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR - * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, - * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF - * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - -#ifndef _TIFF_ -#define _TIFF_ -/* - * Tag Image File Format (TIFF) - * - * Based on Rev 6.0 from: - * Developer's Desk - * Aldus Corporation - * 411 First Ave. South - * Suite 200 - * Seattle, WA 98104 - * 206-622-5500 - */ -#define TIFF_VERSION 42 - -#define TIFF_BIGENDIAN 0x4d4d -#define TIFF_LITTLEENDIAN 0x4949 - -#ifndef _TIFF_DATA_TYPEDEFS_ -#define _TIFF_DATA_TYPEDEFS_ -/* - * Intrinsic data types required by the file format: - * - * 8-bit quantities int8TIFF/uint8TIFF - * 16-bit quantities int16TIFF/uint16TIFF - * 32-bit quantities int32TIFF/uint32TIFF - * strings unsigned char* - */ -/*#ifdef __STDC__ -typedef signed char int8TIFF;*/ /* NB: non-ANSI compilers may not grok */ -/*#else -typedef char int8TIFF; -#endif Modif Regine*/ -typedef char int8TIFF; -typedef unsigned char uint8TIFF; -typedef short int16TIFF; -typedef unsigned short uint16TIFF; /* sizeof (uint16TIFF) must == 2 */ -#if defined(__alpha) ||defined(__LP64__)||defined(__sparcv9) || (defined(_MIPS_SZLONG) && _MIPS_SZLONG == 64) -typedef int int32TIFF; -typedef unsigned int uint32TIFF; /* sizeof (uint32TIFF) must == 4 */ -#else -typedef long int32TIFF; -typedef unsigned long uint32TIFF; /* sizeof (uint32TIFF) must == 4 */ -#endif -#endif /* _TIFF_DATA_TYPEDEFS_ */ - -/* For TIFFReassignTagToIgnore */ -enum TIFFIgnoreSense /* IGNORE tag table */ -{ - TIS_STORE, - TIS_EXTRACT, - TIS_EMPTY -}; - -typedef struct { - uint16TIFF tiff_magic; /* magic number (defines byte order) */ - uint16TIFF tiff_version; /* TIFF version number */ - uint32TIFF tiff_diroff; /* byte offset to first directory */ -} TIFFHeader; - -/* - * TIFF Image File Directories are comprised of - * a table of field descriptors of the form shown - * below. The table is sorted in ascending order - * by tag. The values associated with each entry - * are disjoint and may appear anywhere in the file - * (so long as they are placed on a word boundary). - * - * If the value is 4 bytes or less, then it is placed - * in the offset field to save space. If the value - * is less than 4 bytes, it is left-justified in the - * offset field. - */ -typedef struct { - uint16TIFF tdir_tag; /* see below */ - uint16TIFF tdir_type; /* data type; see below */ - uint32TIFF tdir_count; /* number of items; length in spec */ - uint32TIFF tdir_offset; /* byte offset to field data */ -} TIFFDirEntry; - -/* - * NB: In the comments below, - * - items marked with a + are obsoleted by revision 5.0, - * - items marked with a ! are introduced in revision 6.0. - * - items marked with a % are introduced post revision 6.0. - * - items marked with a $ are obsoleted by revision 6.0. - */ - -/* - * Tag data type information. - * - * Note: RATIONALs are the ratio of two 32-bit integer values. - */ -typedef enum { - TIFF_NOTYPE = 0, /* placeholder */ - TIFF_BYTE = 1, /* 8-bit unsigned integer */ - TIFF_ASCII = 2, /* 8-bit bytes w/ last byte null */ - TIFF_SHORT = 3, /* 16-bit unsigned integer */ - TIFF_LONG = 4, /* 32-bit unsigned integer */ - TIFF_RATIONAL = 5, /* 64-bit unsigned fraction */ - TIFF_SBYTE = 6, /* !8-bit signed integer */ - TIFF_UNDEFINED = 7, /* !8-bit untyped data */ - TIFF_SSHORT = 8, /* !16-bit signed integer */ - TIFF_SLONG = 9, /* !32-bit signed integer */ - TIFF_SRATIONAL = 10, /* !64-bit signed fraction */ - TIFF_FLOAT = 11, /* !32-bit IEEE floating point */ - TIFF_DOUBLE = 12 /* !64-bit IEEE floating point */ -} TIFFDataType; - -/* - * TIFF Tag Definitions. - */ -#define TIFFTAG_SUBFILETYPE 254 /* subfile data descriptor */ -#define FILETYPE_REDUCEDIMAGE 0x1 /* reduced resolution version */ -#define FILETYPE_PAGE 0x2 /* one page of many */ -#define FILETYPE_MASK 0x4 /* transparency mask */ -#define TIFFTAG_OSUBFILETYPE 255 /* +kind of data in subfile */ -#define OFILETYPE_IMAGE 1 /* full resolution image data */ -#define OFILETYPE_REDUCEDIMAGE 2 /* reduced size image data */ -#define OFILETYPE_PAGE 3 /* one page of many */ -#define TIFFTAG_IMAGEWIDTH 256 /* image width in pixels */ -#define TIFFTAG_IMAGELENGTH 257 /* image height in pixels */ -#define TIFFTAG_BITSPERSAMPLE 258 /* bits per channel (sample) */ -#define TIFFTAG_COMPRESSION 259 /* data compression technique */ -#define COMPRESSION_NONE 1 /* dump mode */ -#define COMPRESSION_CCITTRLE 2 /* CCITT modified Huffman RLE */ -#define COMPRESSION_CCITTFAX3 3 /* CCITT Group 3 fax encoding */ -#define COMPRESSION_CCITTFAX4 4 /* CCITT Group 4 fax encoding */ -#define COMPRESSION_LZW 5 /* Lempel-Ziv & Welch */ -#define COMPRESSION_OJPEG 6 /* !6.0 JPEG */ -#define COMPRESSION_JPEG 7 /* %JPEG DCT compression */ -#define COMPRESSION_NEXT 32766 /* NeXT 2-bit RLE */ -#define COMPRESSION_CCITTRLEW 32771 /* #1 w/ word alignment */ -#define COMPRESSION_PACKBITS 32773 /* Macintosh RLE */ -#define COMPRESSION_THUNDERSCAN 32809 /* ThunderScan RLE */ -/* codes 32895-32898 are reserved for ANSI IT8 TIFF/IT <dkelly@etsinc.com) */ -#define COMPRESSION_IT8CTPAD 32895 /* IT8 CT w/padding */ -#define COMPRESSION_IT8LW 32896 /* IT8 Linework RLE */ -#define COMPRESSION_IT8MP 32897 /* IT8 Monochrome picture */ -#define COMPRESSION_IT8BL 32898 /* IT8 Binary line art */ -/* compression codes 32908-32911 are reserved for Pixar */ -#define COMPRESSION_PIXARFILM 32908 /* Pixar companded 10bit LZW */ -#define COMPRESSION_PIXARLOG 32909 /* Pixar companded 11bit ZIP */ -#define COMPRESSION_DEFLATE 32946 /* Deflate compression */ -#define COMPRESSION_ADOBE_DEFLATE 8 /* Deflate compression, as recognized by Adobe */ -/* compression code 32947 is reserved for Oceana Matrix <dev@oceana.com> */ -#define COMPRESSION_DCS 32947 /* Kodak DCS encoding */ -#define COMPRESSION_JBIG 34661 /* ISO JBIG */ -#define COMPRESSION_SGILOG 34676 /* SGI Log Luminance RLE */ -#define COMPRESSION_SGILOG24 34677 /* SGI Log 24-bit packed */ -#define TIFFTAG_PHOTOMETRIC 262 /* photometric interpretation */ -#define PHOTOMETRIC_MINISWHITE 0 /* min value is white */ -#define PHOTOMETRIC_MINISBLACK 1 /* min value is black */ -#define PHOTOMETRIC_RGB 2 /* RGB color model */ -#define PHOTOMETRIC_PALETTE 3 /* color map indexed */ -#define PHOTOMETRIC_MASK 4 /* $holdout mask */ -#define PHOTOMETRIC_SEPARATED 5 /* !color separations */ -#define PHOTOMETRIC_YCBCR 6 /* !CCIR 601 */ -#define PHOTOMETRIC_CIELAB 8 /* !1976 CIE L*a*b* */ -#define PHOTOMETRIC_LOGL 32844 /* CIE Log2(L) */ -#define PHOTOMETRIC_LOGLUV 32845 /* CIE Log2(L) (u',v') */ -#define TIFFTAG_THRESHHOLDING 263 /* +thresholding used on data */ -#define THRESHHOLD_BILEVEL 1 /* b&w art scan */ -#define THRESHHOLD_HALFTONE 2 /* or dithered scan */ -#define THRESHHOLD_ERRORDIFFUSE 3 /* usually floyd-steinberg */ -#define TIFFTAG_CELLWIDTH 264 /* +dithering matrix width */ -#define TIFFTAG_CELLLENGTH 265 /* +dithering matrix height */ -#define TIFFTAG_FILLORDER 266 /* data order within a byte */ -#define FILLORDER_MSB2LSB 1 /* most significant -> least */ -#define FILLORDER_LSB2MSB 2 /* least significant -> most */ -#define TIFFTAG_DOCUMENTNAME 269 /* name of doc. image is from */ -#define TIFFTAG_IMAGEDESCRIPTION 270 /* info about image */ -#define TIFFTAG_MAKE 271 /* scanner manufacturer name */ -#define TIFFTAG_MODEL 272 /* scanner model name/number */ -#define TIFFTAG_STRIPOFFSETS 273 /* offsets to data strips */ -#define TIFFTAG_ORIENTATION 274 /* +image orientation */ -#define ORIENTATION_TOPLEFT 1 /* row 0 top, col 0 lhs */ -#define ORIENTATION_TOPRIGHT 2 /* row 0 top, col 0 rhs */ -#define ORIENTATION_BOTRIGHT 3 /* row 0 bottom, col 0 rhs */ -#define ORIENTATION_BOTLEFT 4 /* row 0 bottom, col 0 lhs */ -#define ORIENTATION_LEFTTOP 5 /* row 0 lhs, col 0 top */ -#define ORIENTATION_RIGHTTOP 6 /* row 0 rhs, col 0 top */ -#define ORIENTATION_RIGHTBOT 7 /* row 0 rhs, col 0 bottom */ -#define ORIENTATION_LEFTBOT 8 /* row 0 lhs, col 0 bottom */ -#define TIFFTAG_SAMPLESPERPIXEL 277 /* samples per pixel */ -#define TIFFTAG_ROWSPERSTRIP 278 /* rows per strip of data */ -#define TIFFTAG_STRIPBYTECOUNTS 279 /* bytes counts for strips */ -#define TIFFTAG_MINSAMPLEVALUE 280 /* +minimum sample value */ -#define TIFFTAG_MAXSAMPLEVALUE 281 /* +maximum sample value */ -#define TIFFTAG_XRESOLUTION 282 /* pixels/resolution in x */ -#define TIFFTAG_YRESOLUTION 283 /* pixels/resolution in y */ -#define TIFFTAG_PLANARCONFIG 284 /* storage organization */ -#define PLANARCONFIG_CONTIG 1 /* single image plane */ -#define PLANARCONFIG_SEPARATE 2 /* separate planes of data */ -#define TIFFTAG_PAGENAME 285 /* page name image is from */ -#define TIFFTAG_XPOSITION 286 /* x page offset of image lhs */ -#define TIFFTAG_YPOSITION 287 /* y page offset of image lhs */ -#define TIFFTAG_FREEOFFSETS 288 /* +byte offset to free block */ -#define TIFFTAG_FREEBYTECOUNTS 289 /* +sizes of free blocks */ -#define TIFFTAG_GRAYRESPONSEUNIT 290 /* $gray scale curve accuracy */ -#define GRAYRESPONSEUNIT_10S 1 /* tenths of a unit */ -#define GRAYRESPONSEUNIT_100S 2 /* hundredths of a unit */ -#define GRAYRESPONSEUNIT_1000S 3 /* thousandths of a unit */ -#define GRAYRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ -#define GRAYRESPONSEUNIT_100000S 5 /* hundred-thousandths */ -#define TIFFTAG_GRAYRESPONSECURVE 291 /* $gray scale response curve */ -#define TIFFTAG_GROUP3OPTIONS 292 /* 32 flag bits */ -#define GROUP3OPT_2DENCODING 0x1 /* 2-dimensional coding */ -#define GROUP3OPT_UNCOMPRESSED 0x2 /* data not compressed */ -#define GROUP3OPT_FILLBITS 0x4 /* fill to byte boundary */ -#define TIFFTAG_GROUP4OPTIONS 293 /* 32 flag bits */ -#define GROUP4OPT_UNCOMPRESSED 0x2 /* data not compressed */ -#define TIFFTAG_RESOLUTIONUNIT 296 /* units of resolutions */ -#define RESUNIT_NONE 1 /* no meaningful units */ -#define RESUNIT_INCH 2 /* english */ -#define RESUNIT_CENTIMETER 3 /* metric */ -#define TIFFTAG_PAGENUMBER 297 /* page numbers of multi-page */ -#define TIFFTAG_COLORRESPONSEUNIT 300 /* $color curve accuracy */ -#define COLORRESPONSEUNIT_10S 1 /* tenths of a unit */ -#define COLORRESPONSEUNIT_100S 2 /* hundredths of a unit */ -#define COLORRESPONSEUNIT_1000S 3 /* thousandths of a unit */ -#define COLORRESPONSEUNIT_10000S 4 /* ten-thousandths of a unit */ -#define COLORRESPONSEUNIT_100000S 5 /* hundred-thousandths */ -#define TIFFTAG_TRANSFERFUNCTION 301 /* !colorimetry info */ -#define TIFFTAG_SOFTWARE 305 /* name & release */ -#define TIFFTAG_DATETIME 306 /* creation date and time */ -#define TIFFTAG_ARTIST 315 /* creator of image */ -#define TIFFTAG_HOSTCOMPUTER 316 /* machine where created */ -#define TIFFTAG_PREDICTOR 317 /* prediction scheme w/ LZW */ -#define TIFFTAG_WHITEPOINT 318 /* image white point */ -#define TIFFTAG_PRIMARYCHROMATICITIES 319 /* !primary chromaticities */ -#define TIFFTAG_COLORMAP 320 /* RGB map for pallette image */ -#define TIFFTAG_HALFTONEHINTS 321 /* !highlight+shadow info */ -#define TIFFTAG_TILEWIDTH 322 /* !rows/data tile */ -#define TIFFTAG_TILELENGTH 323 /* !cols/data tile */ -#define TIFFTAG_TILEOFFSETS 324 /* !offsets to data tiles */ -#define TIFFTAG_TILEBYTECOUNTS 325 /* !byte counts for tiles */ -#define TIFFTAG_BADFAXLINES 326 /* lines w/ wrong pixel count */ -#define TIFFTAG_CLEANFAXDATA 327 /* regenerated line info */ -#define CLEANFAXDATA_CLEAN 0 /* no errors detected */ -#define CLEANFAXDATA_REGENERATED 1 /* receiver regenerated lines */ -#define CLEANFAXDATA_UNCLEAN 2 /* uncorrected errors exist */ -#define TIFFTAG_CONSECUTIVEBADFAXLINES 328 /* max consecutive bad lines */ -#define TIFFTAG_SUBIFD 330 /* subimage descriptors */ -#define TIFFTAG_INKSET 332 /* !inks in separated image */ -#define INKSET_CMYK 1 /* !cyan-magenta-yellow-black */ -#define TIFFTAG_INKNAMES 333 /* !ascii names of inks */ -#define TIFFTAG_NUMBEROFINKS 334 /* !number of inks */ -#define TIFFTAG_DOTRANGE 336 /* !0% and 100% dot codes */ -#define TIFFTAG_TARGETPRINTER 337 /* !separation target */ -#define TIFFTAG_EXTRASAMPLES 338 /* !info about extra samples */ -#define EXTRASAMPLE_UNSPECIFIED 0 /* !unspecified data */ -#define EXTRASAMPLE_ASSOCALPHA 1 /* !associated alpha data */ -#define EXTRASAMPLE_UNASSALPHA 2 /* !unassociated alpha data */ -#define TIFFTAG_SAMPLEFORMAT 339 /* !data sample format */ -#define SAMPLEFORMAT_UINT 1 /* !unsigned integer data */ -#define SAMPLEFORMAT_INT 2 /* !signed integer data */ -#define SAMPLEFORMAT_IEEEFP 3 /* !IEEE floating point data */ -#define SAMPLEFORMAT_VOID 4 /* !untyped data */ -#define TIFFTAG_SMINSAMPLEVALUE 340 /* !variable MinSampleValue */ -#define TIFFTAG_SMAXSAMPLEVALUE 341 /* !variable MaxSampleValue */ -#define TIFFTAG_JPEGTABLES 347 /* %JPEG table stream */ -/* - * Tags 512-521 are obsoleted by Technical Note #2 - * which specifies a revised JPEG-in-TIFF scheme. - */ -#define TIFFTAG_JPEGPROC 512 /* !JPEG processing algorithm */ -#define JPEGPROC_BASELINE 1 /* !baseline sequential */ -#define JPEGPROC_LOSSLESS 14 /* !Huffman coded lossless */ -#define TIFFTAG_JPEGIFOFFSET 513 /* !pointer to SOI marker */ -#define TIFFTAG_JPEGIFBYTECOUNT 514 /* !JFIF stream length */ -#define TIFFTAG_JPEGRESTARTINTERVAL 515 /* !restart interval length */ -#define TIFFTAG_JPEGLOSSLESSPREDICTORS 517 /* !lossless proc predictor */ -#define TIFFTAG_JPEGPOINTTRANSFORM 518 /* !lossless point transform */ -#define TIFFTAG_JPEGQTABLES 519 /* !Q matrice offsets */ -#define TIFFTAG_JPEGDCTABLES 520 /* !DCT table offsets */ -#define TIFFTAG_JPEGACTABLES 521 /* !AC coefficient offsets */ -#define TIFFTAG_YCBCRCOEFFICIENTS 529 /* !RGB -> YCbCr transform */ -#define TIFFTAG_YCBCRSUBSAMPLING 530 /* !YCbCr subsampling factors */ -#define TIFFTAG_YCBCRPOSITIONING 531 /* !subsample positioning */ -#define YCBCRPOSITION_CENTERED 1 /* !as in PostScript Level 2 */ -#define YCBCRPOSITION_COSITED 2 /* !as in CCIR 601-1 */ -#define TIFFTAG_REFERENCEBLACKWHITE 532 /* !colorimetry info */ -/* tags 32952-32956 are private tags registered to Island Graphics */ -#define TIFFTAG_REFPTS 32953 /* image reference points */ -#define TIFFTAG_REGIONTACKPOINT 32954 /* region-xform tack point */ -#define TIFFTAG_REGIONWARPCORNERS 32955 /* warp quadrilateral */ -#define TIFFTAG_REGIONAFFINE 32956 /* affine transformation mat */ -/* tags 32995-32999 are private tags registered to SGI */ -#define TIFFTAG_MATTEING 32995 /* $use ExtraSamples */ -#define TIFFTAG_DATATYPE 32996 /* $use SampleFormat */ -#define TIFFTAG_IMAGEDEPTH 32997 /* z depth of image */ -#define TIFFTAG_TILEDEPTH 32998 /* z depth/data tile */ -/* tags 33300-33309 are private tags registered to Pixar */ -/* - * TIFFTAG_PIXAR_IMAGEFULLWIDTH and TIFFTAG_PIXAR_IMAGEFULLLENGTH - * are set when an image has been cropped out of a larger image. - * They reflect the size of the original uncropped image. - * The TIFFTAG_XPOSITION and TIFFTAG_YPOSITION can be used - * to determine the position of the smaller image in the larger one. - */ -#define TIFFTAG_PIXAR_IMAGEFULLWIDTH 33300 /* full image size in x */ -#define TIFFTAG_PIXAR_IMAGEFULLLENGTH 33301 /* full image size in y */ - /* Tags 33302-33306 are used to identify special image modes and data - * used by Pixar's texture formats. - */ -#define TIFFTAG_PIXAR_TEXTUREFORMAT 33302 /* texture map format */ -#define TIFFTAG_PIXAR_WRAPMODES 33303 /* s & t wrap modes */ -#define TIFFTAG_PIXAR_FOVCOT 33304 /* cotan(fov) for env. maps */ -#define TIFFTAG_PIXAR_MATRIX_WORLDTOSCREEN 33305 -#define TIFFTAG_PIXAR_MATRIX_WORLDTOCAMERA 33306 -/* tag 33405 is a private tag registered to Eastman Kodak */ -#define TIFFTAG_WRITERSERIALNUMBER 33405 /* device serial number */ -/* tag 33432 is listed in the 6.0 spec w/ unknown ownership */ -#define TIFFTAG_COPYRIGHT 33432 /* copyright string */ -/* IPTC TAG from RichTIFF specifications */ -#define TIFFTAG_RICHTIFFIPTC 33723 -/* 34016-34029 are reserved for ANSI IT8 TIFF/IT <dkelly@etsinc.com) */ -#define TIFFTAG_IT8SITE 34016 /* site name */ -#define TIFFTAG_IT8COLORSEQUENCE 34017 /* color seq. [RGB,CMYK,etc] */ -#define TIFFTAG_IT8HEADER 34018 /* DDES Header */ -#define TIFFTAG_IT8RASTERPADDING 34019 /* raster scanline padding */ -#define TIFFTAG_IT8BITSPERRUNLENGTH 34020 /* # of bits in short run */ -#define TIFFTAG_IT8BITSPEREXTENDEDRUNLENGTH 34021/* # of bits in long run */ -#define TIFFTAG_IT8COLORTABLE 34022 /* LW colortable */ -#define TIFFTAG_IT8IMAGECOLORINDICATOR 34023 /* BP/BL image color switch */ -#define TIFFTAG_IT8BKGCOLORINDICATOR 34024 /* BP/BL bg color switch */ -#define TIFFTAG_IT8IMAGECOLORVALUE 34025 /* BP/BL image color value */ -#define TIFFTAG_IT8BKGCOLORVALUE 34026 /* BP/BL bg color value */ -#define TIFFTAG_IT8PIXELINTENSITYRANGE 34027 /* MP pixel intensity value */ -#define TIFFTAG_IT8TRANSPARENCYINDICATOR 34028 /* HC transparency switch */ -#define TIFFTAG_IT8COLORCHARACTERIZATION 34029 /* color character. table */ -/* tags 34232-34236 are private tags registered to Texas Instruments */ -#define TIFFTAG_FRAMECOUNT 34232 /* Sequence Frame Count */ -/* tag 34750 is a private tag registered to Adobe? */ -#define TIFFTAG_ICCPROFILE 34675 /* ICC profile data */ -/* tag 34377 is private tag registered to Adobe for PhotoShop */ -#define TIFFTAG_PHOTOSHOP 34377 -/* tag 34750 is a private tag registered to Pixel Magic */ -#define TIFFTAG_JBIGOPTIONS 34750 /* JBIG options */ -/* tags 34908-34914 are private tags registered to SGI */ -#define TIFFTAG_FAXRECVPARAMS 34908 /* encoded Class 2 ses. parms */ -#define TIFFTAG_FAXSUBADDRESS 34909 /* received SubAddr string */ -#define TIFFTAG_FAXRECVTIME 34910 /* receive time (secs) */ -/* tags 37439-37443 are registered to SGI <gregl@sgi.com> */ -#define TIFFTAG_STONITS 37439 /* Sample value to Nits */ -/* tag 34929 is a private tag registered to FedEx */ -#define TIFFTAG_FEDEX_EDR 34929 /* unknown use */ -/* tag 65535 is an undefined tag used by Eastman Kodak */ -#define TIFFTAG_DCSHUESHIFTVALUES 65535 /* hue shift correction data */ - -/* - * The following are ``pseudo tags'' that can be - * used to control codec-specific functionality. - * These tags are not written to file. Note that - * these values start at 0xffff+1 so that they'll - * never collide with Aldus-assigned tags. - * - * If you want your private pseudo tags ``registered'' - * (i.e. added to this file), send mail to sam@sgi.com - * with the appropriate C definitions to add. - */ -#define TIFFTAG_FAXMODE 65536 /* Group 3/4 format control */ -#define FAXMODE_CLASSIC 0x0000 /* default, include RTC */ -#define FAXMODE_NORTC 0x0001 /* no RTC at end of data */ -#define FAXMODE_NOEOL 0x0002 /* no EOL code at end of row */ -#define FAXMODE_BYTEALIGN 0x0004 /* byte align row */ -#define FAXMODE_WORDALIGN 0x0008 /* word align row */ -#define FAXMODE_CLASSF FAXMODE_NORTC /* TIFF Class F */ -#define TIFFTAG_JPEGQUALITY 65537 /* Compression quality level */ -/* Note: quality level is on the IJG 0-100 scale. Default value is 75 */ -#define TIFFTAG_JPEGCOLORMODE 65538 /* Auto RGB<=>YCbCr convert? */ -#define JPEGCOLORMODE_RAW 0x0000 /* no conversion (default) */ -#define JPEGCOLORMODE_RGB 0x0001 /* do auto conversion */ -#define TIFFTAG_JPEGTABLESMODE 65539 /* What to put in JPEGTables */ -#define JPEGTABLESMODE_QUANT 0x0001 /* include quantization tbls */ -#define JPEGTABLESMODE_HUFF 0x0002 /* include Huffman tbls */ -/* Note: default is JPEGTABLESMODE_QUANT | JPEGTABLESMODE_HUFF */ -#define TIFFTAG_FAXFILLFUNC 65540 /* G3/G4 fill function */ -#define TIFFTAG_PIXARLOGDATAFMT 65549 /* PixarLogCodec I/O data sz */ -#define PIXARLOGDATAFMT_8BIT 0 /* regular u_char samples */ -#define PIXARLOGDATAFMT_8BITABGR 1 /* ABGR-order u_chars */ -#define PIXARLOGDATAFMT_11BITLOG 2 /* 11-bit log-encoded (raw) */ -#define PIXARLOGDATAFMT_12BITPICIO 3 /* as per PICIO (1.0==2048) */ -#define PIXARLOGDATAFMT_16BIT 4 /* signed short samples */ -#define PIXARLOGDATAFMT_FLOAT 5 /* IEEE float samples */ -/* 65550-65556 are allocated to Oceana Matrix <dev@oceana.com> */ -#define TIFFTAG_DCSIMAGERTYPE 65550 /* imager model & filter */ -#define DCSIMAGERMODEL_M3 0 /* M3 chip (1280 x 1024) */ -#define DCSIMAGERMODEL_M5 1 /* M5 chip (1536 x 1024) */ -#define DCSIMAGERMODEL_M6 2 /* M6 chip (3072 x 2048) */ -#define DCSIMAGERFILTER_IR 0 /* infrared filter */ -#define DCSIMAGERFILTER_MONO 1 /* monochrome filter */ -#define DCSIMAGERFILTER_CFA 2 /* color filter array */ -#define DCSIMAGERFILTER_OTHER 3 /* other filter */ -#define TIFFTAG_DCSINTERPMODE 65551 /* interpolation mode */ -#define DCSINTERPMODE_NORMAL 0x0 /* whole image, default */ -#define DCSINTERPMODE_PREVIEW 0x1 /* preview of image (384x256) */ -#define TIFFTAG_DCSBALANCEARRAY 65552 /* color balance values */ -#define TIFFTAG_DCSCORRECTMATRIX 65553 /* color correction values */ -#define TIFFTAG_DCSGAMMA 65554 /* gamma value */ -#define TIFFTAG_DCSTOESHOULDERPTS 65555 /* toe & shoulder points */ -#define TIFFTAG_DCSCALIBRATIONFD 65556 /* calibration file desc */ -/* Note: quality level is on the ZLIB 1-9 scale. Default value is -1 */ -#define TIFFTAG_ZIPQUALITY 65557 /* compression quality level */ -#define TIFFTAG_PIXARLOGQUALITY 65558 /* PixarLog uses same scale */ -/* 65559 is allocated to Oceana Matrix <dev@oceana.com> */ -#define TIFFTAG_DCSCLIPRECTANGLE 65559 /* area of image to acquire */ -#define TIFFTAG_SGILOGDATAFMT 65560 /* SGILog user data format */ -#define SGILOGDATAFMT_FLOAT 0 /* IEEE float samples */ -#define SGILOGDATAFMT_16BIT 1 /* 16-bit samples */ -#define SGILOGDATAFMT_RAW 2 /* uninterpreted data */ -#define SGILOGDATAFMT_8BIT 3 /* 8-bit RGB monitor values */ -#endif /* _TIFF_ */ diff --git a/Utilities/CAI/cai_dll/inc/tiffcomp.h b/Utilities/CAI/cai_dll/inc/tiffcomp.h deleted file mode 100755 index bd2d86d3c3..0000000000 --- a/Utilities/CAI/cai_dll/inc/tiffcomp.h +++ /dev/null @@ -1,214 +0,0 @@ -/* $Header: tiffcomp.h,v 1.3 01/01/15 15:24:32 cmf Exp $ */ - -/* - * Copyright (c) 1990-1997 Sam Leffler - * Copyright (c) 1991-1997 Silicon Graphics, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, provided - * that (i) the above copyright notices and this permission notice appear in - * all copies of the software and related documentation, and (ii) the names of - * Sam Leffler and Silicon Graphics may not be used in any advertising or - * publicity relating to the software without the specific, prior written - * permission of Sam Leffler and Silicon Graphics. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR - * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, - * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF - * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - -#ifndef _COMPAT_ -#define _COMPAT_ -/* - * This file contains a hodgepodge of definitions and - * declarations that are needed to provide compatibility - * between the native system and the base implementation - * that the library assumes. - * - * NB: This file is a mess. - */ - -/* - * Setup basic type definitions and function declaratations. - */ - -/* - * Simplify Acorn RISC OS identifier (to avoid confusion with Acorn RISC iX - * and with defunct Unix Risc OS) - * No need to specify __arm - hey, Acorn might port the OS, no problem here! - */ -#ifdef __acornriscos -#undef __acornriscos -#endif -#if defined(__acorn) && defined(__riscos) -#define __acornriscos -#endif - -#if defined(__MWERKS__) || defined(THINK_C) -#include <unix.h> -#include <math.h> -#endif - -#include <stdio.h> - -#if defined(__PPCC__) || defined(__SC__) || defined(__MRC__) -#include <types.h> -#elif !defined(__MWERKS__) && !defined(THINK_C) && !defined(__acornriscos) && !defined(applec) -#include <sys/types.h> -#endif - -#if defined(VMS) -#include <file.h> -#include <unixio.h> -#elif !defined(__acornriscos) -#include <fcntl.h> -#endif - -/* - * This maze of checks controls defines or not the - * target system has BSD-style typdedefs declared in - * an include file and/or whether or not to include - * <unistd.h> to get the SEEK_* definitions. Some - * additional includes are also done to pull in the - * appropriate definitions we're looking for. - */ -#if defined(__MWERKS__) || defined(THINK_C) || defined(__PPCC__) || defined(__SC__) || defined(__MRC__) -#include <stdlib.h> -#define BSDTYPES -#define HAVE_UNISTD_H 0 -#elif defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows) -#define BSDTYPES -#elif defined(OS2_16) || defined(OS2_32) -#define BSDTYPES -#elif defined(__acornriscos) -#include <stdlib.h> -#define BSDTYPES -#define HAVE_UNISTD_H 0 -#elif defined(VMS) -#define HAVE_UNISTD_H 0 -#else -#define HAVE_UNISTD_H 1 -#endif - -/* - * The library uses the ANSI C/POSIX SEEK_* - * definitions that should be defined in unistd.h - * (except on system where they are in stdio.h and - * there is no unistd.h). - */ -#if !defined(SEEK_SET) && HAVE_UNISTD_H -#include <unistd.h> -#endif - -/* - * The library uses memset, memcpy, and memcmp. - * ANSI C and System V define these in string.h. - */ -#include <string.h> - -/* - * The BSD typedefs are used throughout the library. - * If your system doesn't have them in <sys/types.h>, - * then define BSDTYPES in your Makefile. - */ -#if defined(BSDTYPES) -typedef unsigned char u_char; -typedef unsigned short u_short; -typedef unsigned int u_int; -typedef unsigned long u_long; -#endif - -/* - * dblparam_t is the type that a double precision - * floating point value will have on the parameter - * stack (when coerced by the compiler). - */ -/* Note: on MacPowerPC "extended" is undefined. So only use it for 68K-Macs */ -#if defined(__SC__) || defined(THINK_C) -typedef extended dblparam_t; -#else -typedef double dblparam_t; -#endif - -/* - * If your compiler supports inline functions, then - * set INLINE appropriately to get the known hotspots - * in the library expanded inline. - */ -#if defined(__GNUC__) -#if defined(__STRICT_ANSI__) -#define INLINE __inline__ -#else -#define INLINE inline -#endif -#else /* !__GNUC__ */ -#define INLINE -#endif - -/* - * GLOBALDATA is a macro that is used to define global variables - * private to the library. We use this indirection to hide - * brain-damage in VAXC (and GCC) under VAX/VMS. In these - * environments the macro places the variable in a non-shareable - * program section, which ought to be done by default (sigh!) - * - * Apparently DEC are aware of the problem as this behaviour is the - * default under VMS on AXP. - * - * The GNU C variant is untested. - */ -#if defined(VAX) && defined(VMS) -#if defined(VAXC) -#define GLOBALDATA(TYPE,NAME) extern noshare TYPE NAME -#endif -#if defined(__GNUC__) -#define GLOBALDATA(TYPE,NAME) extern TYPE NAME \ - asm("_$$PsectAttributes_NOSHR$$" #NAME) -#endif -#else /* !VAX/VMS */ -#define GLOBALDATA(TYPE,NAME) extern TYPE NAME -#endif - -#if defined(__acornriscos) -/* - * osfcn.h is part of C++Lib on Acorn C/C++, and as such can't be used - * on C alone. For that reason, the relevant functions are - * implemented in tif_acorn.c, and the elements from the header - * file are included here. - */ -#if defined(__cplusplus) -#include <osfcn.h> -#else -#define O_RDONLY 0 -#define O_WRONLY 1 -#define O_RDWR 2 -#define O_APPEND 8 -#define O_CREAT 0x200 -#define O_TRUNC 0x400 -typedef long off_t; -extern int open(const char *name, int flags, int mode); -extern int close(int fd); -extern int write(int fd, const char *buf, int nbytes); -extern int read(int fd, char *buf, int nbytes); -extern off_t lseek(int fd, off_t offset, int whence); -extern int creat(const char *path, int mode); -#endif /* __cplusplus */ -#endif /* __acornriscos */ - -/* Bit and byte order, the default is MSB to LSB */ -#ifdef VMS -#undef HOST_FILLORDER -#undef HOST_BIGENDIAN -#define HOST_FILLORDER FILLORDER_LSB2MSB -#define HOST_BIGENDIAN 0 -#endif - - -#endif /* _COMPAT_ */ diff --git a/Utilities/CAI/cai_dll/inc/tiffconf.h b/Utilities/CAI/cai_dll/inc/tiffconf.h deleted file mode 100755 index b7f75a26a7..0000000000 --- a/Utilities/CAI/cai_dll/inc/tiffconf.h +++ /dev/null @@ -1,143 +0,0 @@ -/* $Header: tiffconf.h,v 1.3 01/01/15 15:24:32 cmf Exp $ */ -/* - * Copyright (c) 1988-1997 Sam Leffler - * Copyright (c) 1991-1997 Silicon Graphics, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, provided - * that (i) the above copyright notices and this permission notice appear in - * all copies of the software and related documentation, and (ii) the names of - * Sam Leffler and Silicon Graphics may not be used in any advertising or - * publicity relating to the software without the specific, prior written - * permission of Sam Leffler and Silicon Graphics. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR - * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, - * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF - * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - -#ifndef _TIFFCONF_ -#define _TIFFCONF_ -/* - * Library Configuration Definitions. - * - * This file defines the default configuration for the library. - * If the target system does not have make or a way to specify - * #defines on the command line, this file can be edited to - * configure the library. Otherwise, one can override portability - * and configuration-related definitions from a Makefile or command - * line by defining FEATURE_SUPPORT and COMPRESSION_SUPPORT (see below). - */ - -/* - * General portability-related defines: - * - * HAVE_IEEEFP define as 0 or 1 according to the floating point - * format suported by the machine - * BSDTYPES define this if your system does NOT define the - * usual 4BSD typedefs u_int et. al. - * HAVE_MMAP enable support for memory mapping read-only files; - * this is typically deduced by the configure script - * HOST_FILLORDER native cpu bit order: one of FILLORDER_MSB2LSB - * or FILLODER_LSB2MSB; this is typically set by the - * configure script - * HOST_BIGENDIAN native cpu byte order: 1 if big-endian (Motorola) - * or 0 if little-endian (Intel); this may be used - * in codecs to optimize code - * USE_64BIT_API set to 1 if tif_unix.c should use lseek64(), - * fstat64() and stat64 allowing 2-4GB files. - */ -#ifndef HAVE_IEEEFP -#define HAVE_IEEEFP 1 -#endif -#ifndef HOST_FILLORDER -#define HOST_FILLORDER FILLORDER_MSB2LSB -#endif -#ifndef HOST_BIGENDIAN -#define HOST_BIGENDIAN 1 -#endif - -#ifndef USE_64BIT_API -# define USE_64BIT_API 0 -#endif - -#ifndef FEATURE_SUPPORT -/* - * Feature support definitions: - * - * COLORIMETRY_SUPPORT enable support for 6.0 colorimetry tags - * YCBCR_SUPPORT enable support for 6.0 YCbCr tags - * CMYK_SUPPORT enable support for 6.0 CMYK tags - * ICC_SUPPORT enable support for ICC profile tag - * PHOTOSHOP_SUPPORT enable support for PHOTOSHOP resource tag - * IPTC_SUPPORT enable support for RichTIFF IPTC tag - */ -#define COLORIMETRY_SUPPORT -#define YCBCR_SUPPORT -#define CMYK_SUPPORT -#define ICC_SUPPORT -#define PHOTOSHOP_SUPPORT -#define IPTC_SUPPORT -#endif /* FEATURE_SUPPORT */ - -#ifndef COMPRESSION_SUPPORT -/* - * Compression support defines: - * - * CCITT_SUPPORT enable support for CCITT Group 3 & 4 algorithms - * PACKBITS_SUPPORT enable support for Macintosh PackBits algorithm - * LZW_SUPPORT enable support for LZW algorithm - * THUNDER_SUPPORT enable support for ThunderScan 4-bit RLE algorithm - * NEXT_SUPPORT enable support for NeXT 2-bit RLE algorithm - * OJPEG_SUPPORT enable support for 6.0-style JPEG DCT algorithms - * (no builtin support, only a codec hook) - * JPEG_SUPPORT enable support for post-6.0-style JPEG DCT algorithms - * (requires freely available IJG software, see tif_jpeg.c) - * ZIP_SUPPORT enable support for Deflate algorithm - * (requires freely available zlib software, see tif_zip.c) - * PIXARLOG_SUPPORT enable support for Pixar log-format algorithm - * LOGLUV_SUPPORT enable support for LogLuv high dynamic range encoding - */ -#define CCITT_SUPPORT -#define PACKBITS_SUPPORT -#define LZW_SUPPORT -#define THUNDER_SUPPORT -#define NEXT_SUPPORT -#define LOGLUV_SUPPORT -#endif /* COMPRESSION_SUPPORT */ - -/* - * If JPEG compression is enabled then we must also include - * support for the colorimetry and YCbCr-related tags. - */ -#ifdef JPEG_SUPPORT -#ifndef YCBCR_SUPPORT -#define YCBCR_SUPPORT -#endif -#ifndef COLORIMETRY_SUPPORT -#define COLORIMETRY_SUPPORT -#endif -#endif /* JPEG_SUPPORT */ - -/* - * ``Orthogonal Features'' - * - * STRIPCHOP_DEFAULT default handling of strip chopping support (whether - * or not to convert single-strip uncompressed images - * to mutiple strips of ~8Kb--to reduce memory use) - * SUBIFD_SUPPORT enable support for SubIFD tag (thumbnails and such) - */ -#ifndef STRIPCHOP_DEFAULT -#define STRIPCHOP_DEFAULT TIFF_STRIPCHOP /* default is to enable */ -#endif -#ifndef SUBIFD_SUPPORT -#define SUBIFD_SUPPORT 1 /* enable SubIFD tag (330) support */ -#endif -#endif /* _TIFFCONF_ */ diff --git a/Utilities/CAI/cai_dll/inc/tiffio.h b/Utilities/CAI/cai_dll/inc/tiffio.h deleted file mode 100755 index 50e063ba29..0000000000 --- a/Utilities/CAI/cai_dll/inc/tiffio.h +++ /dev/null @@ -1,334 +0,0 @@ -/* $Header: tiffio.h,v 1.3 01/01/15 15:24:33 cmf Exp $ */ - -/* - * Copyright (c) 1988-1997 Sam Leffler - * Copyright (c) 1991-1997 Silicon Graphics, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, provided - * that (i) the above copyright notices and this permission notice appear in - * all copies of the software and related documentation, and (ii) the names of - * Sam Leffler and Silicon Graphics may not be used in any advertising or - * publicity relating to the software without the specific, prior written - * permission of Sam Leffler and Silicon Graphics. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR - * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, - * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF - * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - -#ifndef _TIFFIO_ -#define _TIFFIO_ - -/* - * TIFF I/O Library Definitions. - */ -#include "tiff.h" - -/* - * This define can be used in code that requires - * compilation-related definitions specific to a - * version or versions of the library. Runtime - * version checking should be done based on the - * string returned by TIFFGetVersion. - */ -#define TIFFLIB_VERSION 19970127 /* January 27, 1997 */ - -/* - * TIFF is defined as an incomplete type to hide the - * library's internal data structures from clients. - */ -typedef struct tiff TIFF; - -/* - * The following typedefs define the intrinsic size of - * data types used in the *exported* interfaces. These - * definitions depend on the proper definition of types - * in tiff.h. Note also that the varargs interface used - * to pass tag types and values uses the types defined in - * tiff.h directly. - * - * NB: ttag_t is unsigned int and not unsigned short because - * ANSI C requires that the type before the ellipsis be a - * promoted type (i.e. one of int, unsigned int, pointer, - * or double) and because we defined pseudo-tags that are - * outside the range of legal Aldus-assigned tags. - * NB: tsize_t is int32TIFF and not uint32TIFF because some functions - * return -1. - * NB: toff_t is not off_t for many reasons; TIFFs max out at - * 32-bit file offsets being the most important, and to ensure - * that it is unsigned, rather than signed. - */ -typedef uint32TIFF ttag_t; /* directory tag */ -typedef uint16TIFF tdir_t; /* directory index */ -typedef uint16TIFF tsample_t; /* sample number */ -typedef uint32TIFF tstrip_t; /* strip number */ -typedef uint32TIFF ttile_t; /* tile number */ -typedef int32TIFF tsize_t; /* i/o size in bytes */ -typedef void* tdata_t; /* image data ref */ -typedef uint32TIFF toff_t; /* file offset */ - -#if !defined(__WIN32__) && (defined(_WIN32) || defined(WIN32)) -#define __WIN32__ -#endif - -/* MODIF PC NT */ -#undef _WINDOWS -#undef __WIN32__ -#undef _Windows - - -#if defined(_WINDOWS) || defined(__WIN32__) || defined(_Windows) -#include <windows.h> -#ifdef __WIN32__ -DECLARE_HANDLE(thandle_t); /* Win32 file handle */ -#else -typedef HFILE thandle_t; /* client data handle */ -#endif -#else -typedef void* thandle_t; /* client data handle */ -#endif - -#ifndef NULL -#define NULL 0 -#endif - -/* - * Flags to pass to TIFFPrintDirectory to control - * printing of data structures that are potentially - * very large. Bit-or these flags to enable printing - * multiple items. - */ -#define TIFFPRINT_NONE 0x0 /* no extra info */ -#define TIFFPRINT_STRIPS 0x1 /* strips/tiles info */ -#define TIFFPRINT_CURVES 0x2 /* color/gray response curves */ -#define TIFFPRINT_COLORMAP 0x4 /* colormap */ -#define TIFFPRINT_JPEGQTABLES 0x100 /* JPEG Q matrices */ -#define TIFFPRINT_JPEGACTABLES 0x200 /* JPEG AC tables */ -#define TIFFPRINT_JPEGDCTABLES 0x200 /* JPEG DC tables */ - -/* - * RGBA-style image support. - */ -typedef unsigned char TIFFRGBValue; /* 8-bit samples */ -typedef struct _TIFFRGBAImage TIFFRGBAImage; -/* - * The image reading and conversion routines invoke - * ``put routines'' to copy/image/whatever tiles of - * raw image data. A default set of routines are - * provided to convert/copy raw image data to 8-bit - * packed ABGR format rasters. Applications can supply - * alternate routines that unpack the data into a - * different format or, for example, unpack the data - * and draw the unpacked raster on the display. - */ -typedef void (*tileContigRoutine) - (TIFFRGBAImage*, uint32TIFF*, uint32TIFF, uint32TIFF, uint32TIFF, uint32TIFF, int32TIFF, int32TIFF, - unsigned char*); -typedef void (*tileSeparateRoutine) - (TIFFRGBAImage*, uint32TIFF*, uint32TIFF, uint32TIFF, uint32TIFF, uint32TIFF, int32TIFF, int32TIFF, - unsigned char*, unsigned char*, unsigned char*, unsigned char*); -/* - * RGBA-reader state. - */ -typedef struct { /* YCbCr->RGB support */ - TIFFRGBValue* clamptab; /* range clamping table */ - int* Cr_r_tab; - int* Cb_b_tab; - int32TIFF* Cr_g_tab; - int32TIFF* Cb_g_tab; - float coeffs[3]; /* cached for repeated use */ -} TIFFYCbCrToRGB; - -struct _TIFFRGBAImage { - TIFF* tif; /* image handle */ - int stoponerr; /* stop on read error */ - int isContig; /* data is packed/separate */ - int alpha; /* type of alpha data present */ - uint32TIFF width; /* image width */ - uint32TIFF height; /* image height */ - uint16TIFF bitspersample; /* image bits/sample */ - uint16TIFF samplesperpixel; /* image samples/pixel */ - uint16TIFF orientation; /* image orientation */ - uint16TIFF photometric; /* image photometric interp */ - uint16TIFF* redcmap; /* colormap pallete */ - uint16TIFF* greencmap; - uint16TIFF* bluecmap; - /* get image data routine */ - int (*get)(TIFFRGBAImage*, uint32TIFF*, uint32TIFF, uint32TIFF); - union { - void (*any)(TIFFRGBAImage*); - tileContigRoutine contig; - tileSeparateRoutine separate; - } put; /* put decoded strip/tile */ - TIFFRGBValue* Map; /* sample mapping array */ - uint32TIFF** BWmap; /* black&white map */ - uint32TIFF** PALmap; /* palette image map */ - TIFFYCbCrToRGB* ycbcr; /* YCbCr conversion state */ - - int row_offset; - int col_offset; -}; - -/* - * Macros for extracting components from the - * packed ABGR form returned by TIFFReadRGBAImage. - */ -#define TIFFGetR(abgr) ((abgr) & 0xff) -#define TIFFGetG(abgr) (((abgr) >> 8) & 0xff) -#define TIFFGetB(abgr) (((abgr) >> 16) & 0xff) -#define TIFFGetA(abgr) (((abgr) >> 24) & 0xff) - -/* - * A CODEC is a software package that implements decoding, - * encoding, or decoding+encoding of a compression algorithm. - * The library provides a collection of builtin codecs. - * More codecs may be registered through calls to the library - * and/or the builtin implementations may be overridden. - */ -typedef int (*TIFFInitMethod)(TIFF*, int); -typedef struct { - char* name; - uint16TIFF scheme; - TIFFInitMethod init; -} TIFFCodec; - -#include <stdio.h> -#include <stdarg.h> - -#if defined(__cplusplus) -extern "C" { -#endif -typedef void (*TIFFErrorHandler)(const char*, const char*, va_list); -typedef tsize_t (*TIFFReadWriteProc)(thandle_t, tdata_t, tsize_t); -typedef toff_t (*TIFFSeekProc)(thandle_t, toff_t, int); -typedef int (*TIFFCloseProc)(thandle_t); -typedef toff_t (*TIFFSizeProc)(thandle_t); -typedef int (*TIFFMapFileProc)(thandle_t, tdata_t*, toff_t*); -typedef void (*TIFFUnmapFileProc)(thandle_t, tdata_t, toff_t); -typedef void (*TIFFExtendProc)(TIFF*); - -extern const char* TIFFGetVersion(void); - -extern const TIFFCodec* TIFFFindCODEC(uint16TIFF); -extern TIFFCodec* TIFFRegisterCODEC(uint16TIFF, const char*, TIFFInitMethod); -extern void TIFFUnRegisterCODEC(TIFFCodec*); - -extern tdata_t _TIFFmalloc(tsize_t); -extern tdata_t _TIFFrealloc(tdata_t, tsize_t); -extern void _TIFFmemset(tdata_t, int, tsize_t); -extern void _TIFFmemcpy(tdata_t, const tdata_t, tsize_t); -extern int _TIFFmemcmp(const tdata_t, const tdata_t, tsize_t); -extern void _TIFFfree(tdata_t); - -extern void TIFFClose(TIFF*); -extern int TIFFFlush(TIFF*); -extern int TIFFFlushData(TIFF*); -extern int TIFFGetField(TIFF*, ttag_t, ...); -extern int TIFFVGetField(TIFF*, ttag_t, va_list); -extern int TIFFGetFieldDefaulted(TIFF*, ttag_t, ...); -extern int TIFFVGetFieldDefaulted(TIFF*, ttag_t, va_list); -extern int TIFFReadDirectory(TIFF*); -extern tsize_t TIFFScanlineSize(TIFF*); -extern tsize_t TIFFRasterScanlineSize(TIFF*); -extern tsize_t TIFFStripSize(TIFF*); -extern tsize_t TIFFVStripSize(TIFF*, uint32TIFF); -extern tsize_t TIFFTileRowSize(TIFF*); -extern tsize_t TIFFTileSize(TIFF*); -extern tsize_t TIFFVTileSize(TIFF*, uint32TIFF); -extern uint32TIFF TIFFDefaultStripSize(TIFF*, uint32TIFF); -extern void TIFFDefaultTileSize(TIFF*, uint32TIFF*, uint32TIFF*); -extern int TIFFFileno(TIFF*); -extern int TIFFGetMode(TIFF*); -extern int TIFFIsTiled(TIFF*); -extern int TIFFIsByteSwapped(TIFF*); -extern int TIFFIsUpSampled(TIFF*); -extern int TIFFIsMSB2LSB(TIFF*); -extern uint32TIFF TIFFCurrentRow(TIFF*); -extern tdir_t TIFFCurrentDirectory(TIFF*); -extern tdir_t TIFFNumberOfDirectories(TIFF*); -extern uint32TIFF TIFFCurrentDirOffset(TIFF*); -extern tstrip_t TIFFCurrentStrip(TIFF*); -extern ttile_t TIFFCurrentTile(TIFF*); -extern int TIFFReadBufferSetup(TIFF*, tdata_t, tsize_t); -extern int TIFFWriteBufferSetup(TIFF*, tdata_t, tsize_t); -extern int TIFFWriteCheck(TIFF*, int, const char *); -extern int TIFFCreateDirectory(TIFF*); -extern int TIFFLastDirectory(TIFF*); -extern int TIFFSetDirectory(TIFF*, tdir_t); -extern int TIFFSetSubDirectory(TIFF*, uint32TIFF); -extern int TIFFUnlinkDirectory(TIFF*, tdir_t); -extern int TIFFSetField(TIFF*, ttag_t, ...); -extern int TIFFVSetField(TIFF*, ttag_t, va_list); -extern int TIFFWriteDirectory(TIFF *); -extern int TIFFReassignTagToIgnore(enum TIFFIgnoreSense, int); - -#if defined(c_plusplus) || defined(__cplusplus) -extern void TIFFPrintDirectory(TIFF*, FILE*, long = 0); -extern int TIFFReadScanline(TIFF*, tdata_t, uint32TIFF, tsample_t = 0); -extern int TIFFWriteScanline(TIFF*, tdata_t, uint32TIFF, tsample_t = 0); -extern int TIFFReadRGBAImage(TIFF*, uint32TIFF, uint32TIFF, uint32TIFF*, int = 0); -#else -extern void TIFFPrintDirectory(TIFF*, FILE*, long); -extern int TIFFReadScanline(TIFF*, tdata_t, uint32TIFF, tsample_t); -extern int TIFFWriteScanline(TIFF*, tdata_t, uint32TIFF, tsample_t); -extern int TIFFReadRGBAImage(TIFF*, uint32TIFF, uint32TIFF, uint32TIFF*, int); -#endif - -extern int TIFFReadRGBAStrip(TIFF*, tstrip_t, uint32TIFF * ); -extern int TIFFReadRGBATile(TIFF*, uint32TIFF, uint32TIFF, uint32TIFF * ); -extern int TIFFRGBAImageOK(TIFF*, char [1024]); -extern int TIFFRGBAImageBegin(TIFFRGBAImage*, TIFF*, int, char [1024]); -extern int TIFFRGBAImageGet(TIFFRGBAImage*, uint32TIFF*, uint32TIFF, uint32TIFF); -extern void TIFFRGBAImageEnd(TIFFRGBAImage*); -extern TIFF* TIFFOpen(const char*, const char*); -extern TIFF* TIFFFdOpen(int, const char*, const char*); -extern TIFF* TIFFClientOpen(const char*, const char*, - thandle_t, - TIFFReadWriteProc, TIFFReadWriteProc, - TIFFSeekProc, TIFFCloseProc, - TIFFSizeProc, - TIFFMapFileProc, TIFFUnmapFileProc); -extern const char* TIFFFileName(TIFF*); -extern void TIFFError(const char*, const char*, ...); -extern void TIFFWarning(const char*, const char*, ...); -extern TIFFErrorHandler TIFFSetErrorHandler(TIFFErrorHandler); -extern TIFFErrorHandler TIFFSetWarningHandler(TIFFErrorHandler); -extern TIFFExtendProc TIFFSetTagExtender(TIFFExtendProc); -extern ttile_t TIFFComputeTile(TIFF*, uint32TIFF, uint32TIFF, uint32TIFF, tsample_t); -extern int TIFFCheckTile(TIFF*, uint32TIFF, uint32TIFF, uint32TIFF, tsample_t); -extern ttile_t TIFFNumberOfTiles(TIFF*); -extern tsize_t TIFFReadTile(TIFF*, - tdata_t, uint32TIFF, uint32TIFF, uint32TIFF, tsample_t); -extern tsize_t TIFFWriteTile(TIFF*, - tdata_t, uint32TIFF, uint32TIFF, uint32TIFF, tsample_t); -extern tstrip_t TIFFComputeStrip(TIFF*, uint32TIFF, tsample_t); -extern tstrip_t TIFFNumberOfStrips(TIFF*); -extern tsize_t TIFFReadEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t); -extern tsize_t TIFFReadRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t); -extern tsize_t TIFFReadEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t); -extern tsize_t TIFFReadRawTile(TIFF*, ttile_t, tdata_t, tsize_t); -extern tsize_t TIFFWriteEncodedStrip(TIFF*, tstrip_t, tdata_t, tsize_t); -extern tsize_t TIFFWriteRawStrip(TIFF*, tstrip_t, tdata_t, tsize_t); -extern tsize_t TIFFWriteEncodedTile(TIFF*, ttile_t, tdata_t, tsize_t); -extern tsize_t TIFFWriteRawTile(TIFF*, ttile_t, tdata_t, tsize_t); -extern void TIFFSetWriteOffset(TIFF*, toff_t); -extern void TIFFSwabShort(uint16TIFF*); -extern void TIFFSwabLong(uint32TIFF*); -extern void TIFFSwabDouble(double*); -extern void TIFFSwabArrayOfShort(uint16TIFF*, unsigned long); -extern void TIFFSwabArrayOfLong(uint32TIFF*, unsigned long); -extern void TIFFSwabArrayOfDouble(double*, unsigned long); -extern void TIFFReverseBits(unsigned char *, unsigned long); -extern const unsigned char* TIFFGetBitRevTable(int); -#if defined(__cplusplus) -} -#endif -#endif /* _TIFFIO_ */ diff --git a/Utilities/CAI/cai_dll/inc/tiffiop.h b/Utilities/CAI/cai_dll/inc/tiffiop.h deleted file mode 100755 index e86fff4deb..0000000000 --- a/Utilities/CAI/cai_dll/inc/tiffiop.h +++ /dev/null @@ -1,279 +0,0 @@ -/* $Header: tiffiop.h,v 1.3 01/01/15 15:24:34 cmf Exp $ */ - -/* - * Copyright (c) 1988-1997 Sam Leffler - * Copyright (c) 1991-1997 Silicon Graphics, Inc. - * - * Permission to use, copy, modify, distribute, and sell this software and - * its documentation for any purpose is hereby granted without fee, provided - * that (i) the above copyright notices and this permission notice appear in - * all copies of the software and related documentation, and (ii) the names of - * Sam Leffler and Silicon Graphics may not be used in any advertising or - * publicity relating to the software without the specific, prior written - * permission of Sam Leffler and Silicon Graphics. - * - * THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND, - * EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY - * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. - * - * IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR - * ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, - * OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, - * WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF - * LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE - * OF THIS SOFTWARE. - */ - -#ifndef _TIFFIOP_ -#define _TIFFIOP_ -/* - * ``Library-private'' definitions. - */ -/* - * UNIX systems should run the configure script to generate - * a port.h file that reflects the system capabilities. - * Doing this obviates all the dreck done in tiffcomp.h. - */ -#if defined(unix) || defined(__unix) -#include "port.h" -#include "tiffconf.h" -#else -#include "tiffconf.h" -#include "tiffcomp.h" -#endif -#include "tiffio.h" -#include "tif_dir.h" - -#ifndef TRUE -#define TRUE 1 -#define FALSE 0 -#endif - -/* - * Typedefs for ``method pointers'' used internally. - */ -typedef unsigned char tidataval_t; /* internal image data value type */ -typedef tidataval_t* tidata_t; /* reference to internal image data */ - -typedef void (*TIFFVoidMethod)(TIFF*); -typedef int (*TIFFBoolMethod)(TIFF*); -typedef int (*TIFFPreMethod)(TIFF*, tsample_t); -typedef int (*TIFFCodeMethod)(TIFF*, tidata_t, tsize_t, tsample_t); -typedef int (*TIFFSeekMethod)(TIFF*, uint32); -typedef void (*TIFFPostMethod)(TIFF*, tidata_t, tsize_t); -typedef int (*TIFFVSetMethod)(TIFF*, ttag_t, va_list); -typedef int (*TIFFVGetMethod)(TIFF*, ttag_t, va_list); -typedef void (*TIFFPrintMethod)(TIFF*, FILE*, long); -typedef uint32 (*TIFFStripMethod)(TIFF*, uint32); -typedef void (*TIFFTileMethod)(TIFF*, uint32*, uint32*); - -struct tiff { - char* tif_name; /* name of open file */ - int tif_fd; /* open file descriptor */ - int tif_mode; /* open mode (O_*) */ - uint32 tif_flags; -#define TIFF_FILLORDER 0x0003 /* natural bit fill order for machine */ -#define TIFF_DIRTYHEADER 0x0004 /* header must be written on close */ -#define TIFF_DIRTYDIRECT 0x0008 /* current directory must be written */ -#define TIFF_BUFFERSETUP 0x0010 /* data buffers setup */ -#define TIFF_CODERSETUP 0x0020 /* encoder/decoder setup done */ -#define TIFF_BEENWRITING 0x0040 /* written 1+ scanlines to file */ -#define TIFF_SWAB 0x0080 /* byte swap file information */ -#define TIFF_NOBITREV 0x0100 /* inhibit bit reversal logic */ -#define TIFF_MYBUFFER 0x0200 /* my raw data buffer; free on close */ -#define TIFF_ISTILED 0x0400 /* file is tile, not strip- based */ -#define TIFF_MAPPED 0x0800 /* file is mapped into memory */ -#define TIFF_POSTENCODE 0x1000 /* need call to postencode routine */ -#define TIFF_INSUBIFD 0x2000 /* currently writing a subifd */ -#define TIFF_UPSAMPLED 0x4000 /* library is doing data up-sampling */ -#define TIFF_STRIPCHOP 0x8000 /* enable strip chopping support */ - toff_t tif_diroff; /* file offset of current directory */ - toff_t tif_nextdiroff; /* file offset of following directory */ - TIFFDirectory tif_dir; /* internal rep of current directory */ - TIFFHeader tif_header; /* file's header block */ - tidata_t tif_clientdir; /* client TIFF directory */ - const int* tif_typeshift; /* data type shift counts */ - const long* tif_typemask; /* data type masks */ - uint32 tif_row; /* current scanline */ - tdir_t tif_curdir; /* current directory (index) */ - tstrip_t tif_curstrip; /* current strip for read/write */ - toff_t tif_curoff; /* current offset for read/write */ - toff_t tif_dataoff; /* current offset for writing dir */ -#if SUBIFD_SUPPORT - uint16 tif_nsubifd; /* remaining subifds to write */ - toff_t tif_subifdoff; /* offset for patching SubIFD link */ -#endif -/* tiling support */ - uint32 tif_col; /* current column (offset by row too) */ - ttile_t tif_curtile; /* current tile for read/write */ - tsize_t tif_tilesize; /* # of bytes in a tile */ -/* compression scheme hooks */ - TIFFBoolMethod tif_setupdecode;/* called once before predecode */ - TIFFPreMethod tif_predecode; /* pre- row/strip/tile decoding */ - TIFFBoolMethod tif_setupencode;/* called once before preencode */ - TIFFPreMethod tif_preencode; /* pre- row/strip/tile encoding */ - TIFFBoolMethod tif_postencode; /* post- row/strip/tile encoding */ - TIFFCodeMethod tif_decoderow; /* scanline decoding routine */ - TIFFCodeMethod tif_encoderow; /* scanline encoding routine */ - TIFFCodeMethod tif_decodestrip;/* strip decoding routine */ - TIFFCodeMethod tif_encodestrip;/* strip encoding routine */ - TIFFCodeMethod tif_decodetile; /* tile decoding routine */ - TIFFCodeMethod tif_encodetile; /* tile encoding routine */ - TIFFVoidMethod tif_close; /* cleanup-on-close routine */ - TIFFSeekMethod tif_seek; /* position within a strip routine */ - TIFFVoidMethod tif_cleanup; /* cleanup state routine */ - TIFFStripMethod tif_defstripsize;/* calculate/constrain strip size */ - TIFFTileMethod tif_deftilesize;/* calculate/constrain tile size */ - tidata_t tif_data; /* compression scheme private data */ -/* input/output buffering */ - tsize_t tif_scanlinesize;/* # of bytes in a scanline */ - tsize_t tif_scanlineskew;/* scanline skew for reading strips */ - tidata_t tif_rawdata; /* raw data buffer */ - tsize_t tif_rawdatasize;/* # of bytes in raw data buffer */ - tidata_t tif_rawcp; /* current spot in raw buffer */ - tsize_t tif_rawcc; /* bytes unread from raw buffer */ -/* memory-mapped file support */ - tidata_t tif_base; /* base of mapped file */ - toff_t tif_size; /* size of mapped file region (bytes) */ - TIFFMapFileProc tif_mapproc; /* map file method */ - TIFFUnmapFileProc tif_unmapproc;/* unmap file method */ -/* input/output callback methods */ - thandle_t tif_clientdata; /* callback parameter */ - TIFFReadWriteProc tif_readproc; /* read method */ - TIFFReadWriteProc tif_writeproc;/* write method */ - TIFFSeekProc tif_seekproc; /* lseek method */ - TIFFCloseProc tif_closeproc; /* close method */ - TIFFSizeProc tif_sizeproc; /* filesize method */ -/* post-decoding support */ - TIFFPostMethod tif_postdecode; /* post decoding routine */ -/* tag support */ - TIFFFieldInfo** tif_fieldinfo; /* sorted table of registered tags */ - int tif_nfields; /* # entries in registered tag table */ - TIFFVSetMethod tif_vsetfield; /* tag set routine */ - TIFFVGetMethod tif_vgetfield; /* tag get routine */ - TIFFPrintMethod tif_printdir; /* directory print routine */ -}; - -#define isPseudoTag(t) (t > 0xffff) /* is tag value normal or pseudo */ - -#define isTiled(tif) (((tif)->tif_flags & TIFF_ISTILED) != 0) -#define isMapped(tif) (((tif)->tif_flags & TIFF_MAPPED) != 0) -#define isFillOrder(tif, o) (((tif)->tif_flags & (o)) != 0) -#define isUpSampled(tif) (((tif)->tif_flags & TIFF_UPSAMPLED) != 0) -#define TIFFReadFile(tif, buf, size) \ - ((*(tif)->tif_readproc)((tif)->tif_clientdata,buf,size)) -#define TIFFWriteFile(tif, buf, size) \ - ((*(tif)->tif_writeproc)((tif)->tif_clientdata,buf,size)) -#define TIFFSeekFile(tif, off, whence) \ - ((*(tif)->tif_seekproc)((tif)->tif_clientdata,(toff_t)(off),whence)) -#define TIFFCloseFile(tif) \ - ((*(tif)->tif_closeproc)((tif)->tif_clientdata)) -#define TIFFGetFileSize(tif) \ - ((*(tif)->tif_sizeproc)((tif)->tif_clientdata)) -#define TIFFMapFileContents(tif, paddr, psize) \ - ((*(tif)->tif_mapproc)((tif)->tif_clientdata,paddr,psize)) -#define TIFFUnmapFileContents(tif, addr, size) \ - ((*(tif)->tif_unmapproc)((tif)->tif_clientdata,addr,size)) - -/* - * Default Read/Seek/Write definitions. - */ -#ifndef ReadOK -#define ReadOK(tif, buf, size) \ - (TIFFReadFile(tif, (tdata_t) buf, (tsize_t)(size)) == (tsize_t)(size)) -#endif -#ifndef SeekOK -#define SeekOK(tif, off) \ - (TIFFSeekFile(tif, (toff_t) off, SEEK_SET) == (toff_t) off) -#endif -#ifndef WriteOK -#define WriteOK(tif, buf, size) \ - (TIFFWriteFile(tif, (tdata_t) buf, (tsize_t) size) == (tsize_t) size) -#endif - -/* NB: the uint32 casts are to silence certain ANSI-C compilers */ -#define TIFFhowmany(x, y) ((((uint32)(x))+(((uint32)(y))-1))/((uint32)(y))) -#define TIFFroundup(x, y) (TIFFhowmany(x,y)*((uint32)(y))) - -#if defined(__cplusplus) -extern "C" { -#endif -extern int _TIFFgetMode(const char*, const char*); -extern int _TIFFNoRowEncode(TIFF*, tidata_t, tsize_t, tsample_t); -extern int _TIFFNoStripEncode(TIFF*, tidata_t, tsize_t, tsample_t); -extern int _TIFFNoTileEncode(TIFF*, tidata_t, tsize_t, tsample_t); -extern int _TIFFNoRowDecode(TIFF*, tidata_t, tsize_t, tsample_t); -extern int _TIFFNoStripDecode(TIFF*, tidata_t, tsize_t, tsample_t); -extern int _TIFFNoTileDecode(TIFF*, tidata_t, tsize_t, tsample_t); -extern void _TIFFNoPostDecode(TIFF*, tidata_t, tsize_t); -extern int _TIFFNoPreCode (TIFF*, tsample_t); -extern int _TIFFNoSeek(TIFF*, uint32); -extern void _TIFFSwab16BitData(TIFF*, tidata_t, tsize_t); -extern void _TIFFSwab32BitData(TIFF*, tidata_t, tsize_t); -extern void _TIFFSwab64BitData(TIFF*, tidata_t, tsize_t); -extern int TIFFFlushData1(TIFF*); -extern void TIFFFreeDirectory(TIFF*); -extern int TIFFDefaultDirectory(TIFF*); -extern int TIFFSetCompressionScheme(TIFF*, int); -extern int TIFFSetDefaultCompressionState(TIFF*); -extern uint32 _TIFFDefaultStripSize(TIFF*, uint32); -extern void _TIFFDefaultTileSize(TIFF*, uint32*, uint32*); - -extern void _TIFFsetByteArray(void**, void*, long); -extern void _TIFFsetString(char**, char*); -extern void _TIFFsetShortArray(uint16**, uint16*, long); -extern void _TIFFsetLongArray(uint32**, uint32*, long); -extern void _TIFFsetFloatArray(float**, float*, long); -extern void _TIFFsetDoubleArray(double**, double*, long); - -extern void _TIFFprintAscii(FILE*, const char*); -extern void _TIFFprintAsciiTag(FILE*, const char*, const char*); - -GLOBALDATA(TIFFErrorHandler,_TIFFwarningHandler); -GLOBALDATA(TIFFErrorHandler,_TIFFerrorHandler); - -extern int TIFFInitDumpMode(TIFF*, int); -#ifdef PACKBITS_SUPPORT -extern int TIFFInitPackBits(TIFF*, int); -#endif -#ifdef CCITT_SUPPORT -extern int TIFFInitCCITTRLE(TIFF*, int), TIFFInitCCITTRLEW(TIFF*, int); -extern int TIFFInitCCITTFax3(TIFF*, int), TIFFInitCCITTFax4(TIFF*, int); -#endif -#ifdef THUNDER_SUPPORT -extern int TIFFInitThunderScan(TIFF*, int); -#endif -#ifdef NEXT_SUPPORT -extern int TIFFInitNeXT(TIFF*, int); -#endif -#ifdef LZW_SUPPORT -extern int TIFFInitLZW(TIFF*, int); -#endif -#ifdef OJPEG_SUPPORT -extern int TIFFInitOJPEG(TIFF*, int); -#endif -#ifdef JPEG_SUPPORT -extern int TIFFInitJPEG(TIFF*, int); -#endif -#ifdef JBIG_SUPPORT -extern int TIFFInitJBIG(TIFF*, int); -#endif -#ifdef ZIP_SUPPORT -extern int TIFFInitZIP(TIFF*, int); -#endif -#ifdef PIXARLOG_SUPPORT -extern int TIFFInitPixarLog(TIFF*, int); -#endif -#ifdef LOGLUV_SUPPORT -extern int TIFFInitSGILog(TIFF*, int); -#endif -#ifdef VMS -extern const TIFFCodec _TIFFBuiltinCODECS[]; -#else -extern TIFFCodec _TIFFBuiltinCODECS[]; -#endif - -#if defined(__cplusplus) -} -#endif -#endif /* _TIFFIOP_ */ diff --git a/Utilities/CAI/cai_dll/inc/uvcode.h b/Utilities/CAI/cai_dll/inc/uvcode.h deleted file mode 100755 index 8d96e44583..0000000000 --- a/Utilities/CAI/cai_dll/inc/uvcode.h +++ /dev/null @@ -1,173 +0,0 @@ -/* Version 1.0 generated April 7, 1997 by Greg Ward Larson, SGI */ -#define UV_SQSIZ (float)0.003500 -#define UV_NDIVS 16289 -#define UV_VSTART (float)0.016940 -#define UV_NVS 163 -static struct { - float ustart; - short nus, ncum; -} uv_row[UV_NVS] = { - (float)0.247663, 4, 0, - (float)0.243779, 6, 4, - (float)0.241684, 7, 10, - (float)0.237874, 9, 17, - (float)0.235906, 10, 26, - (float)0.232153, 12, 36, - (float)0.228352, 14, 48, - (float)0.226259, 15, 62, - (float)0.222371, 17, 77, - (float)0.220410, 18, 94, - (float)0.214710, 21, 112, - (float)0.212714, 22, 133, - (float)0.210721, 23, 155, - (float)0.204976, 26, 178, - (float)0.202986, 27, 204, - (float)0.199245, 29, 231, - (float)0.195525, 31, 260, - (float)0.193560, 32, 291, - (float)0.189878, 34, 323, - (float)0.186216, 36, 357, - (float)0.186216, 36, 393, - (float)0.182592, 38, 429, - (float)0.179003, 40, 467, - (float)0.175466, 42, 507, - (float)0.172001, 44, 549, - (float)0.172001, 44, 593, - (float)0.168612, 46, 637, - (float)0.168612, 46, 683, - (float)0.163575, 49, 729, - (float)0.158642, 52, 778, - (float)0.158642, 52, 830, - (float)0.158642, 52, 882, - (float)0.153815, 55, 934, - (float)0.153815, 55, 989, - (float)0.149097, 58, 1044, - (float)0.149097, 58, 1102, - (float)0.142746, 62, 1160, - (float)0.142746, 62, 1222, - (float)0.142746, 62, 1284, - (float)0.138270, 65, 1346, - (float)0.138270, 65, 1411, - (float)0.138270, 65, 1476, - (float)0.132166, 69, 1541, - (float)0.132166, 69, 1610, - (float)0.126204, 73, 1679, - (float)0.126204, 73, 1752, - (float)0.126204, 73, 1825, - (float)0.120381, 77, 1898, - (float)0.120381, 77, 1975, - (float)0.120381, 77, 2052, - (float)0.120381, 77, 2129, - (float)0.112962, 82, 2206, - (float)0.112962, 82, 2288, - (float)0.112962, 82, 2370, - (float)0.107450, 86, 2452, - (float)0.107450, 86, 2538, - (float)0.107450, 86, 2624, - (float)0.107450, 86, 2710, - (float)0.100343, 91, 2796, - (float)0.100343, 91, 2887, - (float)0.100343, 91, 2978, - (float)0.095126, 95, 3069, - (float)0.095126, 95, 3164, - (float)0.095126, 95, 3259, - (float)0.095126, 95, 3354, - (float)0.088276, 100, 3449, - (float)0.088276, 100, 3549, - (float)0.088276, 100, 3649, - (float)0.088276, 100, 3749, - (float)0.081523, 105, 3849, - (float)0.081523, 105, 3954, - (float)0.081523, 105, 4059, - (float)0.081523, 105, 4164, - (float)0.074861, 110, 4269, - (float)0.074861, 110, 4379, - (float)0.074861, 110, 4489, - (float)0.074861, 110, 4599, - (float)0.068290, 115, 4709, - (float)0.068290, 115, 4824, - (float)0.068290, 115, 4939, - (float)0.068290, 115, 5054, - (float)0.063573, 119, 5169, - (float)0.063573, 119, 5288, - (float)0.063573, 119, 5407, - (float)0.063573, 119, 5526, - (float)0.057219, 124, 5645, - (float)0.057219, 124, 5769, - (float)0.057219, 124, 5893, - (float)0.057219, 124, 6017, - (float)0.050985, 129, 6141, - (float)0.050985, 129, 6270, - (float)0.050985, 129, 6399, - (float)0.050985, 129, 6528, - (float)0.050985, 129, 6657, - (float)0.044859, 134, 6786, - (float)0.044859, 134, 6920, - (float)0.044859, 134, 7054, - (float)0.044859, 134, 7188, - (float)0.040571, 138, 7322, - (float)0.040571, 138, 7460, - (float)0.040571, 138, 7598, - (float)0.040571, 138, 7736, - (float)0.036339, 142, 7874, - (float)0.036339, 142, 8016, - (float)0.036339, 142, 8158, - (float)0.036339, 142, 8300, - (float)0.032139, 146, 8442, - (float)0.032139, 146, 8588, - (float)0.032139, 146, 8734, - (float)0.032139, 146, 8880, - (float)0.027947, 150, 9026, - (float)0.027947, 150, 9176, - (float)0.027947, 150, 9326, - (float)0.023739, 154, 9476, - (float)0.023739, 154, 9630, - (float)0.023739, 154, 9784, - (float)0.023739, 154, 9938, - (float)0.019504, 158, 10092, - (float)0.019504, 158, 10250, - (float)0.019504, 158, 10408, - (float)0.016976, 161, 10566, - (float)0.016976, 161, 10727, - (float)0.016976, 161, 10888, - (float)0.016976, 161, 11049, - (float)0.012639, 165, 11210, - (float)0.012639, 165, 11375, - (float)0.012639, 165, 11540, - (float)0.009991, 168, 11705, - (float)0.009991, 168, 11873, - (float)0.009991, 168, 12041, - (float)0.009016, 170, 12209, - (float)0.009016, 170, 12379, - (float)0.009016, 170, 12549, - (float)0.006217, 173, 12719, - (float)0.006217, 173, 12892, - (float)0.005097, 175, 13065, - (float)0.005097, 175, 13240, - (float)0.005097, 175, 13415, - (float)0.003909, 177, 13590, - (float)0.003909, 177, 13767, - (float)0.002340, 177, 13944, - (float)0.002389, 170, 14121, - (float)0.001068, 164, 14291, - (float)0.001653, 157, 14455, - (float)0.000717, 150, 14612, - (float)0.001614, 143, 14762, - (float)0.000270, 136, 14905, - (float)0.000484, 129, 15041, - (float)0.001103, 123, 15170, - (float)0.001242, 115, 15293, - (float)0.001188, 109, 15408, - (float)0.001011, 103, 15517, - (float)0.000709, 97, 15620, - (float)0.000301, 89, 15717, - (float)0.002416, 82, 15806, - (float)0.003251, 76, 15888, - (float)0.003246, 69, 15964, - (float)0.004141, 62, 16033, - (float)0.005963, 55, 16095, - (float)0.008839, 47, 16150, - (float)0.010490, 40, 16197, - (float)0.016994, 31, 16237, - (float)0.023659, 21, 16268, -}; diff --git a/Utilities/CAI/cai_dll/inc/version.h b/Utilities/CAI/cai_dll/inc/version.h deleted file mode 100755 index 0638b1f3c6..0000000000 --- a/Utilities/CAI/cai_dll/inc/version.h +++ /dev/null @@ -1 +0,0 @@ -#define VERSION "LIBTIFF, Version 3.5.5\nCopyright (c) 1988-1996 Sam Leffler\nCopyright (c) 1991-1996 Silicon Graphics, Inc." diff --git a/Utilities/CAI/cai_dll/lib/hd421md.lib b/Utilities/CAI/cai_dll/lib/hd421md.lib deleted file mode 100755 index 3f0bcc8cd247270dd944014eb35894be8ce016f2..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 86972 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 b7TTSdw?C<n1^~)mriA={s*w5ytgHV4jJbg~ diff --git a/Utilities/CAI/cai_dll/lib/hm421md.lib b/Utilities/CAI/cai_dll/lib/hm421md.lib deleted file mode 100755 index 4e336528d4e156577125a55f270e97857c68ebeb..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17280 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 H^PK(%et-SH diff --git a/Utilities/CAI/cai_dll/lib/libjpeg.lib b/Utilities/CAI/cai_dll/lib/libjpeg.lib deleted file mode 100755 index 63cedb3a355ab1071cbb44606931753f4a5023de..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 233802 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Ÿ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ȼq#sT>pw_e{o)_rjxzf{{Aj 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ⅈK7v$YUlqh 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%0Aokv(Ky;t>R ze8|y>Z^h{mC>oQMiRt{Os8-GZQWt&J7@Te|OK=&DVmL3+1)&Z}JZ7j2xcnf&<?^wZ z|A97&Idd#vFe}BmWCMmAX)%~=#ExIgMQX6;DnP-+@1hh11|3t5Rd@l0eI=es!|_<j zTcQ7+ZTA<)pt&-laoGIbs0YLnqaG-j?wGl5uqS1pTxf<>*KCPlzC<~qM7v{Fl#}>0 zTXCms);L@vazTXB(L{HrXTqJbLL*BVJ@Pv-%u{rHr{Yc_m=$-*3XNmkJIg1<FwfJj zt{$Z^5I%|JY{iRmpT-e>%!NY<vouy}*E8WoVO`J!6XXXqC`SzY-D{95-o!L3UX&KN zoA-6AmO^Dm+#THNn--L>z7dMfNy4#}o1Yp&Iown|f3+FLR(|8M)i*Q9%`qneNSaX0 zX?YElsYkKMuVsrul~oIEmyON3yjN;SR=lg<4<gDHSAY(ZIW}Xg@=@pbUk5dWyI0OP zG`&$ndOgPvExIkFg2?BKc=8;7h+I{p<nV2^Th4%IP{Xl?t*8x?0dq{lv430PJ0G57 z2moV+uNZ#08b$)*VTEra;LID%R`}*2ufGCZil(qInO67$fXUKuR``m6?^}Rr>8Db6 zGJFpK=2;DAh3_ytc-H@frZ^DJDt)bhc`*)-^>Lci2FYo@q!OpCIC#Z5_^Y@t1ciSt z<K9BVxW2VRR$u65o(~t~HSWQtN%li`%Q_?otCtn7aC;C(a#Ovc%2BK@v53;+xN}ns zU0YheD!-P<Gu>HUNXN;;x@uZ(c!!U7c*48X8K<vy%iJ5vp^%P8uo%R70!&?luE;gM zr@7ZRxWevJ58LFLk2)p>VX*<;-1+i-0i4uMcLr=&0b-H2FlvLvwu28CRF~XEvDh?! zd0DC0%3N#B!UqY4q<V3ZLq>pk6d(?zVP3VRN82&!AY{xh2;%s7u%a4BFGV$o?&PBo z-GvKvgD|N9ap+?Z(X4V`&sBrhHV4m<_@~(F@VrRc?!%LFrrI(8H*7S>F@CCiupY$G zY^k~wDi2mf1GAp<@3mhScN_qeSm6`~i(qojzgK!hi7Rst1PvL5E~5~d3q(m_!naz# zO$9g&5aFj%$lXX9_vN8LcA0273TLt50G|&t!mGI`3<$J}JnTRwd2q9hhnbO&;fMVK z{cdpOyoQyf*M0kLIO;2K(A<YjMw+{&8Ey@`m{44Zl{a$46*;f2>?7u8b=n~hUE~LW z#p8Yi6$wF2h%Hr2&Bnz_v_UjxKLXm^Ej*J(bZnR02~BZg-?f0@@aebj6H^OuQd=VO zv2lLR*LI+<+0LhCp=FZ+-z~+>M&OGWxctTX{yA?@^s5j<D%9mg0bt4SjHPhxUk^1P zV!-9jC`PmaamQ?C4&l*j93}857LEqIii%51AX*(!hj*mryt-zJc&Y8J5u;wRzZe07 z{abxSQKN6Vx{)AZoH?(euzYJSjCgY*c|Y)p!s7z$1>jfcS7G#*2`kOQwvx%LeG5^e zII_S*VgC%pf<obn-%stSc)2&ehwToEAQz5l+$dtL?-k8&Bk4gLUP`Dmmb-i7Izs+i zaivG5_@J3n3w#RYGk+6hvb^pMxr9R%iz!~j(lLpBl*gRlZWu(bS<cc4#w@4oeCT+a zrN}3F4-VVma$M~*Zg55K#>xJ`jVCsC=nIQbgvxdWTDs~VM1MWLIDp_K`#k#w+a))5 zSrm%<qXTde<8#GRY?I=aylc4amG|`0&`7f2%jV^Aw;Z8=ULY@07NqLN0QNQhP8YV$ z+@GZb9~vA;x5e&93Y?<E!MaTswqjHvG$@lfzfcrFM3^_HePs%&z|+ZlO;F_cug3jA z<*6YB!2>iNF*j8#cZzl@d6e{|W4JkxB3>T#ia5sR##Ic6HCafWPbQD#8}7VnWcqN6 zk}|n6L=)RpsTjhqwCTliL`?;%blg1uBU*CXn|<wvweaH#F|{7;8NP!=M};w{VOKp+ z7uI|%n+=*kc&9@iPNVH0D`_<?GNs%elH#R$Px{zmr@N6`4Ex_Q_ltI9C=FTQEya9S z&h9mJNJv)O-}^>f&1k3|wnN#`dCSlv#)@l?7b~H`EM}&rbyWuL$sa^Q5i+$xghtfk zw$VVQFryC>IJxE%`)Bsoc!(ZLiYkn$F0jy;?UeoQE~Hf62?6$O$&O_|gd5qYH#F#( zNM*Jt$whhlF%V%li%Q3(xpUDlZ$RXEx}zagpazF`WF*WzgHX___1zt{u^n<umd(zV zhcC8wvmK6vUA99tJ_gG&-%!JwnupN-YOxQ$4ooE(>K+Hu$MJ=uk_Y6wCD0};N*$um zg{w;LM-E}wxIH)vT@Q^7nw*hUUeB3mBx#}7tUU)h;!;)YwOgQWSWNS(OSJAt8j>xl zTxyWcIRvmYclbEcsK?wla@tWQez%kYj|-(4N`)!6_DC2>PF}P|7J&`*I4w(*Ws5fV zBRf%B*CNFnHvyN9G$Z+u^i8~oGc%A*W)R$9IuGFkk<gEPkghN-Ya)i1KJ~yf0R!&` zsMkDHSSm0E(FWxtky^VA8B9ahBexV=k6+d2XBe;5{Sq~bp%6*$^|?1*r|5(MrRg|Q z;DefAskH+4VWB{kbJL`pgEHUioP=eIoF>O9=nRHI@-a@m%5kcU<5XFXaVn!7+3*-u zE@K)r2B|x|iOpmauMow?roZDWzD=;Te6^H}MHT<K1iMJ(l8;#siF<dnXY91NgWzg$ z^z}z3$98^P$IvKB25sa-Q^pV1|BOzs83>5E?Uy`bKoLrlrr&2mC*VGVX5Y@Ss0tG^ z$RE<2icawM(g{Deq7%$RN?AU>C)OU0VZK^pcG~>X7a9V!iw!P`<-;vQ;*QozXDD|g zjO)+i9{gb}t{XMxGoc)CU&2yZ_e9dQG0eAV%%@K|Fc8Arg=1&jT@+VL+h!aa1Hnwb zhQ(7R&Vo)(a6;T@iUWgA&iTOk?M2m9<rVWGXe;VdvA7z1_DVHp)Um22w4x?NeuOKs z<M-N8PI`+S_~^^87#-Vz_qA~c{wEYR&&z0f+kuk}F2VF7U#lJf(*d_%!?IUd?fBjS z43{D_eD$^iXMaQkN-$RVUIg3$4SO<t@0}*Tr%@iyvjM`G_)c#}Dmk;mb>4-c5o({s zsS~%5OTAJdw-Qx?qdpAT17eaQoH$4BD)ER?A4YVix+JW0NaF;(`7RC@;T@jLJslfl zso-<{e)kXB!flI;sZi(~-B)eelmS0dyS%o1JUKF}xw{578Weym_qcr{QoHCRsTD1Z z6U)4u-PK+(Y)Mxs1QmduhXZc4Muw18T<SeX!Ik2sFxAiJ`;7@s++bI745VWC=0b?6 z4fRzkYwQU8D#WNZPB}TdS0#(x;;tZ4$L#||uLNAhC8g&2kb4Ny@?~OB7WUnSv?gSJ z6LYwO4;WOR%;^x=%^fnbT5+0L9RUSV$m)2N)nRI)&1~gfS?2dFW;7pJ^drkoWLb)B zQkB*%r(6GmBp~(Pws-A09V;~>0{M?kMg&gOcX90=o6#ZPA+r^c$r`sqYrU+64pRjj z0^45T0|q&j?V1?B%DH#`ip48K3*(OwzRW4Y*&R>3CzG2%H)q1_N%eTrc9r}2U+QYZ zSI@b31YDKzt1R2t-eWHR*=)>`rMZ3Ngx|(uXaAw$Y@9fcfw<Fc9<#brYGU5^n@MlS zFwc>AN#E#>nMAt88B)#0x4>Q9C{xpkISE9kAaf3hij*Y3-O8F3O3<W|?yWJz<cBX^ zyqrSK<pnL}T0Q^PayboQRvD{j2{l)oYF5e2G-cP4t~*rDDjy;{IXbVs%_=TE!fFs~ za&bSa7rO2kHgMe-*rlyz0T*CW<KTLmRXhlP5n!%}gR{aH1Wa)poE5(70J9_x&I(@$ zFze&sdc#+Y^tEUhvs|q3{V(7?JOw@v3hXFgoGA+1$;xjCV9t+&>n(ltK$EUvPL;lg z0Qc-E@XZ5~U8jlfBDAL~*hOHNkKWSfhkH=Nz$%SZ`OO2|ic{cYeS8}*&&R=8;rkO{ z-j0J~`c7}vfXTtBIOj6o2p|2HG1n0~PqCJ91{cFRCir-KDFzwiQ}z8V&L>w@q8Lm_ z(o`iR9TOmj&4L7)vZt;C0OXyVDE;U`V;JPUG|lyxWGcuZnd>y>`i!}GMt-4@UsP`7 z7t8Iakv}t%UwMNu`>^4YcfCF_=4Kf8%tIU<`B}VU(~<982+VPM=r(Oy4Tsp;V;8<? z(2eC{M6ErL0f$lsr5FI%2!`UX)+-E6!+NGsvv_Y|I4ATT#s?orD#KkJC6Q(;`$}Y5 zp-94dC8cRoJw8EEm|F8;q@YrIio(NCzLnB+2UV*HXUvYQPpx@VPQC~vB|7kpIZMvG zUxQt*F+{#Md~^|{)E%t|of|%SQ)puE>%h*mxP=wg1d=6iBJf~Yg^Obj(UOZaU{wfm zo5NgI41}EjwKK||Va~`~x#0jT@Tb<yRg=}i#An<lS76ewG=3E(R~T4ynnZ(|fk+zV zPC|CJjD*+<a*kF%A?{L<Pj{-A;oDq@$V1KL*PHUNi(O(Wma8RNE;kN364zpzHhl(k zvD!&Sc4+XD<NgJ(M>VXeWe$!YhUoIUfaUi!mY?-H8nlyC&`!Lfr3gsNrXw+4l{zFw z{BauOgrEj}Ga}_l1O*e*aKO9_@>jt%HUGLE^bIACaji_3TyMyR#C^C~n{wIpWz$9S z7M8CnT@W~fboDGAM#@tj8We~uoo~RdcwLY$=k#LH#GG}NP*+@RmCq1d>(R*Ohc{Rr z%ru{3_tEQCgVA7N?$K2WvYV{TOkmB%U-hpku+ackruItMzvA`gvc=2))Ai;HA1{7J zCO2VC!SYhH9%kX45shHnl$pVoo=Q=seqF9?y~>y_qf7@0W4+$|N6yb4w&D`u8iaA~ z|8wZcSnQW;%xb;Kk0R}2>k(Jt3bfCnUldubKzomiQvr=yfznpRhcwJ-e7-oL^|mIB zU#U4I4ChLkJF6yM6w4R4iZrAUC1O5(dJtDJEV18T^u6^l%y&q<O3q0lX3j8)X}01d zsn<Aeo)-K`4D)|$S67cTb8nr9*@}~7p2jicsr!$`Fh8wb$w`u!W^xcGVjk3k%ZRmU zPx9kQ^IpL=IIvu3{-|CyPY=wAoFsFHUcA~$stIe5_}(c_`C$z6TN?8aiJ2dtXqTQX zlQVc?E{4cl@Q$?FX-vc&p3tI+ddFh!V3sXfR#m;a9JlazoyokZBey0CA!MSuiaaYy zZobB&o%PrJ1y#7T)D1*BYJlE1Lt0=(w{Y=lo^){S6xHz*w`p2dt~5c#IYl>IQl>|u z`l-uCXN-;~&7EpzHG1sjaU3%)xwCo*L)C@44tm>J@%TBx^dk8p2$-|Y=|cktZU3*f z^9hL}isQIZuuI6|p@S&I+8?Y8-5^A_!b8@jf=&?~TtY#2krZ<U1r?%B!yfY1HP%aY z?9?IHym%4WvzIO&I<KH7_51m~8E0pg!4>ksZ)X|aeCPd{_xpX{d-MB^A}ut`z<B1~ zn8gke;}~#3`Ih{=6d{hGe{2!2tb9LD!Q+|z-6CE}?RM2y^Ks?N2=A7kC#Z2;eP1iz z)G2srfy}jtx2Akw8}M42K~Pd^geIoP(5+_cbY$-s9RO=gOR#G2X|yCa!<xXi8M|GQ z9tj+XmbfjsCh3;I0?>ajb*w^4!mNWWv+I&Ol6w*u!>|NSg1x*UVb_FRBeWdc1;)%1 zd{+X?$Vwha?n_`nG9c!+(W_&>1nc-v@<=i$8IZs~m==xv2hoxvE*O_eqsb$=u5Sp^ z+L2>0NT{!4XRPwJm!4;iyvmpTL$5N{_veJ3aRn_+(v@_IwX9vK$nAQITKtgEjh!WX zMWW-=PU*_$m76%9vkRW_vfe*Jsjqumns;aeSi#hv)ym92!mxW<^9A`SKT7HoBWc`O zcT&7TTZ!iVs1CNCD-Li|P_=Tfh<LJY3<AAO(onJr(_@B|1SIKI^&w&v>bu2uuYJq8 z3UdX|1}Ug5Nax54i}U&E_w}r>?Mz>&A?leGH{xkbmGvE3>n$;}$A{xC55N9^v}Tdb zuG5cdE8p6YZ*2GPhtO&U&w%sIu4h!>MQvo9mvtIgrQNw-ddU64wJ|10cv(j|1S2zw z-0bJf$h~;sB>+mjliSr0nGs7$G$A{Nhh_;%k!WHkj?bYrNXvUeJ7Ml8?xgfmW0}!T z(K5$*P^W#2)fYbwLgZKeSv;ttt$|L9B0JCLw>s~*NJE&c!bE;Sn{vf>6S?B7vef+@ bpP60ExliD*ZO5{yowA@?ZX++;xx0J}f*!J? diff --git a/Utilities/CAI/cai_dll/lib/tiff.lib b/Utilities/CAI/cai_dll/lib/tiff.lib deleted file mode 100755 index 9ea4ec10a02a06d6670b58f1a30624226a662fb7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21044 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 XHc{v*a^on0IQDsk!nd0hO!NN$Lz<ij diff --git a/Utilities/CAI/cai_dll/lib/unix2win.lib b/Utilities/CAI/cai_dll/lib/unix2win.lib deleted file mode 100755 index 5a7f5551b2e943a26b1bb48d3c622096dda94ce1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27558 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 LFG^y6?&<#m(leKJ diff --git a/Utilities/CAI/cai_dll/src/CMakeLists.txt b/Utilities/CAI/cai_dll/src/CMakeLists.txt deleted file mode 100755 index 3a6e63d003..0000000000 --- a/Utilities/CAI/cai_dll/src/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -# Sources of non-templated classes. - -SET(CAI_SRCS - cai_fonctions.c - cai_bsq.c - cai_bip.c - cai_inria.c - cai_onera.c - cai_bil.c - cai_lum.c - cai_gessimu.c - cai_grilles.c - cai_tiff.c - cai_jpeg.c - cai_rasterfile.c - cai_DonAux.c - cai_radar.c - cai_spot.c - cai_bandeau.c - ) - -ADD_LIBRARY(cai ${CAI_SRCS}) - -INSTALL_TARGETS(/lib/otb cai ) -INSTALL_FILES(/include/otb/Utilities/CAI "(\\.h)$") diff --git a/Utilities/CAI/cai_dll/src/cai_DonAux.c b/Utilities/CAI/cai_dll/src/cai_DonAux.c deleted file mode 100755 index 1bd123f3df..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_DonAux.c +++ /dev/null @@ -1,3873 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET: COUCHE ACCES IMAGE */ -/* */ -/* */ -/* NOM DU MODULE : CAI_DONAUX.c */ -/* */ -/* DATE DE CREATION: Janvier 95 */ -/* AUTEUR: jl PASCAL m RAYNAL (CISI) */ -/* */ -/* ROLE: ce module est charge de toutes les operations de lecture/ecriture */ -/* sur les fichiers de donnees auxiliaires. */ -/* il permet en outre de creer un nouveau fichier,ou de detruire un */ -/* fichier existant */ -/* */ -/* */ -/* */ -/* LANGAGE: C */ -/* VERSION: V1 */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prototypage des fonctions */ -/*****************************************************************************/ -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ -#include <stdio.h> -#include <string.h> -#include <stdlib.h> -#include <sys/types.h> -#include <sys/stat.h> -#include <fcntl.h> -#include <malloc.h> -#include <limits.h> -#include <ctype.h> -#include <unistd.h> -#include <errno.h> -#include <sys/uio.h> - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers de CONSTANTES (.cct) */ -/*---------------------------------------------------------------------------*/ -#define _CAI_IMAGE -#define IN_CAI_DA - -#include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_DonAux.c,v 1.10 01/01/15 15:24:40 cmf Exp $"; - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers de TYPES (.cty) */ -/*---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des AUTRES fichiers */ -/*---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------*/ -/* Definition des CONSTANTES propres */ -/*---------------------------------------------------------------------------*/ -#define maxi(a,b) ((a) > (b) ? (a) : (b)) -#define mini(a,b) ((a) > (b) ? (b) : (a)) -/*---------------------------------------------------------------------------*/ -/* Definition des TYPES propres */ -/*---------------------------------------------------------------------------*/ -typedef enum { CAI_DEBUT = 0 , CAI_ETAT31 = 1 } CAI_ETAT3; -typedef enum { CAI_INFERIEUR = 0 , CAI_SUPERIEUR = 1 , CAI_FIN = 2 , CAI_AUTRES = 3 } CAI_EVT3; -typedef enum { CAI_DEBUTDEC = 0 , CAI_ETAT11 = 1 , CAI_ETAT12 = 2 , CAI_ETAT13 = 3 , - CAI_ETAT14 = 4 , CAI_FINDEC = 5 , CAI_BLOCVIDE=6 , CAI_ERR11 = 11 , CAI_ERR13 =13} CAI_ETAT1; -typedef enum { CAI_PAR_OUV = 0 , CAI_PAR_FERM = 1 , CAI_DONNEE = 2 , CAI_INF = 3 , - CAI_BLANC = 4 } CAI_EVT1; -typedef enum { CAI_DEBUTYPE = 0 , CAI_ETAT21 = 1 , CAI_ETAT22 = 2 , CAI_ETAT23 = 3 , - CAI_ENTIER = 4 , CAI_ASC = 5 , CAI_REEL = 6 , CAI_ERR21 = 11 } CAI_ETAT2; -typedef enum { CAI_POINT = 0 , CAI_GUILL = 1 , CAI_ESPACE = 2 , CAI_CHIFFRE = 3 , - CAI_SIGNE = 4 , CAI_AUTRE = 5 } CAI_EVT2; - - - -/*---------------------------------------------------------------------------*/ -/* Declaration des OPERATIONS INTERNES (static) */ -/*---------------------------------------------------------------------------*/ -static CAI_OK_KO cai_lirecleDA(CAI_FILE_DA *fd,long ad_deb,char * mot_cle, - long *ad_suiv,long * ad_deb_mcc); - static CAI_OK_KO cai_liredonneeDA(CAI_FILE_DA *fd,long ad_deb, void **don_lue, - CAI_TYPE *type_lu,int *nb_lig_lu, - int *nb_col_lu, long *taille_cell_lu ); - static CAI_OK_KO cai_deplaceficDA(CAI_FILE_DA *fd ,long debut,long deplacement); - static CAI_OK_KO cai_lireficDA(CAI_FILE_DA *fd,long ad_deb,char *buff); - static CAI_OK_KO cai_ecrireficDA(CAI_FILE_DA *fd,long ad_deb, - long taille, char **buff ); - static CAI_OK_KO cai_decodedonDA(long taille_buf, char buff[],long ad_deb, - CAI_TYPE *type_lu,int *nb_lig_lu,int *nb_elt_lu, - int *nb_elt_alloc,long *taille_cell_lu, - void **don_lue, CAI_ETAT1 *etat1,long *ad_fin_dec); - static CAI_OK_KO cai_analyseDA(char car, CAI_EVT1 *evt2); - static CAI_OK_KO cai_typeDA(char car, CAI_EVT2 *evt2); - static CAI_OK_KO cai_recherchecleDA(long taille_buf,char *buff, - long ad_deb,char *mot_cle,long *ad_suiv); - static CAI_OK_KO cai_mot_cleDA(char car, CAI_EVT3 *evt3); - static CAI_OK_KO cai_ecritDA_buf(CAI_FILE_DA *fd,char *mot_cle, - CAI_TYPE type,int nb_lig,int nb_col, - long taille_cell, void *donnee, - int indic_ecrit,char **da_ascii); - - -/*---------------------------------------------------------------------------*/ -/* Definition des RESSOURCES IMPORTEES (extern) */ -/*---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------*/ -/* Definition des RESSOURCES EXPORTEES */ -/*---------------------------------------------------------------------------*/ - - - -/*---------------------------------------------------------------------------*/ -/* Definition des RESSOURCES PROPRES (static) */ -/*---------------------------------------------------------------------------*/ - -static int autom1[6][5]={{ 1,11,11, 6, 0}, - { 2,11,11,13, 1}, - {11, 4, 3,13, 2}, - {11, 4, 3,13, 3}, - { 2, 5,11,13, 4}}; - -static int autom2[4][6]={{ 3, 2,11, 1, 1,11}, - { 3,11, 4, 1,11,11}, - { 2, 5, 2, 2, 2, 2}, - { 3,11, 6, 3, 3, 3}}; - -static int autom3[2][4]={{ 1, 0, -1, 0}, - { -25, 2, -24, 1}}; - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION: cai_openDA */ -/* */ -/* ROLE: Cette operation externe est charge d'ouvrir le fichier de donnees */ -/* auxiliaires .Elle retourne une structure de type CAI_FILE_DA qui permet */ -/* par la suite de manipuler le contenu du fichier . */ -/* mode d'ouverture CAI_ECRITURE ou CAI_LECTURE */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* */ -/* VERSION: */ -/* CODES RETOUR: CAI_OK ou CAI_KO */ -/* " erreur a l'ouverture du fichier %s " */ -/* " erreur d'allocation memoire " */ -/*****************************************************************************/ -CAI_FILE_DA *cai_openDA(char *nom_fichier, char *type_image, - int nb_can,CAI_MODE_OUVERTURE mode_ouv) -{ -int flags; /* flag utilise pour la fonction open */ -int mode; /* valeur du umask utilise pou la fonction open */ -int fd; /* descripteur du fichier ouvert */ -CAI_FILE_DA *donaux; /* structure descriptive du fichier de donnees auxiliaires */ -CAI_CHAINE fichier_da; /*fichier de donnees auxiliaires */ -int i; /* indice de boucle */ -int canal; /* flag indiquant si je suis en mono ou en multispectral */ -int trouve; /* flag indiquant si le format a ete reconnu */ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -donaux = NULL; -strcpy(fichier_da,nom_fichier); -/*-- on concatene a la fin le CAI_SUF_FORMAT en fonction du format de l'image traitee --*/ -if (nb_can ==1 ) - { -/*--- cas monospectral ---*/ - canal=0; - } -else - { -/*--- cas multispectral ---*/ - canal=1; - } - -/* reconnaissance du format */ -trouve=0; -for( i = 0 ; i< CAI_NB_FORMAT ; i++) - { - - if(strcmp(type_image,CAI_NOM_FORMAT[i]) == 0 ) - { - strcat(fichier_da,CAI_SUF_FORMAT[canal][i]); - trouve=1; - } - } -if (trouve == 0) - { - sprintf(CAI_ERREUR,"Erreur: format de l'image non reconnu ( %s )",type_image); - goto ERREUR; - } - -/*-- on concatene a la fin du nom de fichier le CAI_SUF_FORMAT des donnees auxiliaires --*/ -strcat(fichier_da,CAI_SUFFIXE_DA); - -/*CD allocation dynamique de la structure de donnees auxiliaires */ -donaux = (CAI_FILE_DA *)malloc(sizeof(CAI_FILE_DA)); -if (donaux == NULL) - { - sprintf(CAI_ERREUR,"Erreur d'allocation a l'ouverture du fichier de donnees auxiliaires %s",fichier_da); - goto ERREUR; - } - -/*CD en fonction du mode d'ouverture , ouverture du fichier */ -if (mode_ouv == CAI_LECTURE) - { - flags = O_RDONLY; - fd = open(fichier_da,flags); - } -else - { - flags = O_RDWR|O_CREAT; - mode = PERMS; - fd = open(fichier_da,flags,mode); - } -/*CD si erreur on sort avec messsage " erreur a l'ouverture */ -if (fd == -1) - { - sprintf(CAI_ERREUR,"Erreur a l'ouverture du fichier de donnees auxiliaires %s",fichier_da); - if (donaux != NULL) - { - free(donaux); - donaux = NULL; - - } - - goto ERREUR; - } -else - { -/*CD initialisations des pointeurs de la structure CAI_FILE_DA */ -/*CD ( buffers de lecture , liste de mots cles , longueurs ...) */ - strcpy(donaux->nom_fichier,fichier_da); - donaux->descr = fd; - donaux->buffer=NULL; - donaux->taille_buffer = CAI_TAILLE_BUFFER; - donaux->taille_buffer_lu=0; - donaux->num_buffer=-1; - donaux->liste_mot_cle=NULL; - donaux->ad_mot_cle=NULL; - donaux->ad_donnee=NULL; - donaux->nb_mot_cle=-1; - donaux->ad_dern_mot_cle=-1; -/*CD allocation dynamique du buffer */ - donaux->buffer = (char *)malloc(CAI_TAILLE_BUFFER + 1); - if (donaux->buffer == NULL) - { - sprintf(CAI_ERREUR,"Erreur d'allocation a l'ouverture du fichier de donnees auxiliaires %s",fichier_da); - if (donaux != NULL) - { - free(donaux); - donaux = NULL; - - } - - goto ERREUR; - } - - } -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas nominal */ -/*---------------------------------------------------------------------------*/ -return(donaux); -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas d'erreur */ -/*---------------------------------------------------------------------------*/ -ERREUR: - return(NULL); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_closeDA */ -/* */ -/* ROLE: Cette operation externe est chargee de fermer le fichier de donnees */ -/* auxiliaires precedenment ouvert ( operation cai_openDA ) */ -/* la zone memoire reservee lors des operations precedentes dans la structure*/ -/* CAI_FILE_DA */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* CODES RETOUR: CAI_OK ou CAI_KO */ -/* " erreur a la fermeture du fichier %s " */ -/*****************************************************************************/ -CAI_OK_KO cai_closeDA(CAI_FILE_DA *fd) - -{ -CAI_OK_KO retour; /* code retour appel fonction */ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -retour = CAI_OK; - -if (fd ==NULL) - { - retour = CAI_ERREUR_OUV; - sprintf(CAI_ERREUR,"Erreur a la fermeture d'un fichier de donnees auxiliaires "); - goto ERREUR; - } -close(fd->descr); -/*CD fermeture du fichier */ -/* desallocation des buffer alloues */ -/*CD si le pointeurs de la structure CAI_FILE_DA sont <> NULL */ -/*CD la memoire allouee est liberee */ -if (fd->buffer != NULL) - { - free(fd->buffer); - fd->buffer = NULL; - } -if (fd->liste_mot_cle != NULL) - { - free(fd->liste_mot_cle); - fd->liste_mot_cle = NULL; - } -if (fd->ad_mot_cle != NULL) - { - free(fd->ad_mot_cle); - fd->ad_mot_cle= NULL; - } -if (fd->ad_donnee != NULL) - { - free(fd->ad_donnee); - fd->ad_donnee = NULL; - } - -free(fd); -fd = NULL; -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas nominal */ -/*---------------------------------------------------------------------------*/ -return(retour); -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas degrade */ -/*---------------------------------------------------------------------------*/ -ERREUR: - -return(retour); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_removeDA */ -/* */ -/* ROLE: Cette operation externe est charge de detruire un fichier de donnees*/ -/* auxiliaires. */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* CODES RETOUR: CAI_OK ou CAI_KO */ -/* " erreur a la destrucution du fichier %s " */ -/*****************************************************************************/ -CAI_OK_KO cai_removeDA(char *nom_fichier,char *type_image,int nb_can) - -{ -int cr; /* code retour */ -CAI_CHAINE fichier_da; /*fichier de donnees auxiliaires */ -int i; /* indice de boucle */ -int canal; /* flag indiquant si je suis en mono ou en multispectral */ -int trouve; /* flag indiquant si le format a ete reconnu */ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -strcpy(fichier_da,nom_fichier); -/*-- on concatene a la fin le CAI_SUF_FORMAT en fonction du format de l'image traitee --*/ -if (nb_can ==1 ) - { -/*--- cas monospectral ---*/ - canal=0; - } -else - { -/*--- cas multispectral ---*/ - canal=1; - } - -/* reconnaissance du format */ -trouve=0; -for( i = 0 ; i< CAI_NB_FORMAT ; i++) - { - if(strcmp(type_image,CAI_NOM_FORMAT[i]) == 0 ) - { - strcat(fichier_da,CAI_SUF_FORMAT[canal][i]); - trouve=1; - } - } -if (trouve == 0) - { - sprintf(CAI_ERREUR,"Erreur: format de l'image non reconnu ( %s )",type_image); - goto ERREUR; - } - -/*-- on concatene a la fin du nom de fichier le CAI_SUF_FORMAT des donnees auxiliaires --*/ -strcat(fichier_da,CAI_SUFFIXE_DA); -cr=remove(fichier_da); -if (cr != 0) - { - sprintf(CAI_ERREUR,"destruction du fichier de donnees auxiliaires %s impossible",fichier_da); - goto ERREUR; - } -return(CAI_OK); -ERREUR: -return(CAI_KO); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_modifieDA */ -/* */ -/* ROLE: Cette operation modifie le contenu d'une donnee auxiliaire issue du*/ -/* fichier de DA. */ -/* Toutes les autres donnees sont conservees dans le fichier .Si le mot */ -/* cle n'est pas trouve, une erreur est detectee. */ -/* NB : le fichier doit au prealable avoir ete ouvert en mode CAI_ECRITURE */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* CODES RETOUR: CAI_OK ou CAI_KO */ -/* "erreur fichier ouvert en mode lecture " */ -/*****************************************************************************/ -CAI_OK_KO cai_modifieDA(CAI_FILE_DA *fd,char *mot_cle, - CAI_TYPE type,int nb_lig,int nb_col, - long taille_cell,void *donnee) -{ -int i; /* indice de boucle */ -int indic; /* indicateur de recherche du mot cle a modifier */ -long p1; /* pointeur sur le mot cle a modifier */ -long p2; /* pointeur sur le mot cle suivant */ -int num_mot_cle; /* numero du mot cle a modifier */ -CAI_OK_KO cr; /* code retour */ -off_t offset; -off_t offreel; -long taille_init; /* taille en octets de la donnee a modifier */ -long taille_fin; /* taille en octets de la donnee a modifier */ -int indic_ecrit; /* indicateur d'ecriture dans un fichier */ -char * da_ascii; /* pointeur sur la donnee formatee a ecrire */ -long deplacement; /* valeur du trou a faire dans le fichier */ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -da_ascii=NULL; -/*CD on verifie au prealable que le fichier est effectivement ouvert */ -/*CD SINON on sort en erreur */ -if ( fd ==NULL ) - { - cr = CAI_ERREUR_OUV; - sprintf(CAI_ERREUR,"Erreur ouverture du fichier de donnees auxiliaires"); - goto ERREUR; - } -/*---------------------------------------------------------------------------*/ -/*CD on appelle alors l'operation de liste de tous les mots cles */ -/*---------------------------------------------------------------------------*/ -/*CD si la liste n'existe pas */ -if (fd->nb_mot_cle == -1) - { - cr=cai_listeDA(fd); - if (cr != CAI_OK ) - { - goto ERREUR; - } - } - -i=0; -indic=CAI_NON_TROUVE; - -/*---------------------------------------------------------------------------*/ -/*CD recherche du mot cle */ -/*---------------------------------------------------------------------------*/ -while (indic == CAI_NON_TROUVE && i < fd->nb_mot_cle) - { - if (strncmp(mot_cle,(char *)(fd->liste_mot_cle + i),CAI_TAILLE_MAX_CLEDA) == 0 ) - { - indic = CAI_TROUVE; - num_mot_cle=i; - } - i++; - } -/*---------------------------------------------------------------------------*/ -/*CD SI le mot cle n'existe pas */ -/*---------------------------------------------------------------------------*/ -if (indic == CAI_NON_TROUVE) - { -/*CD ALORS on sort en erreur */ - cr=CAI_MC_INCONNU; - sprintf(CAI_ERREUR,"Erreur : le mot cle %s n'existe pas dans le fichier",mot_cle); - goto ERREUR; - } -else - { -/*---------------------------------------------------------------------------*/ -/*CD SINON on recupere le pointeur sur le mot cle dans le fichier (p1) */ -/*---------------------------------------------------------------------------*/ - p1 = *(fd->ad_mot_cle + num_mot_cle); -/*---------------------------------------------------------------------------*/ -/*CD ainsi que le pointeur sur le mot cle suivant (p2) */ -/*---------------------------------------------------------------------------*/ -/*CD SI le mot cle a modifier est le dernier mot cle */ - if ( num_mot_cle == fd->nb_mot_cle -1) - { -/*CD on se positionne sur la fin du fichier ( rewind ) */ - offset=0; - offreel=lseek(fd->descr,offset,SEEK_END); -/*CD SI erreur on sort "erreur lors d'un lseek du fichier de DA " */ - if ( offreel == -1) - { - cr=CAI_PB_LSEEK; - sprintf(CAI_ERREUR,"erreur lors du lseek sur le fichier %s",fd->nom_fichier); - goto ERREUR; - } - offreel=lseek(fd->descr,offset,SEEK_CUR); -/*CD SI erreur on sort "erreur lors d'un lseek du fichier de DA " */ - if ( offreel == -1) - { - cr=CAI_PB_LSEEK; - sprintf(CAI_ERREUR,"erreur lors du lseek sur le fichier %s",fd->nom_fichier); - goto ERREUR; - } - p2=offreel; - } - else -/*CD SINON */ - { - p2= *(fd->ad_mot_cle + num_mot_cle+1); - } -/*CD FIN SI le mot cle a modifier est le dernier mot cle */ -/*---------------------------------------------------------------------------*/ -/*CD la taille de la donnee a modifier est p2 - p1 octets ti */ -/*---------------------------------------------------------------------------*/ - taille_init = p2 - p1; -/*---------------------------------------------------------------------------*/ -/*CD on formate dans une chaine de caracteres la donnee a ecrire */ -/*CD (operation interne)( terminee par un \0) */ -/*---------------------------------------------------------------------------*/ - indic_ecrit=0; - cr=cai_ecritDA_buf(fd, /* [E] file descriptor du fichier de DA */ - mot_cle, /* [E] mot cle associe aux donnees auxiliaires */ - type, /* [E] type des donnees a ecrire */ - nb_lig, /* [E] nombre de lignes du tableau a ecrire */ - nb_col, /* [E] nombre de colonnes du tableau a ecrire */ - taille_cell, /* [E] taille maxi en octets d'un element */ - /* (significatif si type = ascii) */ - donnee, /* [E] pointeur sur la zone memoire a ecrire */ - indic_ecrit, /* [E] indicateur si ecriture du buffer dans */ - /* le fichier (=1) sinon (=0) */ - &da_ascii /* buffer de la DA en ascii (sous forme */ - /* de x fois CAI_TAILLE_MAX_LIGDA caracteres) */ - ); - if (cr != CAI_OK) - { - goto ERREUR; - } -/*CD la taille de la donnee a ecrire est la taille de la chaine tf*/ - taille_fin=(long)strlen(da_ascii); -/*---------------------------------------------------------------------------*/ -/*CD on cree alors un trou dans le fichier de DA de taille tf-ti */ -/*CD en commencant a l'adresse p2 ( operation interne ) */ -/*---------------------------------------------------------------------------*/ - deplacement= taille_fin -taille_init; - cr=cai_deplaceficDA( - fd , /* [E] file descripteur du fichier ouvert en lecture ecriture */ - p2, /* [E] adresse de debut de la zone a deplacer */ - deplacement/* [E] valeur deplacement <0 on racourcit le fichier */ - /* valeur deplacement >0 on allonge le fichier */ - ); - if (cr != CAI_OK) - { - goto ERREUR; - } - -/*---------------------------------------------------------------------------*/ -/*CD on ecrit alors la donnee a ecrire a partir de l'adresse p1 */ -/*CD (operation interne qui ecrit directement la chaine ) */ -/*CD de caracteres precedente) */ -/*---------------------------------------------------------------------------*/ - cr=cai_ecrireficDA( - fd, /* [E] structure decrivant le fichier de donnees auxiliaires */ - p1, /* [E] adresse dans le fichier ou ecrire le buffer */ - taille_fin, /* [E] taille de la chaine ascii a ecrire */ - &da_ascii /* [E] chaine a ecrire*/ - ); - if (cr != CAI_OK) - { - goto ERREUR; - } -/*CD liberation de la chaine de caracteres allouee */ - if ( da_ascii != NULL) - { - free(da_ascii); - da_ascii = NULL; - } - } -/*CD FINSI le mot cle existe */ -/*---------------------------------------------------------------------------*/ -/*CD on met a jour la structure CAI_FILE_DA ( buffer , liste ...) */ -/*---------------------------------------------------------------------------*/ -fd->num_buffer=-1; -fd->nb_mot_cle=-1; -if (fd->liste_mot_cle != NULL) - { - free(fd->liste_mot_cle); - fd->liste_mot_cle=NULL; - } -if (fd->ad_mot_cle != NULL) - { - free(fd->ad_mot_cle); - fd->ad_mot_cle= NULL; - } -if (fd->ad_donnee != NULL) - { - free(fd->ad_donnee); - fd->ad_donnee= NULL; - } -fd->ad_dern_mot_cle=-1; -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas nominal */ -/*---------------------------------------------------------------------------*/ -return(CAI_OK); -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas d'erreur */ -/*---------------------------------------------------------------------------*/ -ERREUR: -if (da_ascii != NULL) - { - free(da_ascii); - da_ascii=NULL; - } -/*---------------------------------------------------------------------------*/ -/*CD on met a jour la structure CAI_FILE_DA ( buffer , liste ...) */ -/*---------------------------------------------------------------------------*/ -fd->num_buffer=-1; -fd->nb_mot_cle=-1; -if (fd->liste_mot_cle != NULL) - { - free(fd->liste_mot_cle); - fd->liste_mot_cle = NULL; - } -if (fd->ad_mot_cle != NULL) - { - free(fd->ad_mot_cle); - fd->ad_mot_cle=NULL; - } -if (fd->ad_donnee != NULL) - { - free(fd->ad_donnee); - fd->ad_donnee=NULL; - } -fd->ad_dern_mot_cle=-1; -return(cr); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_detruitDA */ -/* */ -/* ROLE: Cette operation detruit le contenu d'une donnee auxiliaire issue du*/ -/* fichier de DA. */ -/* Toutes les autres donnees sont conservees dans le fichier . */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* CODES RETOUR: CAI_OK ou CAI_KO */ -/* "erreur fichier ouvert en mode lecture " */ -/*****************************************************************************/ -CAI_OK_KO cai_detruitDA(CAI_FILE_DA *fd,char *mot_cle) - -{ -int i; /* indice de boucle */ -int indic; /* indicateur de recherche du mot cle a modifier */ -long p1; /* pointeur sur le mot cle a modifier */ -long p2; /* pointeur sur le mot cle suivant */ -int num_mot_cle; /* numero du mot cle a modifier */ -CAI_OK_KO cr; /* code retour */ -off_t offset; -off_t offreel; -long taille_init; /* taille en octets de la donnee a modifier */ -long deplacement; /* valeur du trou a faire dans le fichier */ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -/*CD on verifie au prealable que le fichier est effectivement ouvert */ -/*CD SINON on sort en erreur */ -if ( fd ==NULL ) - - { - cr = CAI_ERREUR_OUV; - sprintf(CAI_ERREUR,"Erreur ouverture du fichier de donnees auxiliaires"); - goto ERREUR; - } -/*---------------------------------------------------------------------------*/ -/*CD on appelle alors l'operation de liste de tous les mots cles */ -/*---------------------------------------------------------------------------*/ -/*CD si la liste n'existe pas */ -if (fd->nb_mot_cle == -1) - { - cr=cai_listeDA(fd); - if (cr != CAI_OK ) - { - goto ERREUR; - } - } - -i=0; -indic=CAI_NON_TROUVE; -/*---------------------------------------------------------------------------*/ -/*CD recherche du mot cle */ -/*---------------------------------------------------------------------------*/ -while (indic == CAI_NON_TROUVE && i < fd->nb_mot_cle) - { - if (strncmp(mot_cle,(char *)(fd->liste_mot_cle + i),CAI_TAILLE_MAX_CLEDA) == 0 ) - { - indic = CAI_TROUVE; - num_mot_cle=i; - } - i++; - } -/*---------------------------------------------------------------------------*/ -/*CD SI le mot cle n'existe pas */ -/*---------------------------------------------------------------------------*/ -if (indic == CAI_NON_TROUVE) - { -/*CD ALORS on sort en erreur */ - cr=CAI_MC_INCONNU; - sprintf(CAI_ERREUR,"Erreur : le mot cle %s n'existe pas dans le fichier",mot_cle); - goto ERREUR; - } -else - { -/*---------------------------------------------------------------------------*/ -/*CD SINON on recupere le pointeur sur le mot cle dans le fichier (p1) */ -/*---------------------------------------------------------------------------*/ - p1 = *(fd->ad_mot_cle + num_mot_cle); -/*---------------------------------------------------------------------------*/ -/*CD ainsi que le pointeur sur le mot cle suivant (p2) */ -/*---------------------------------------------------------------------------*/ -/*CD SI le mot cle a detruire est le dernier mot cle */ - if ( num_mot_cle == fd->nb_mot_cle -1) - { -/*CD on se positionne sur la fin du fichier ( rewind ) */ - offset=0; - offreel=lseek(fd->descr,offset,SEEK_END); -/*CD SI erreur on sort "erreur lors d'un lseek du fichier de DA " */ - if ( offreel == -1) - { - cr=CAI_PB_LSEEK; - sprintf(CAI_ERREUR,"erreur lors du lseek sur le fichier %s",fd->nom_fichier); - goto ERREUR; - } - offreel=lseek(fd->descr,offset,SEEK_CUR); -/*CD SI erreur on sort "erreur lors d'un lseek du fichier de DA " */ - if ( offreel == -1) - { - cr=CAI_PB_LSEEK; - sprintf(CAI_ERREUR,"erreur lors du lseek sur le fichier %s",fd->nom_fichier); - goto ERREUR; - } - p2=offreel; - } - else -/*CD SINON */ - { - p2= *(fd->ad_mot_cle + num_mot_cle+1); - } -/*CD FIN SI le mot cle a detruire est le dernier mot cle */ -/*---------------------------------------------------------------------------*/ -/*CD la taille de la donnee a detruire est p2 - p1 octets ti */ -/*CD on cree alors un trou dans le fichier de DA de taille ti(<0) */ -/*CD en commencant a l'adresse p2 ( operation interne ) */ -/*---------------------------------------------------------------------------*/ - taille_init = p2 - p1; - deplacement= -taille_init; - cr=cai_deplaceficDA( - fd , /* [E] file descripteur du fichier ouvert en lecture ecriture */ - p2, /* [E] adresse de debut de la zone a deplacer */ - deplacement/* [E] valeur deplacement <0 on racourcit le fichier */ - /* valeur deplacement >0 on allonge le fichier */ - ); - if (cr != CAI_OK) - { - goto ERREUR; - } - - } -/*CD FINSI le mot cle existe */ -/*---------------------------------------------------------------------------*/ -/*CD on met a jour la structure CAI_FILE_DA ( buffer , liste ...) */ -/*---------------------------------------------------------------------------*/ -fd->num_buffer=-1; -fd->nb_mot_cle=-1; -if (fd->liste_mot_cle != NULL) - { - free(fd->liste_mot_cle); - fd->liste_mot_cle=NULL; - } -if (fd->ad_mot_cle != NULL) - { - free(fd->ad_mot_cle); - fd->ad_mot_cle=NULL; - } -if (fd->ad_donnee != NULL) - { - free(fd->ad_donnee); - fd->ad_donnee=NULL; - } -fd->ad_dern_mot_cle=-1; -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas nominal */ -/*---------------------------------------------------------------------------*/ -fd->num_buffer=-1; -fd->nb_mot_cle=-1; -if (fd->liste_mot_cle != NULL) - { - free(fd->liste_mot_cle); - fd->liste_mot_cle=NULL; - - } -if (fd->ad_mot_cle != NULL) - { - free(fd->ad_mot_cle); - fd->ad_mot_cle=NULL; - - } -if (fd->ad_donnee != NULL) - { - free(fd->ad_donnee); - fd->ad_donnee=NULL; - - } -fd->ad_dern_mot_cle=-1; -return(CAI_OK); -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas d'erreur */ -/*---------------------------------------------------------------------------*/ -ERREUR: -return(cr); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_caractDA */ -/* */ -/* ROLE: cette operation externe est chargee de trouver le type et la taille*/ -/* d'une donnee auxiliaire lue dans un fichier precedenment ouvert. */ -/* Il s'agit donc apres localisation du mot cle de lire le type de la donne*/ -/* puis de compter le nombres de cellules de ce type dans la ligne. */ -/* Dans le cas d'une donnee de type CAI_ASCII la taille maxi de la cellule est */ -/* aussi indiquee a l'appelant. */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* cette operation doit etre appele apres ouverture prealable du fichier */ -/* de donnees auxiliaires. */ -/* */ -/* VERSION: */ -/* CODES RETOUR: CAI_OK ou CAI_KO */ -/* si CAI_KO l'erreur peut etre affiche via la variable globale CAI_ERREUR */ -/* " fichier de donnees auxiliaires %s non ouvert" */ -/* " mot cle non present dans le fichier de donnees auxiliaires %s" */ -/* " aucun mot cle dans le fichier %s" */ -/* " taille du mot cle lue %s superieure a la limite %d ou egale a 0" */ -/* " erreur a la lecture du fichier de donnees auxiliaires %s" */ -/* " parenthese ouvrante non detectee (mot cle %s ) */ -/* " parenthese fermante non detectee (mot cle %s ) */ -/* " nombre de niveaux de parentheses superieur a 2 ( mot cle %s ) */ -/* " % dimension du tableau non constante (mot cle %s) */ -/* " % dimension du tableau = 0 (mot cle %s) */ -/* " type de la donnee lue %s non reconnue (mot cle %s) */ -/* " erreur lors du decodage de la donnee lue %s" (mot cle) */ -/*****************************************************************************/ -CAI_OK_KO cai_lirecaractDA(CAI_FILE_DA *fd,char *mot_cle, - CAI_TYPE *type,int *nb_lig,int *nb_col, - long *taille_cell) -{ -CAI_MOT_CLE mot_cle_lu; /* mot cle courant lu dans le fichier */ -int indic_mot_cle; /* indicateur de recherche du mot cle */ -int num_mot_cle; /* numero du mot cle recherche */ -long ad_mot_cle; /* adresse du debut du mot cle courant */ -long ad_donnee; /* adresse de la donnee apres le mot cle trouve */ -long adresse_deb; /* adresse de debut de recherche du mot cle */ -CAI_OK_KO cr; /* code retour des operations */ -void *don_lue; /* donnees lue en interne par l'operation cai_liredonneeDA */ -int i; /* indice de boucle */ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -/*CD initialisations */ -indic_mot_cle = CAI_NON_TROUVE; -num_mot_cle=0; -i=0; -ad_donnee=0; -cr=CAI_OK; -don_lue=NULL; - -/*CD on verifie au prealable que le fichier est effectivement ouvert */ -/*CD SINON on sort en erreur */ -if ( fd ==NULL ) - - { - cr = CAI_ERREUR_OUV; - sprintf(CAI_ERREUR,"Erreur ouverture du fichier de donnees auxiliaires"); - goto ERREUR; - } - -/*CD SI la liste des mots cles est en memoire */ -if ( fd->nb_mot_cle != -1 ) - { -/*---------------------------------------------------------------------------*/ -/*CD ALORS on scrute cette liste jusqu'a trouver le mot cle */ -/*---------------------------------------------------------------------------*/ - while (i< fd->nb_mot_cle && indic_mot_cle == CAI_NON_TROUVE ) - { - if ( strncmp(mot_cle,(char *)(fd->liste_mot_cle + i),CAI_TAILLE_MAX_CLEDA) == 0 ) - { - indic_mot_cle = CAI_TROUVE; - num_mot_cle = i; -/*CD on recupere alors le pointeur sur la zone fichier apres ce mot cle */ - ad_donnee=*(fd->ad_donnee + i); - strcpy(mot_cle_lu,(char *)(fd->liste_mot_cle +i)); - ad_mot_cle=*(fd->ad_mot_cle + i); - } - i++; - } - } -else - { -/*CD SINON */ -/*CD on se positionne au debut du fichier ( adresse_deb = 0) */ - adresse_deb = 0; -/*---------------------------------------------------------------------------*/ -/*CD on cherche le premier mot cle a partir de cette adresse (operation interne basee sur un automate) */ -/*---------------------------------------------------------------------------*/ - cr = cai_lirecleDA(fd, /* [E] file descriptor du fichier a lire */ - adresse_deb, /* [E] adresse de debut de recherche */ - mot_cle_lu, /* [S] mot cle suivant lu ( termine par \0)*/ - &ad_donnee, /* [S] adresse du premier caractere suivant le mot cle */ - &ad_mot_cle /* [S] adresse du premier caractere du mot cle */ - ); -/*CD si erreur on sort */ - if (cr != CAI_OK && cr != CAI_EOF) { - goto ERREUR; - } -/*CD si aucun mot cle trouve on sort en erreur "aucun mot cle dans le fichier" */ - if (cr == CAI_EOF) - { - sprintf(CAI_ERREUR,"Erreur fichier sans mot cle( %s) ",fd->nom_fichier); - goto ERREUR; - } -/*CD TANT QUE mot_cle non trouve & pas erreur */ - while ( cr == CAI_OK && indic_mot_cle == CAI_NON_TROUVE ) - { -/*CD si le mot cle est egal au mot cle demande alors mot_cle trouve */ - if ( strcmp(mot_cle,mot_cle_lu) == 0) - { - indic_mot_cle = CAI_TROUVE; - } - else - { - adresse_deb = ad_donnee; -/*---------------------------------------------------------------------------*/ -/*CD si mot_cle non trouve on cherche le mot cle suivant (operation interne basee sur un automate) */ -/*CD cette operation necessite : un pointeur sur la zone fichier ou l'on recherche le mot cle suivant */ -/*CD cette operation ramene : le mot cle suivant et le pointeur sur la zone fichier apres ce mot cle */ -/*---------------------------------------------------------------------------*/ - cr = cai_lirecleDA(fd, /* [E] file descriptor du fichier a lire */ - adresse_deb, /* [E] adresse de debut de recherche */ - mot_cle_lu, /* [S] mot cle suivant lu (termine par \0)*/ - &ad_donnee, /* [S] adresse du premier caractere suivant le mot cle */ - &ad_mot_cle/* [S] adresse du premier caractere du mot cle */ - ); - } -/*CD FIN TANT QUE pas erreur & mot_cle non trouve */ - } - } -/*CD FINSI */ -if (cr != CAI_OK && cr != CAI_EOF) - { - goto ERREUR; - } -/*CD SI fin de fichier on sort en erreur "mot cle non present */ -if ( indic_mot_cle == CAI_NON_TROUVE ) - { - sprintf(CAI_ERREUR,"Mot cle :%s non trouve dans le fichier :%s",mot_cle,fd->nom_fichier); - goto ERREUR; - } -/*CD on sauvegarde alors dans la structure fd les info sur le dernier mot cle */ -strcpy(fd->dernier_mot_cle,mot_cle_lu); -fd->ad_dern_mot_cle = ad_mot_cle; -fd->ad_dern_donnee = ad_donnee; -/*---------------------------------------------------------------------------*/ -/*CD a partir du mot cle trouve on analyse syntaxiquement la ligne jusqu'au prochain mot cle */ -/*CD (operation interne effectuant le decodage et donnant : le type de donnee , le nombres de lignes */ -/*CD le nombre de colonnes , la taille maxi d'un element , un pointeur sur le tableau lu */ -/*CD ( ce tableau a ete alloue dynamiquement par cette operation) */ -/*---------------------------------------------------------------------------*/ -cr=cai_liredonneeDA( - fd, /* [E] file descriptor du fichier a lire */ - ad_donnee, /* [E] adresse de debut de recherche */ - &don_lue, /* [S] donnee lue */ - type, /* [S] type de la donnee lue (CAI_ENTIER4,CAI_REEL8,CAI_ASCII,CAI_BLOC)*/ - nb_lig, /* [S] nombre de lignes du tableau lu */ - nb_col, /* [S] nombre de colonnes du tableau lu */ - taille_cell/* [S] taille maxi en octet d'un element du tableau lu ( significatif - pourla donnee CAI_ASCII )*/ - ); - -/*CD si erreur de decodage on sort en erreur */ -if (cr != CAI_OK ) { - if (cr == CAI_EOF ){ - sprintf(CAI_ERREUR,"erreur fichier de DA incomplet (mot cle %s)",mot_cle); - } - goto ERREUR; - } -/*CD liberation place memoire alloue par l'operation interne precedente */ -if (don_lue != NULL) - { - free(don_lue); - don_lue=NULL; - } -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas nominal */ -/*---------------------------------------------------------------------------*/ -return(CAI_OK); -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas d'erreur */ -/*---------------------------------------------------------------------------*/ -ERREUR: -/*CD liberation place memoire alloue par l'operation interne precedente */ -if (don_lue != NULL) - { - free(don_lue); - don_lue=NULL; - } -return(cr); - -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_lireDA */ -/* */ -/* ROLE: Cette operation externe est chargee de lire une donne associee a un*/ -/* mot cle dans le fichier de donnees auxiliaires precedenment ouvert. */ -/* Il s'agit donc apres localisation du mot cle de lire la donnee et */ -/* toutes les informations associees(nb_lig,nb_col,taille_cell). */ -/* On verifie alors la coherence entre les informations lues et celles*/ -/* issues des arguments donnes par l'appelant. */ -/* Si les 3 informations sont coherentes la donnee est recopiee dans */ -/* la zone memoire reservee par l'appelant. */ -/* */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* cette operation doit etre appele apres ouverture prealable du fichier */ -/* de donnees auxiliaires. */ -/* pour une souplesse d'utilisation maximum il est utilise d'appeler au */ -/* prealable l'operation cai_lirecaractDA puis de reserver la place memoire */ -/* necessaire */ -/* */ -/* VERSION: */ -/* CODES RETOUR: CAI_OK ou CAI_KO */ -/* si CAI_KO l'erreur peut etre affiche via la variable globale CAI_ERREUR */ -/* " fichier de donnees auxiliaires %s non ouvert" */ -/* " mot cle non present dans le fichier de donnees auxiliaires %s" */ -/* " aucun mot cle dans le fichier %s" */ -/* " taille du mot cle lue %s superieure a la limite %d ou egale a 0" */ -/* " erreur a la lecture du fichier de donnees auxiliaires %s" */ -/* " parenthese ouvrante non detectee (mot cle %s ) */ -/* " parenthese fermante non detectee (mot cle %s ) */ -/* " nombre de niveaux de parentheses superieur a 2 ( mot cle %s ) */ -/* " % dimension du tableau non constante (mot cle %s) */ -/* " % dimension du tableau = 0 (mot cle %s) */ -/* " type de la donnee lue %s non reconnue (mot cle %s) */ -/* " erreur lors du decodage de la donnee lue %s" (mot cle %s) */ -/* " incoherence entre nblig lue (%d) et nblig specifiee (%d) (mot cle %s) */ -/* " incoherence entre nbcol lue (%d) et nbcol specifiee (%d) (mot cle %s) */ -/* " incoherence entre taille_cell lue (%d) et taille_cell specifiee (%d) */ -/* (mot cle %s) */ -/*****************************************************************************/ -CAI_OK_KO cai_lireDA(CAI_FILE_DA *fd,char *mot_cle, - CAI_TYPE *type,int *nb_lig,int *nb_col, - long *taille_cell,void *donnee) -{ -int i; /* indice de boucle */ -int j; /* indice de boucle */ -CAI_MOT_CLE mot_cle_lu; /* mot cle courant lu dans le fichier */ -int indic_mot_cle; /* indicateur de recherche du mot cle */ -int num_mot_cle; /* numero du mot cle recherche */ -long ad_mot_cle; /* adresse du debut du mot cle courant */ -long ad_donnee; /* adresse de la donnee apres le mot cle trouve */ -long adresse_deb; /* adresse de debut de recherche du mot cle */ -CAI_OK_KO cr; /* code retour des operations */ -void *don_lue; /* donnees lue en interne par l'operation cai_liredonneeDA */ -char *don_asc; /* donnee ascii lue */ -long int *don_ent; /* donnee entiere lue */ -double *don_ree; /* donnee reelle lue */ -CAI_TYPE type_lu; /* type de la donnee lue CAI_ENTIER4 ou CAI_REEL8 ou CAI_BLOC*/ -int nb_lig_lu; /* nombre de lignes lues */ -int nb_col_lu; /* nombre de colonnes lues */ -long taille_cell_lu;/* taille de la cellule CAI_ASCII maxi lue */ -char *donnee_a; /* donnee ascii lue */ -long int *donnee_li; /* donnee entiere a renseigner*/ -double *donnee_d; /* donnee reelle a renseigner*/ -float *donnee_f; /* donnee reelle a renseigner*/ -double reel; /* variable de travail */ -long int entier; /* variable de travail */ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -/*CD initialisations */ -indic_mot_cle = CAI_NON_TROUVE; -num_mot_cle=0; -i=0; -j=0; -ad_donnee=0; - -cr=CAI_OK; -don_lue=NULL; -nb_lig_lu=0; -nb_col_lu=0; -type_lu= CAI_INCONNU; -taille_cell_lu=0; -/*CD on verifie que le type fait partie des types reconnus */ -if ( *type != CAI_ENTIER4 && *type != CAI_REEL4 && *type != CAI_REEL8 && *type != CAI_ASCII && *type !=CAI_BLOC) - { - cr = CAI_ERR_TYP; - sprintf(CAI_ERREUR,"type :%d non reconnu ( 1:CAI_ENTIER4 2:CAI_REEL4 3:CAI_REEL8 4:CAI_ASCII 5:CAI_BLOC)",*type); - goto ERREUR; - } -/*CD on verifie au prealable que le fichier est effectivement ouvert */ -/*CD SINON on sort en erreur */ -if ( fd ==NULL ) - - { - cr = CAI_ERREUR_OUV; - sprintf(CAI_ERREUR,"Erreur ouverture du fichier de donnees auxiliaires"); - goto ERREUR; - } - -/*---------------------------------------------------------------------------*/ -/*CD SI le dernier mot cle lu dans CAI_FILE_DA n'existe pas ou n'est pas egal au mot cle recherche */ -/*---------------------------------------------------------------------------*/ -if (fd->ad_dern_mot_cle == -1 || strncmp(mot_cle,fd->dernier_mot_cle,CAI_TAILLE_MAX_CLEDA) != 0 ) - { -/*CD SI la liste des mots cles est en memoire */ - if ( fd->nb_mot_cle != -1 ) - { -/*---------------------------------------------------------------------------*/ -/*CD ALORS on scrute cette liste jusqu'a trouver le mot cle */ -/*---------------------------------------------------------------------------*/ - while (i< fd->nb_mot_cle && indic_mot_cle == CAI_NON_TROUVE ) - { - if ( strncmp(mot_cle,(char *)(fd->liste_mot_cle +i),CAI_TAILLE_MAX_CLEDA) == 0 ) - { - indic_mot_cle = CAI_TROUVE; - num_mot_cle = i; -/*CD on recupere alors le pointeur sur la zone fichier apres ce mot cle */ - ad_donnee=*(fd->ad_donnee + i); - strcpy(mot_cle_lu,(char *)(fd->liste_mot_cle +i)); - ad_mot_cle=*(fd->ad_mot_cle + i); - } - i++; - } - } - else - { -/*CD SINON */ -/*CD on se positionne au debut du fichier ( adresse_deb = 0)*/ - adresse_deb = 0; -/*---------------------------------------------------------------------------*/ -/*CD on cherche le premier mot cle a partir de cette adresse (operation interne basee sur un automate) */ -/*---------------------------------------------------------------------------*/ - cr = cai_lirecleDA(fd, /* [E] file descriptor du fichier a lire */ - adresse_deb, /* [E] adresse de debut de recherche */ - mot_cle_lu, /* [S] mot cle suivant lu ( termine par \0)*/ - &ad_donnee, /* [S] adresse du premier caractere suivant le mot cle */ - &ad_mot_cle /* [S] adresse du premier caractere du mot cle */ - ); -/*CD si erreur on sort */ - if (cr != CAI_OK && cr != CAI_EOF) { - goto ERREUR; - } -/*CD si aucun mot cle trouve on sort en erreur "aucun mot cle dans le fichier" */ - if ( cr == CAI_EOF) - { - sprintf(CAI_ERREUR,"Erreur fichier sans mot cle( %s)",fd->nom_fichier); - goto ERREUR; - } -/*CD TANT QUE mot_cle non trouve & pas erreur */ - while (cr == CAI_OK && indic_mot_cle == CAI_NON_TROUVE ) - { -/*CD si le mot cle est egal au mot cle demande alors mot_cle trouve */ - if ( strcmp(mot_cle,mot_cle_lu) == 0) - { - indic_mot_cle = CAI_TROUVE; - } - else - { - adresse_deb = ad_donnee; -/*---------------------------------------------------------------------------*/ -/*CD si mot_cle non trouve on cherche le mot cle suivant (operation interne basee sur un automate) */ -/*CD cette operation necessite : un pointeur sur la zone fichier ou l'on recherche le mot cle suivant */ -/*CD cette operation ramene : le mot cle suivant et le pointeur sur la zone fichier apres ce mot cle */ -/*---------------------------------------------------------------------------*/ - cr = cai_lirecleDA(fd, /* [E] file descriptor du fichier a lire */ - adresse_deb, /* [E] adresse de debut de recherche */ - mot_cle_lu, /* [S] mot cle suivant lu (termine par \0)*/ - &ad_donnee, /* [S] adresse du premier caractere suivant le mot cle */ - &ad_mot_cle/* [S] adresse du premier caractere du mot cle */ - ); - } -/*CD FIN TANT QUE pas erreur & mot_cle non trouve */ - } -/*CD FIN SI LISTE MOT CLE presente en memoire*/ - } -/*CD FIN SI le dernier mot cle lu dans CAI_FILE_DA n'existe pas ou n'est pas egal au mot cle recherche */ - if (cr != CAI_OK && cr != CAI_EOF) - { - goto ERREUR; - } -/*CD SI fin de fichier on sort en erreur "mot cle non present */ - if ( indic_mot_cle == CAI_NON_TROUVE ) - { - sprintf(CAI_ERREUR,"Mot cle :%s non trouve dans le fichier :%s",mot_cle,fd->nom_fichier); - goto ERREUR; - } -/*CD on sauvegarde alors dans la structure fd les info sur le dernier mot cle */ - strcpy(fd->dernier_mot_cle,mot_cle_lu); - fd->ad_dern_mot_cle = ad_mot_cle; - fd->ad_dern_donnee = ad_donnee; - } - -/*CD SINON */ -else - { - indic_mot_cle = CAI_TROUVE; - ad_donnee = fd->ad_dern_donnee; - ad_mot_cle= fd ->ad_dern_mot_cle; - strcpy(mot_cle_lu,fd->dernier_mot_cle); - } - - -/*---------------------------------------------------------------------------------------*/ -/*CD a partir du mot cle trouve on analyse syntaxiquement la ligne jusqu'au prochain mot cle */ -/*CD (operation interne effectuant le decodage et donnant : le type de donnee (entier ou reel ou CAI_ASCII),*/ -/*CD le nombres de lignes */ -/*CD le nombre de colonnes , la taille maxi d'un element , un pointeur sur le tableau lu */ -/*CD ( ce tableau a ete alloue dynamiquement par cette operation) */ -/*---------------------------------------------------------------------------------------*/ -cr=cai_liredonneeDA( - fd, /* [E] file descriptor du fichier a lire */ - ad_donnee, /* [E] adresse de debut de recherche */ - &don_lue, /* [S] donnee lue */ - &type_lu, /* [S] type de la donnee lue (CAI_ENTIER4,CAI_REEL8,CAI_ASCII,CAI_BLOC)*/ - &nb_lig_lu, /* [S] nombre de lignes du tableau lu */ - &nb_col_lu, /* [S] nombre de colonnes du tableau lu */ - &taille_cell_lu/* [S] taille maxi en octet d'un element du tableau lu ( significatif - pourla donnee CAI_ASCII )*/ - ); -/*CD si erreur de decodage on sort en erreur */ -if (cr != CAI_OK ) { - if (cr == CAI_EOF){ - sprintf(CAI_ERREUR,"erreur fichier de DA incomplet (mot cle %s)",mot_cle); - } - goto ERREUR; - } - - -/*---------------------------------------------------------------------------------------*/ -/*CD on effectue les controles de coherence : */ -/*CD type_lu = type ( entier reel ou CAI_ASCII)*/ -/*CD nblig_lu = nblig */ -/*CD nbcol_lu = nb_col */ -/*CD taille_cell_lu <= taille_cell */ -/*CD SI difference on sort en erreur "incoherence entre " */ -/*CD NB : une lecture en reel4 de reel ecrit en reel8 n'est pas une erreur */ -/*---------------------------------------------------------------------------------------*/ - - -/*---------------------------------------------------------------------------------------*/ -/* donnee de type entiere */ -/*---------------------------------------------------------------------------------------*/ -if ( type_lu == CAI_ENTIER4) - { - if (*type != CAI_ENTIER4) - { - cr = CAI_KO; - sprintf(CAI_ERREUR,"type lu (%d) incoherent avec le type specifie ( %d) ",type_lu,*type); - goto ERREUR; - } - if (nb_lig_lu != *nb_lig || nb_col_lu != *nb_col) - { - cr = CAI_KO; - sprintf(CAI_ERREUR,"dim lue incoherente avec la dimension specifiee"); - goto ERREUR; - } -/*CD le pointeur sur le tableau alloue par l'appelant est caste au type donne par l'appelant */ -/*CD le pointeur sur le tableau alloue par l'operation de decodage est caste au type_lu */ - don_ent = (long int *)don_lue; - donnee_li = (long int *)donnee; - i=0; -/*CD TANT QUE lig <= nblig_lu et non erreur */ - while ( i < nb_lig_lu && cr ==CAI_OK) - { - j=0; -/*CD TANT QUE col <= nbcol_lu et non erreur */ - while ( j < nb_col_lu && cr ==CAI_OK) - { - entier = *(don_ent + i*nb_col_lu + j); - *(donnee_li +i*nb_col_lu + j) = entier; - j++; - } -/*CD FIN TANT QUE col <= nbcol_lu et non erreur */ - i++; - } -/*CD FIN TANT QUE lig <= nblig_lu et non erreur */ - if (cr != CAI_OK ) - { - goto ERREUR; - } - } - -/*---------------------------------------------------------------------------------------*/ -/* donnee de type reelle */ -/*---------------------------------------------------------------------------------------*/ -if ( type_lu == CAI_REEL8) - { - if (*type != CAI_REEL4 && *type != CAI_REEL8) - { - cr=CAI_KO; - sprintf(CAI_ERREUR,"type lu (%d) incoherent avec le type specifie ( %d)",type_lu,*type); - goto ERREUR; - } - if (nb_lig_lu != *nb_lig || nb_col_lu != *nb_col) - { - cr=CAI_KO; - sprintf(CAI_ERREUR,"dim lue incoherente avec la dimension specifiee "); - goto ERREUR; - } -/*CD le pointeur sur le tableau alloue par l'appelant est caste au type donne par l'appelant */ -/*CD le pointeur sur le tableau alloue par l'operation de decodage est caste au type_lu */ - don_ree = (double *)don_lue; - donnee_f = (float *)donnee; - donnee_d = (double *)donnee; - i=0; -/*CD TANT QUE lig <= nblig_lu et non erreur */ - while ( i < nb_lig_lu) - { - j=0; -/*CD TANT QUE col <= nbcol_lu et non erreur */ - while ( j < nb_col_lu) - { - reel = *(don_ree + i*nb_col_lu + j); - if (*type == CAI_REEL4) - { - *(donnee_f + i*nb_col_lu + j) = reel; - } - else - { - *(donnee_d + i*nb_col_lu + j) = reel; - } - j++; - } -/*CD FIN TANT QUE col <= nbcol_lu et non erreur */ - i++; - } -/*CD FIN TANT QUE lig <= nblig_lu et non erreur */ - } - - -/*---------------------------------------------------------------------------------------*/ -/* donnee de type CAI_ASCII */ -/*---------------------------------------------------------------------------------------*/ -if (type_lu == CAI_ASCII ) - { - if (*type != CAI_ASCII ) - { - cr=CAI_KO; - sprintf(CAI_ERREUR,"type lu (%d) incoherent avec le type specifie ( %d)",type_lu,*type); - goto ERREUR; - } - if (nb_lig_lu != *nb_lig || nb_col_lu != *nb_col) - { - cr=CAI_KO; - sprintf(CAI_ERREUR,"dim lue incoherente avec la dimension specifiee "); - goto ERREUR; - } - if (taille_cell_lu > *taille_cell) - { - cr=CAI_KO; - sprintf(CAI_ERREUR,"longueur max des donnees CAI_ASCII lues (%d) incoherente avec la taille specifie (%d)" - ,taille_cell_lu,*taille_cell); - goto ERREUR; - } -/*CD le pointeur sur le tableau alloue par l'appelant est caste au type donne par l'appelant */ -/*CD le pointeur sur le tableau alloue par l'operation de decodage est caste au type_lu */ - don_asc = (char *)don_lue; - donnee_a = (char *)donnee; - i=0; - j=0; -/*CD TANT QUE lig <= nblig_lu et non erreur */ - while ( i < nb_lig_lu) - { - j=0; -/*CD TANT QUE col <= nbcol_lu et non erreur */ - while ( j < nb_col_lu) - { - strcpy(donnee_a + (i*nb_col_lu + j)* (*taille_cell),don_asc + (i*nb_col_lu + j)*CAI_TAILLE_MAX_ASCII); - j++; - } -/*CD FIN TANT QUE col <= nbcol_lu et non erreur */ - i++; - } -/*CD FIN TANT QUE lig <= nblig_lu et non erreur */ - } -/*CD liberation place memoire alloue par l'operation interne precedente */ -if (don_lue != NULL) - { - free(don_lue); - don_lue=NULL; - } -/*---------------------------------------------------------------------------------------*/ -/* donnee de type CAI_BLOC */ -/*---------------------------------------------------------------------------------------*/ -if (type_lu == CAI_BLOC) - { - if (*type != CAI_BLOC ) - { - sprintf(CAI_ERREUR,"type lu (%d) incoherent avec le type specifie ( %d)",type_lu,*type); - goto ERREUR; - } - } -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas nominal */ -/*---------------------------------------------------------------------------*/ -return(CAI_OK); -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas d'erreur */ -/*---------------------------------------------------------------------------*/ -ERREUR: -/*CD liberation place memoire alloue par l'operation interne precedente */ -if (don_lue != NULL) - { - free(don_lue); - don_lue=NULL; - } -return(cr); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} - -/********************************************************************************/ -/* */ -/* OPERATION: cai_listeDA */ -/* */ -/* ROLE: Cette operation recherche la liste des mots cles presents dans un */ -/* fichier de Donnees Auxiliaires */ -/* */ -/* ATTENTION : cette fonction s'alloue de l'espace memoire qu'il conviendra de */ -/* liberer a la fin du traitement */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* CODE RETOUR : CAI_OK ou CAI_KO */ -/* " taille d'un mot cle lu superieure a la limite " */ -/* " erreur a la lecture du fichier de donnees auxiliaires " */ -/********************************************************************************/ -CAI_OK_KO cai_listeDA(CAI_FILE_DA *fd) - -{ -long adr_deb; /* adresse dans le fichier de DA */ -long ad_suiv; /* adresse du premier caractere suivant un mot cle */ -long ad_deb_mcc; /* adresse du premier caractere des donnees du mot cle */ -long *ad; /* adresse pour copie */ -int nb_mot_cle; /* nombre de mots cle trouves dans le fichier */ -size_t taille; /* taille du buffer a allouer */ -CAI_OK_KO retour; /* code retour appel fonctions */ -CAI_MOT_CLE mot_cle; /* mot cle trouve*/ -char *adr_copie; /* adresse pour copie de mots cle */ -int nb_bloc; /* nombre de realloc realises +1 */ -off_t offset; -off_t offreel; - - -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -/*------------------------------------------------------------------------------*/ -/*CD initialisation a zero du nombre de mots cle trouves */ -/*------------------------------------------------------------------------------*/ -nb_mot_cle = 0; -nb_bloc = 1; - -/*------------------------------------------------------------------------------*/ -/*CD on verifie au prealable que le fichier est effectivement ouvert */ -/*CD SINON on sort en erreur */ -/*------------------------------------------------------------------------------*/ -if ( fd == NULL ) - { - retour = CAI_ERREUR_OUV; - sprintf(CAI_ERREUR,"Dans listeDA, fichier de donnees auxiliaires non ouvert"); - goto ERREUR; - } - -/*------------------------------------------------------------------------------*/ -/*CD Positionnement en debut de fichier */ -/*------------------------------------------------------------------------------*/ -/*CD on se positionne sur le debut du fichier ( rewind ) */ -offset=0; -offreel=lseek(fd->descr,offset,SEEK_SET); - - -/*------------------------------------------------------------------------------*/ -/*CD Allocation d'un espace memoire contenant la liste des mots cles trouves */ -/*CD Allocation d'espaces memoire contenant les adresses des mots cles */ -/*CD et les adresses des donnees associees a chaque mot cle */ -/*CD (il faut essayer d'allouer un maximum de place representative afin */ -/*CD d'eviter un trop grand nombre de realloc) */ -/*------------------------------------------------------------------------------*/ -taille = CAI_TAILLE_MAX_CLEDA * CAI_NB_MAX_CLE; -fd->liste_mot_cle = (CAI_MOT_CLE *)malloc (taille); -if (fd->liste_mot_cle == NULL) - { - retour = CAI_ERR_ALLOC; - sprintf (CAI_ERREUR," erreur allocation memoire pour liste mots cle "); - goto ERREUR; - } - -taille = CAI_NB_MAX_CLE * sizeof(int); -fd->ad_mot_cle = (long *)malloc (taille); -if (fd->ad_mot_cle == NULL) - { - retour = CAI_ERR_ALLOC; - sprintf (CAI_ERREUR," erreur allocation memoire pour adresse mots cle "); - goto ERREUR; - } - -taille = CAI_NB_MAX_CLE * sizeof(int); -fd->ad_donnee = (long *)malloc (taille); -if (fd->ad_donnee == NULL) - { - retour = CAI_ERR_ALLOC; - sprintf (CAI_ERREUR," erreur allocation memoire pour adresse donnees d'un mots cle "); - goto ERREUR; - } - -/*------------------------------------------------------------------------------*/ -/*CD Adr_deb = adresse debut de fichier */ -/*------------------------------------------------------------------------------*/ -adr_deb = 0; - -/*------------------------------------------------------------------------------*/ -/*CD Recherche du premier mot cle du fichier(cai_lirecleDA) */ -/*CD Si erreur de recherche, sortie en erreur */ -/*------------------------------------------------------------------------------*/ -retour = cai_lirecleDA (fd, /* structure du fichier a lire */ - adr_deb, /* adresse du debut de recherche dans le fichier */ - mot_cle, /* mot cle trouve */ - &ad_suiv, /* adresse dans le fichier du premier caractere suivant le mot cle */ - &ad_deb_mcc) ; /* adresse dans le fichier du premier caractere du mot cle */ - -if (retour != CAI_OK && retour != CAI_EOF) - { - retour = CAI_ERREUR_RECHERCHE_MOT; - sprintf (CAI_ERREUR," erreur recherche du premier mot cle "); - goto ERREUR; - } - -/*------------------------------------------------------------------------------*/ -/*CD TANT QUE il existe des mots cles dans le fichier */ -/*------------------------------------------------------------------------------*/ -while (retour != CAI_EOF) - { -/*------------------------------------------------------------------------------*/ -/*CD si la liste des mots cle est saturee alors reallocation du double de */ -/*CD place pour les mots cle et les adresse de ces mots */ -/*------------------------------------------------------------------------------*/ - if (nb_mot_cle == (CAI_NB_MAX_CLE * nb_bloc)) - { - nb_bloc = nb_bloc + 1; - - taille = CAI_TAILLE_MAX_CLEDA * CAI_NB_MAX_CLE * nb_bloc; - fd->liste_mot_cle = (CAI_MOT_CLE *)realloc (fd->liste_mot_cle, taille); - if (fd->liste_mot_cle == NULL) - { - retour = CAI_ERR_ALLOC; - sprintf (CAI_ERREUR," erreur re-allocation memoire pour liste mots cle - bloc %d ", nb_bloc); - goto ERREUR; - } - - taille = CAI_NB_MAX_CLE * sizeof(int) * nb_bloc; - fd->ad_mot_cle = (long *)realloc (fd->ad_mot_cle, taille); - if (fd->ad_mot_cle == NULL) - { - retour = CAI_ERR_ALLOC; - sprintf (CAI_ERREUR," erreur re-allocation memoire pour adresse mots cle - bloc %d ", nb_bloc); - goto ERREUR; - } - - taille = CAI_NB_MAX_CLE * sizeof(int) * nb_bloc; - fd->ad_donnee = (long *)realloc (fd->ad_donnee, taille); - if (fd->ad_donnee == NULL) - { - retour = CAI_ERR_ALLOC; - sprintf (CAI_ERREUR," erreur re-allocation memoire pour donnees d un mots cle - bloc %d", nb_bloc); - goto ERREUR; - } - } - -/*------------------------------------------------------------------------------*/ -/*CD sauvegarde du mot cle trouve dans liste_mot_cle */ -/*------------------------------------------------------------------------------*/ - adr_copie =(char *)(fd->liste_mot_cle + nb_mot_cle); - strncpy (adr_copie, mot_cle, CAI_TAILLE_MAX_CLEDA); - -/*------------------------------------------------------------------------------*/ -/*CD sauvegarde de l'adresse dans le fichier du mot cle trouve tab_adresse */ -/*CD et de l'adresse du premier caractere des donnees associees au mot cle */ -/*------------------------------------------------------------------------------*/ - ad = (long *)(fd->ad_mot_cle + nb_mot_cle); - *ad = ad_deb_mcc; - ad = (long *)(fd->ad_donnee + nb_mot_cle); - *ad = ad_suiv; - -/*------------------------------------------------------------------------------*/ -/*CD incrementation du nombre de mots cle trouves */ -/*------------------------------------------------------------------------------*/ - nb_mot_cle = nb_mot_cle + 1; - -/*------------------------------------------------------------------------------*/ -/*CD recherche du mot cle suivant dans le fichier (cai_lirecleDA) */ -/*------------------------------------------------------------------------------*/ - adr_deb = ad_suiv; - retour = cai_lirecleDA (fd, /* structure du fichier a lire */ - adr_deb, /* adresse du debut de recherche dans le fichier */ - mot_cle, /* mot cle trouve */ - &ad_suiv, /* adresse dans le fichier du premier caractere suivant le mot cle */ - &ad_deb_mcc); /* adresse dans le fichier du premier caractere du mot cle */ - if (retour != CAI_OK && retour != CAI_EOF) - { - retour = CAI_ERREUR_RECHERCHE_MOT; - sprintf (CAI_ERREUR," erreur recherche d un mot cle "); - goto ERREUR; - } - - } /*CD FIN TANT QUE (plus de mots cle) */ - -/*------------------------------------------------------------------------------*/ -/* CD Sauvegarde du nombre de mots cle trouves */ -/*------------------------------------------------------------------------------*/ -fd->nb_mot_cle = nb_mot_cle; - - -/*---------------------------------------------------------------------------*/ -/* Fin du traitement nominal */ -/*---------------------------------------------------------------------------*/ -retour = CAI_OK; -return (retour); - -/*---------------------------------------------------------------------------*/ -/* traitement degrade : */ -/*---------------------------------------------------------------------------*/ -ERREUR : - -if (fd != NULL) - { -if (fd->liste_mot_cle != NULL) - { - free(fd->liste_mot_cle); - fd->liste_mot_cle=NULL; - - } -if (fd->ad_mot_cle != NULL) - { - free(fd->ad_mot_cle); - fd->ad_mot_cle=NULL; - - } -if (fd->ad_donnee != NULL) - { - free(fd->ad_donnee); - fd->ad_donnee=NULL; - } - - - fd->nb_mot_cle = -1; - } -return (retour); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/********************************************************************************/ -/* */ -/* OPERATION: cai_ajoute DA */ -/* */ -/* ROLE: Cette operation ajoute a la fin du fichier de DA une donnee */ -/* auxiliaire */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* Cette operation doit etre appelee apres ouverture prealable du fichier */ -/* de Donnees Auxiliaires */ -/* */ -/* VERSION: */ -/* */ -/* CODE RETOUR : CAI_OK ou CAI_KO */ -/*Si CAI_KO, l'erreur peut etre affichee via la variable globale CAI_ERREUR */ -/* " fichier de donnees auxiliaires %s non ouvert " */ -/* " erreur de positionnement en fin de fichier " */ -/* " erreur d'ecriture dans le fichier " */ -/********************************************************************************/ -CAI_OK_KO cai_ajouteDA(CAI_FILE_DA *fd,char *mot_cle, - CAI_TYPE type,int nb_lig,int nb_col, - long taille_cell,void *donnee) -{ -CAI_OK_KO retour; /* code retour des fonctions */ -int i; /* indice de boucle */ -int indic_ecrit; /* indic ecritur DA ds fichier(=1 si ecriture = 0 sinon)*/ -char * da_ascii; /* buffer de la DA en ascii (sous forme */ - /* de x fois CAI_TAILLE_MAX_LIGDA caracteres) */ -int indic_mot_cle; /* indicateur de recherche du mot cle */ - - - -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ - da_ascii=NULL; -/*------------------------------------------------------------------------------*/ -/*CD on verifie au prealable que le fichier est effectivement ouvert */ -/*CD SINON on sort en erreur */ -/*------------------------------------------------------------------------------*/ - -if ( fd == NULL ) - { - retour = CAI_ERREUR_OUV; - sprintf(CAI_ERREUR,"Dans ajouteDA, fichier de donnees auxiliaires non ouvert"); - goto ERREUR; - } -/*------------------------------------------------------------------------------*/ -/*CD on verifie que le type fait partie des types reconnus */ -/*------------------------------------------------------------------------------*/ - -if ( type != CAI_ENTIER4 && type != CAI_REEL4 && type != CAI_REEL8 && type != CAI_ASCII & type !=CAI_BLOC) - { - retour = CAI_ERR_TYP; - sprintf(CAI_ERREUR,"type :%d non reconnu ( 1:CAI_ENTIER4 2:CAI_REEL4 3:CAI_REEL8 4:CAI_ASCII 5:CAI_BLOC )",type); - goto ERREUR; - } -/*------------------------------------------------------------------------------*/ -/*CD on verifie que la DA n'existe pas deja (cai_listeDA) */ -/*------------------------------------------------------------------------------*/ -if (fd->nb_mot_cle <= 0) - { - retour = cai_listeDA (fd); - if (retour != CAI_OK) goto ERREUR; - } -indic_mot_cle = CAI_NON_TROUVE; -i = 0; -while (i< fd->nb_mot_cle && indic_mot_cle == CAI_NON_TROUVE ) - { - if ( strncmp(mot_cle,(char *)(fd->liste_mot_cle +i), CAI_TAILLE_MAX_CLEDA) == 0 ) - indic_mot_cle = CAI_TROUVE; - i = i + 1; - } - -if (indic_mot_cle == CAI_TROUVE) - { - retour = CAI_MOT_DEJA_EXISTE; - sprintf(CAI_ERREUR,"Dans ajouteDA, mot cle %s deja existant ",mot_cle); - goto ERREUR; - } - -/*------------------------------------------------------------------------------*/ -/*CD On ecrit la DA dans un buffer intermediaire et dans le fichier */ -/*------------------------------------------------------------------------------*/ - -indic_ecrit = 1; - -retour = cai_ecritDA_buf( - fd, /* [E] file descriptor du fichier de DA */ - mot_cle, /* [E] mot cle associe aux donnees auxiliaires */ - type, /* [E] type des donnees a ecrire */ - nb_lig, /* [E] nombre de lignes du tableau a ecrire */ - nb_col, /* [E] nombre de colonnes du tableau a ecrire */ - taille_cell, /* [E] taille maxi en octets d'un element */ - /* (significatif si type = ascii) */ - donnee, /* [E] pointeur sur la zone memoire a ecrire */ - indic_ecrit, /* [E] indicateur si ecriture du buffer dans */ - /* le fichier (=1) sinon (=0) */ - &da_ascii); /* [S] buffer de la DA en ascii (sous forme */ - /* de x fois CAI_TAILLE_MAX_LIGDA caracteres) */ - -if (retour != CAI_OK) goto ERREUR; - - -/*---------------------------------------------------------------------------*/ -/* Fin du traitement nominal */ -/*---------------------------------------------------------------------------*/ -if (da_ascii != NULL) -{ - free(da_ascii); - } -retour = CAI_OK; -return (retour); - -/*---------------------------------------------------------------------------*/ -/* traitement degrade : */ -/*---------------------------------------------------------------------------*/ -ERREUR : -if (da_ascii != NULL) -{ - free(da_ascii); -} -return (retour); - -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} - -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS INTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION: cai_lirecleDA() */ -/* */ -/* ROLE: cette operation interne recherche le mot cle suivant detecte */ -/* apres une "adresse dans le fichier ". */ -/* cette operation retourne le mot cle suivant s'il existe ainsi qu'une adresse*/ -/* sur le premier caractere suivant ce mot cle */ -/* NB : la notion d'adresse ici est relative au fichier :c.a.d */ -/* 1er octet du fichier = adresse 0 */ -/* 2eme octet du fichier = adresse 1 ... */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* CODE RETOUR : CAI_OK ou CAI_KO */ -/* " mot cle non present dans le fichier de donnees auxiliaires %s" */ -/* " taille du mot cle lue %s superieure a la limite %d ou egale a 0" */ -/* " erreur a la lecture du fichier de donnees auxiliaires %s" */ -/*****************************************************************************/ -static CAI_OK_KO cai_lirecleDA(CAI_FILE_DA *fd,long ad_deb,char * mot_cle, - long *ad_suiv,long * ad_deb_mcc) -{ -CAI_OK_KO cr; /* code retour */ -long num; /* numero du buffer courant */ -long ad_deb_buff; /* adresse de debut du buffer */ -long ad_deb_rel; /* adresse de debut de recherche relative au buffer courant */ -long ad_suivante; /* adresse du premier caractere suivant le mot cle courant */ -long taille_buff_courant; /* taille du buffer lu */ -char *buff_courant; /* buffer courant */ -CAI_MOT_CLE mot_cle_courant;/* mot cle courant */ -off_t offset; -off_t offreel; -long nb_buffer; /* nombre de buffer dans le fichier */ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -/*CD dans CAI_FILE_DA on prevoit un indicateur qui vaut -1 si aucun buffer */ -/*CD n'a pas deja ete lu et qui vaut sinon le numero du buffer lu dans le fichier */ -/*CD on prevoit aussi la taille du buffer lu ainsi que l'allocation statique du buffer */ -/*CD et le decalage entre 2 buffer consecutifs ( fixe a taille_buff/2) */ -/*CD initialisations */ -cr=CAI_OK; - -/*---------------------------------------------------------------------------*/ -/*CD on recherche alors le nombre de buffer dans le fichier */ -/*---------------------------------------------------------------------------*/ -/*CD on se positionne sur la fin du fichier ( rewind ) */ -offset=0; -offreel=lseek(fd->descr,offset,SEEK_END); -/*CD SI erreur on sort "erreur lors d'un lseek du fichier de DA " */ -if ( offreel == -1) - { - cr=CAI_PB_LSEEK; - sprintf(CAI_ERREUR,"erreur lors du lseek sur le fichier %s",fd->nom_fichier); - goto ERREUR; - } -offreel=lseek(fd->descr,offset,SEEK_CUR); -/*CD SI erreur on sort "erreur lors d'un lseek du fichier de DA " */ -if ( offreel == -1) - { - cr=CAI_PB_LSEEK; - sprintf(CAI_ERREUR,"erreur lors du lseek sur le fichier %s",fd->nom_fichier); - goto ERREUR; - } -if ( offreel < ad_deb) - { - cr=CAI_ERR_ADRESSE; - sprintf(CAI_ERREUR,"erreur adresse de recherche en dehors du fichier (%d)",ad_deb); - goto ERREUR; - } - -nb_buffer = (offreel / (fd->taille_buffer/2) ) + 1; - -/*---------------------------------------------------------------------------*/ -/*CD on commence par calculer le premier buffer a lire par : num = 2 * ad_deb/(fd->taille buffer) */ -/*---------------------------------------------------------------------------*/ -num= (ad_deb/(fd->taille_buffer/2)); -ad_deb_buff = num * (fd->taille_buffer /2); - -/*CD SI indicateur != num */ -if ( num != fd->num_buffer) - { -/*---------------------------------------------------------------------------*/ -/*CD lecture du buffer num a partir de l'adresse num*fd->taille_buffer/2 et de taille*/ -/*CD fd->taille_buffer*2 (operation interne ) */ -/*---------------------------------------------------------------------------*/ - cr=cai_lireficDA( - fd, /* [E] structure decrivant le fichier de donnees auxiliaires */ - ad_deb_buff, /* [E] adresse du premier octet a lire */ - fd->buffer /* [E/S] buffer a remplir */ - ); -/*CD SI erreur on sort */ - if (cr != CAI_OK) - { - goto ERREUR; - } -/* initialisation du numero de buffer */ - fd->num_buffer=num; - buff_courant = fd->buffer; - taille_buff_courant = fd->taille_buffer_lu; - } -else - { -/*CD SINON tab = fd ->ad_buffer */ - buff_courant = fd->buffer; - taille_buff_courant = fd->taille_buffer_lu; - } - -ad_deb_rel = ad_deb - ad_deb_buff; -/*---------------------------------------------------------------------------*/ -/*CD TANT QUE mot_cle non trouve et non EOF */ -/*---------------------------------------------------------------------------*/ -cr=CAI_KO; -while ( cr !=CAI_OK && taille_buff_courant > 0 && cr != CAI_EOF && cr != CAI_PAS_MC) - { -/*---------------------------------------------------------------------------*/ -/*CD recherche du mot cle dans le buffer buff on retourne le mot cle,sa longueur et */ -/*CD l'adresse dans le tableau du caractere suivant le mot cle (operation interne ) */ -/*CD NB: attention au cas ou le mot cle peut etre coupe */ -/*---------------------------------------------------------------------------*/ - cr=cai_recherchecleDA( - taille_buff_courant,/* [E] taille du buffer a scanner en octets */ - buff_courant, /* [E] buffer a scanner */ - ad_deb_rel, /* [E] adresse a partir de laquelle il faut scanner le buffer */ - mot_cle_courant, /* [S] mot cle suivant lu */ - &ad_suivante /* [S] adresse du premier caractere suivant le mot cle */ - ); -/*CD si erreur on sort */ - if (cr != CAI_OK && cr != CAI_EOF && cr != CAI_PAS_MC) - { - goto ERREUR; - } - -/*CD Si mot_cle non trouve et non EOF on incremente le numero de buffer */ - if ( (cr == CAI_EOF||cr == CAI_PAS_MC) && num+1< nb_buffer) - { -/* calcul de l'adresse de debut de recherche */ - ad_deb_rel=0; -/*---------------------------------------------------------------------------*/ -/*CD lecture du buffer num a partir de l'adresse num*fd->taille_buffer/2 et de taille */ -/*CD fd->taille_buffer*2 (operation interne ) */ -/*---------------------------------------------------------------------------*/ - num=num+1; - ad_deb_buff = num * (fd->taille_buffer /2); - cr=cai_lireficDA( - fd, /* [E] structure decrivant le fichier de donnees auxiliaires */ - ad_deb_buff, /* [E] adresse du premier octet a lire */ - fd->buffer /* [E/S] buffer a remplir */ - ); -/*CD SI erreur on sort */ - if (cr != CAI_OK) - { - goto ERREUR; - } -/* initialisation du numero de buffer */ - fd->num_buffer=num; -/*CD on met a jour les variables locales */ - buff_courant = fd->buffer; - taille_buff_courant = fd->taille_buffer_lu; - cr=CAI_KO; - } - } -/*---------------------------------------------------------------------------*/ -/*CD FIN TANT QUE mot_cle non trouve */ -/*---------------------------------------------------------------------------*/ - -/*---------------------------------------------------------------------------*/ -/*CD SI mot_cle trouve */ -/*---------------------------------------------------------------------------*/ -if (cr == CAI_OK) - { -/*CD le mot cle est recopie dans l'argument de sortie */ - strcpy(mot_cle,mot_cle_courant); -/*CD l'adresse dans le tableau du caractere suivant le mot cle est convertie en */ -/*CD adresse absolue dans le fichier ad_suiv = num*fd->taille_buff/2 + (ad_suiv-ad_deb)*/ - *ad_suiv = (num * fd->taille_buffer/2) + ad_suivante; -/*CD l'adresse dans le tableau du premier caractere du mot cle est convertie en */ -/*CD adresse absolue dans le fichier ad_deb_mc = ad_suiv -long */ - *ad_deb_mcc=*ad_suiv -strlen(mot_cle) - 2; - } -/*---------------------------------------------------------------------------*/ -/*CD SI EOF plus de mot cle */ -/*---------------------------------------------------------------------------*/ -if (cr == CAI_PAS_MC) - { - goto ERREUR; - } -if (taille_buff_courant ==0 || cr == CAI_EOF) - { - cr=CAI_EOF; - goto ERREUR; - } -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas nominal */ -/*---------------------------------------------------------------------------*/ -return(CAI_OK); -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas d'erreur */ -/*---------------------------------------------------------------------------*/ -ERREUR: -return(cr); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_liredonneeDA */ -/* */ -/* ROLE: Cette operation interne analyse syntaxiquement les donnees stockees */ -/* apres un mot cle jusqu'au prochain mot_cle du fichier ou EOF. */ -/* Elle permet donc de determiner le type , la taille de la donnee . */ -/* ( ENTIER REEL OU CAI_ASCII) ( 2 dim maxi ) */ -/* Elle s'alloue de plus la place necessaire au stockage de cette donnees. */ -/* pour les donnees CAI_ASCII , le stockage se fait de maniere contigue en */ -/* memoire dans un tableau de cellules de taille fixe (taille_max). */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* CODE RETOUR : CAI_OK ou CAI_KO */ -/* " erreur a la lecture du fichier de donnees auxiliaires %s" */ -/* " parenthese ouvrante non detectee (mot cle %s ) */ -/* " parenthese fermante non detectee (mot cle %s ) */ -/* " nombre de niveaux de parentheses superieur a 2 ( mot cle %s ) */ -/* " % dimension du tableau non constante (mot cle %s) */ -/* " % dimension du tableau = 0 (mot cle %s) */ -/* " type de la donnee lue %s non reconnue (mot cle %s) */ -/* " erreur lors du decodage de la donnee lue %s" (mot cle %s) */ -/*****************************************************************************/ -static CAI_OK_KO cai_liredonneeDA(CAI_FILE_DA *fd,long ad_deb, void **don_lue, - CAI_TYPE *type_lu,int *nb_lig_lu, - int *nb_col_lu, long *taille_cell_lu ) -{ -CAI_OK_KO cr; /* code retour */ -long num; /* numero du buffer courant */ -long ad_deb_buff; /* adresse de debut du buffer */ -long ad_deb_rel; /* adresse de debut de recherche relative au buffer courant */ -long taille_buff_courant; /* taille du buffer lu */ -char *buff_courant; /* buffer courant */ -off_t offset; -off_t offreel; -long nb_buffer; /* nombre de buffer dans le fichier */ -int nb_lig; /* nombre de lignes */ -int nb_elt; /* nombre d'elements */ -long taille_maxi; /* taille maxi d'une donnee ascii */ -CAI_ETAT1 etat1; /* etat de l'automate de decodage */ -CAI_TYPE type; /* type de la donnee */ -int nb_elt_alloues; /* nombre d'elements alloues */ -long ad_fin_decodage; /* adresse de fin du decodage effectif du buffer */ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -/* dans CAI_FILE_DA on prevoit un indicateur qui vaut zero si aucun buffer */ -/* n'a pas deja ete lu et qui vaut sinon le numero du buffer lu dans le fichier */ -/* on prevoit aussi la taille du buffer lu ainsi que l'allocation statique du buffer */ -/* et le decalage entre 2 buffer consecutifs ( fixe a taille_buff/2) */ -/*CD initialisations */ -cr=CAI_OK; -nb_lig = 1; -nb_elt = 0; -taille_maxi = 0; -etat1 = CAI_DEBUTDEC; -type=CAI_INCONNU; -nb_elt_alloues=0; - -/*CD on recherche alors le nombre de buffer dans le fichier */ -/*CD on se positionne sur la fin du fichier ( rewind ) */ -offset=0; -offreel=lseek(fd->descr,offset,SEEK_END); -/*CD SI erreur on sort "erreur lors d'un lseek du fichier de DA " */ -if ( offreel == -1) - { - cr=CAI_PB_LSEEK; - sprintf(CAI_ERREUR,"erreur lors du lseek sur le fichier %s",fd->nom_fichier); - goto ERREUR; - } -offreel=lseek(fd->descr,offset,SEEK_CUR); -/*CD SI erreur on sort "erreur lors d'un lseek du fichier de DA " */ -if ( offreel == -1) - { - cr=CAI_PB_LSEEK; - sprintf(CAI_ERREUR,"erreur lors du lseek sur le fichier %s",fd->nom_fichier); - goto ERREUR; - - } -if ( offreel <= ad_deb) - { - cr=CAI_ERR_ADRESSE; - sprintf(CAI_ERREUR,"erreur adresse de recherche en dehors du fichier (%d)",ad_deb); - goto ERREUR; - } - -nb_buffer = (offreel / (fd->taille_buffer/2) ) + 1; - -/*CD on commence par calculer le premier buffer a lire par : num = 2 * ad_deb/(fd->taille buffer) */ -num= (ad_deb/(fd->taille_buffer/2)); -ad_deb_buff = num * (fd->taille_buffer /2); - -/*CD SI indicateur != num */ -if ( num != fd->num_buffer) - { -/*CD lecture du buffer num a partir de l'adresse num*fd->taille_buffer/2 et de taille*/ -/*CD fd->taille_buffer*2 (operation interne ) */ - cr=cai_lireficDA( - fd, /* [E] structure decrivant le fichier de donnees auxiliaires */ - ad_deb_buff, /* [E] adresse du premier octet a lire */ - fd->buffer /* [E/S] buffer a remplir */ - ); -/*CD SI erreur on sort */ - if (cr != CAI_OK) - { - goto ERREUR; - } -/* initialisation du numero de buffer */ - fd->num_buffer=num; - buff_courant = fd->buffer; - taille_buff_courant = fd->taille_buffer_lu; - } -else - { -/*CD SINON tab = fd ->ad_buffer */ - buff_courant = fd->buffer; - taille_buff_courant = fd->taille_buffer_lu; - } - -/*CD calcul de l'adresse relative du debut de la recherche dans le buffer */ -/*CD ad_deb_buff = ad_deb - num* fd->taille buffer/2 */ -ad_deb_rel = ad_deb - ad_deb_buff; - - -/*CD TANT QUE statut <> lu et non EOF */ -while ( etat1 != CAI_FINDEC && cr != CAI_EOF && taille_buff_courant > 0) - { -/*CD lecture de la donnee dans le buffer buff on retourne le tableau des donnees qui*/ -/*CD ont ete lues (tableau eventuellement incomplet) , la taille du tableau lu */ -/*CD , le type , la dimension1 , le nb elt , la taille maxi , si incomplet le */ -/*CD statut de l'automate est retourne (operation interne) */ -/*CD NB: attention au cas ou la donnee peut etre coupe */ - cr=cai_decodedonDA( - taille_buff_courant, /* [E] taille du buffer a scanner en octets */ - buff_courant, /* [E] buffer a scanner */ - ad_deb_rel, /* [E] adresse a partir de laquelle il faut scanner le buffer */ - &type, /* [E/S] type de la donnee lue (=CAI_INCONNU lors du premier appel) */ - /* CAI_ENTIER4 CAI_REEL8 CAI_ASCII EN SORTIE */ - &nb_lig, /* [E/S] nombre de lignes du tableau lu ( = 0 lors du premier appel) */ - &nb_elt, /* [E/S] nombre d'elements du tableau lu ( = 0 lors du premier appel) */ - &nb_elt_alloues, /* [E/S] nombre d'elements du tableau lu ( = 0 lors du premier appel)*/ - &taille_maxi,/*[E/S] taill max en octet d'un elt du tab lu (=0 lors du premier appel*/ - /* significatif exclusivement pour des donnees CAI_ASCII */ - don_lue, /* [E/S] donnee lue */ - &etat1, /* [E/S] etat de l'auto ( = DEBUT_DECODAGE lors du premier appel )*/ - &ad_fin_decodage /* [E/S] adresse de fin du decodage effectif du buffer */ - ); - - -/*CD si erreur on sort */ - if (cr != CAI_OK && cr != CAI_EOF) - { - goto ERREUR; - } - -/*CD Si mot_cle non trouve et non EOF on incremente le numero de buffer */ - if ( cr == CAI_EOF && num+1< nb_buffer) - { -/*---------------------------------------------------------------------------*/ -/*CD lecture du buffer num a partir de l'adresse num*fd->taille_buffer/2 et de taille */ -/*CD fd->taille_buffer*2 (operation interne ) */ -/*---------------------------------------------------------------------------*/ - num=num+1; - ad_deb_buff = num * (fd->taille_buffer /2); - cr=cai_lireficDA( - fd, /* [E] structure decrivant le fichier de donnees auxiliaires */ - ad_deb_buff, /* [E] adresse du premier octet a lire */ - fd->buffer /* [E/S] buffer a remplir */ - ); -/*CD SI erreur on sort */ - if (cr != CAI_OK) - { - goto ERREUR; - } -/* initialisation du numero de buffer */ - fd->num_buffer=num; -/*CD on met a jour les variables locales */ - buff_courant = fd->buffer; - taille_buff_courant = fd->taille_buffer_lu; -/*CD calcul de l'adresse relative du debut de la recherche dans le buffer */ -/*CD ad_deb_buff = ad_deb_buff(donnee par l'operation precedente) - */ -/*CD fd->taille buffer/2 ( decalage entre 2 buffers) */ - ad_deb_rel = ad_fin_decodage - (fd->taille_buffer/2); - } - } -/*CD FIN TANT QUE statut <> lu et non EOF */ - -/*CD si statut <> lu et EOF on sort en erreur "erreur fichier de DA incomplet (mot cle %s) */ -if ( etat1 != CAI_FINDEC && etat1 != CAI_DEBUTDEC && (cr == CAI_EOF || taille_buff_courant == 0) ) - { - cr == CAI_EOF; - goto ERREUR; - } -else - { - if (etat1 == CAI_DEBUTDEC && (cr == CAI_EOF || taille_buff_courant == 0) ) - { - type=CAI_BLOC; - } - } -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas nominal */ -/*---------------------------------------------------------------------------*/ -*nb_lig_lu=nb_lig; -*nb_col_lu= nb_elt/nb_lig; -*type_lu = type; -*taille_cell_lu=taille_maxi; -return(CAI_OK); -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas d'erreur */ -/*---------------------------------------------------------------------------*/ -ERREUR: -*nb_lig_lu=nb_lig; -*nb_col_lu= nb_elt/nb_lig; -*type_lu = type; -*taille_cell_lu=taille_maxi; -return(cr); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_deplaceficDA */ -/* */ -/* ROLE: Cette operation interne cree un trou ou compacte un fichier de DA. */ -/* precedenment ouvert en lecture ecriture . */ -/* ex1 : avant [+++++++++++++++++++++++++++] */ -/* |--> deplacement */ -/* V */ -/* ad_deb */ -/* apres [+++++++++++++ ++++++++++++++] */ -/* |--> deplacement */ -/* V */ -/* ad_deb */ -/* ex2 : avant [+++++++++++++++++++++++++++] */ -/* deplacement<--| */ -/* V */ -/* ad_deb */ -/* apres [++++++++++++++++++++++++] */ -/* | */ -/* V */ -/* ad_deb */ -/* NB: on lit et on ecrit des buffers de taille fd->taille_buffer */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/*****************************************************************************/ -static CAI_OK_KO cai_deplaceficDA(CAI_FILE_DA *fd ,long debut,long deplacement) - -{ -CAI_OK_KO fin_fichier_avant_transfert; /* fin fichier origine */ -long nb_octets_a_transferer; /* nombre total d'octets a transferer */ -long nb_octets_transferes; /* nombre total d'octets transferes */ -long nb_octets_a_lire; /* longueur courante du buffer a lire */ -long nb_octets_lus; /* longueur du buffer lu */ -long adresse_debut_buffer; /* adresse debut courante a lire */ -CAI_OK_KO retour; -off_t cr; /* code retour des fonctions appelees */ -long cr2; -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -retour =lseek(fd->descr,0L,SEEK_END); -if ( retour == -1) - { - sprintf(CAI_ERREUR,"erreur lors d'un lseek sur le fichier de DA"); - retour=CAI_PB_LSEEK ; - goto ERREUR; /* pb lseek */ - } -fin_fichier_avant_transfert=retour; -if ( debut < 0) { - sprintf(CAI_ERREUR,"erreur debut de la zone a deplacer negative (%d)",debut); - retour=CAI_DEB_NEG; - goto ERREUR; /* debut negatif */ - } -if ( debut > fin_fichier_avant_transfert) { - sprintf(CAI_ERREUR,"erreur debut de la zone a deplacer en dehors du fichier ",debut); - retour=CAI_FIN_DEP; - goto ERREUR; /* pb debut en dehors du fichier */ - } -if ( debut + deplacement < 0) { - sprintf(CAI_ERREUR,"pb de tassement: deplacement de la zone impossible "); - retour=CAI_ECRASEMENT; - goto ERREUR; /* pb tassement du fichier en tete */ - } -nb_octets_transferes=0; -nb_octets_a_transferer=fin_fichier_avant_transfert - debut; - -if ( deplacement >= 0) - { - adresse_debut_buffer=maxi(debut,fin_fichier_avant_transfert - fd->taille_buffer); - } -else - { - adresse_debut_buffer=debut; - } - -/*CD TANT QUE tous les octets n'ont pas ete transferes */ -while (nb_octets_transferes < nb_octets_a_transferer) - { - nb_octets_a_lire = mini(fd->taille_buffer, nb_octets_a_transferer - nb_octets_transferes); - cr = lseek(fd->descr,adresse_debut_buffer,SEEK_SET); - if( cr != adresse_debut_buffer) - { - sprintf(CAI_ERREUR,"erreur lors d'un lseek sur le fichier de DA"); - retour=CAI_PB_LSEEK; - goto ERREUR; - } - nb_octets_lus = read(fd->descr,fd->buffer,nb_octets_a_lire); - if (nb_octets_lus != nb_octets_a_lire) - { - sprintf(CAI_ERREUR,"erreur de lecture dans le fichier de DA"); - retour=CAI_PB_READ; - goto ERREUR; - } - cr= lseek(fd->descr,adresse_debut_buffer+deplacement,SEEK_SET); - - if ( cr != (adresse_debut_buffer + deplacement)) - { - sprintf(CAI_ERREUR,"erreur lors d'un lseek sur le fichier de DA"); - retour=CAI_PB_LSEEK; - goto ERREUR; - } - cr2=write(fd->descr,fd->buffer,nb_octets_lus); - if ( cr2 != nb_octets_lus ) - { - sprintf(CAI_ERREUR,"erreur d'ecriture dans le fichier de DA"); - retour=CAI_PB_WRITE; - goto ERREUR; - } - nb_octets_transferes = nb_octets_transferes + nb_octets_lus; - if ( deplacement >= 0) - { - adresse_debut_buffer=maxi( adresse_debut_buffer - fd->taille_buffer,debut); - } - else - { - adresse_debut_buffer=mini( adresse_debut_buffer + fd->taille_buffer,fin_fichier_avant_transfert); - } - } -/*CD FIN TANT QUE tous les octets n'ont pas ete transferes */ -if (deplacement < 0 ) - { - retour=ftruncate(fd->descr,(size_t)(fin_fichier_avant_transfert+deplacement)); - if (retour != 0) - { - sprintf(CAI_ERREUR,"erreur lors d'un ftruncate sur le fichier de DA"); - retour=CAI_PB_FTRUNC; - goto ERREUR; - } - } -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas nominal */ -/*---------------------------------------------------------------------------*/ -return(CAI_OK); -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas d'erreur */ -/*---------------------------------------------------------------------------*/ -ERREUR: -return(retour); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_lireficDA */ -/* */ -/* ROLE: Cette operation interne lit dans le fichier de DA un buffer a partir*/ -/* d'une adresse specifiee par l'utilisateur d'un nombre d'octets specifie*/ -/* par l'utilisateur . */ -/* ( utilisation de lseek , read ) */ -/* ( buffer probable de 4096 octets) */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* CODE RETOUR : CAI_OK ou CAI_KO */ -/* " erreur lors du rewind sur le fichier de DA " */ -/* " erreur lors du fseek sur le fichier de DA ( ad_deb =%d) " */ -/* " erreur a la lecture du fichier de donnees auxiliaires %s" */ -/*****************************************************************************/ -static CAI_OK_KO cai_lireficDA(CAI_FILE_DA *fd,long ad_deb,char *buff) - -{ -off_t offset; /* offset dans le fichier de donnees auxiliaires */ -off_t offreel; /* offset reel obtenu apres lseek */ -long nb_lus; /* nombres d'octets lus */ -CAI_OK_KO cr; /* code retour */ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -cr=CAI_OK; -/*CD on se positionne sur le debut du fichier ( rewind ) */ -offset=0; -offreel=lseek(fd->descr,offset,SEEK_SET); -/*CD SI erreur on sort "erreur lors du rewind du fichier de DA " */ -if ( offreel == -1) - { - cr=CAI_PB_LSEEK; - sprintf(CAI_ERREUR,"erreur lors du rewind du fichier %s",fd->nom_fichier); - goto ERREUR; - } -/*CD on se deplace de ad_deb octets dans le fichier (fseek) */ -offset=ad_deb; -offreel=lseek(fd->descr,offset,SEEK_SET); -/*CD SI erreur on sort " erreur lors du lseek du fichier de DA (ad_deb=%d)" */ -if ( offreel == -1) - { - cr=CAI_PB_LSEEK; - sprintf(CAI_ERREUR,"erreur lors du lseek sur le fichier %s",fd->nom_fichier); - goto ERREUR; - } -/*CD SI erreur on sort "erreur lors du fseek du fichier de DA " */ -/*CD on lit le buffer ( read ) */ -nb_lus=read(fd->descr,buff,fd->taille_buffer); -if (nb_lus == -1) - { - sprintf(CAI_ERREUR,"erreur lors du read sur le fichier %s",fd->nom_fichier); - cr=CAI_PB_READ; - goto ERREUR; - } -*(buff + nb_lus)= '\0'; -/*CD SI taille_ecrite <> taille buff on sort " erreur a l'ecriture du fichier de donnee ..." */ -if ( nb_lus != fd->taille_buffer) - { - fd->taille_buffer_lu=nb_lus; - } -else - { - fd->taille_buffer_lu=fd->taille_buffer; - } -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas nominal */ -/*---------------------------------------------------------------------------*/ -return(CAI_OK); -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas d'erreur */ -/*---------------------------------------------------------------------------*/ -ERREUR: -return(cr); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_ecrireficDA */ -/* */ -/* ROLE: Cette operation interne ecrit dans un fichier de DA temporaire un buffer a partir*/ -/* d'une adresse specifiee par l'utilisateur d'un nombre d'octets specifie*/ -/* par l'utilisateur . */ -/* ( utilisation de rewind , fseek , write ) */ -/* ( buffer probable de 4096 octets) */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* CODE RETOUR : CAI_OK ou CAI_KO */ -/* " erreur lors du rewind sur le fichier de DA " */ -/* " erreur lors du fseek sur le fichier de DA ( ad_deb =%d) " */ -/* " erreur a l'ecriture du fichier de donnees auxiliaires %s" */ -/*****************************************************************************/ -static CAI_OK_KO cai_ecrireficDA(CAI_FILE_DA *fd,long ad_deb, - long taille, char **buff ) - -{ -off_t offset; /* offset dans le fichier de donnees auxiliaires */ -off_t offreel; /* offset reel obtenu apres lseek */ -long nb_ecrits; /* nombres d'octets ecrit */ -CAI_OK_KO cr; /* code retour */ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -cr=CAI_OK; -/*CD on se positionne sur le debut du fichier ( lseek ) */ -offset=0; -offreel=lseek(fd->descr,offset,SEEK_SET); -/*CD SI erreur on sort "erreur lors du rewind du fichier de DA " */ -if ( offreel == -1) - { - cr=CAI_PB_LSEEK; - sprintf(CAI_ERREUR,"erreur lors du lseek sur le fichier %s",fd->nom_fichier); - goto ERREUR; - } -/*CD on se deplace de ad_deb octets dans le fichier (fseek) */ -offset=ad_deb; -offreel=lseek(fd->descr,offset,SEEK_SET); -/*CD SI erreur on sort " erreur lors du lseek du fichier de DA (ad_deb=%d)" */ -if ( offreel == -1) - { - cr=CAI_PB_LSEEK; - sprintf(CAI_ERREUR,"erreur lors du lseek sur le fichier %s",fd->nom_fichier); - goto ERREUR; - } -/*CD on ecrit le buffer ( write ) */ -nb_ecrits=write(fd->descr,*buff,taille); -/*CD SI taille_ecrite <> taille buff on sort " erreur a l'ecriture du fichier de donnee ..." */ -if ( nb_ecrits != taille) - { - sprintf(CAI_ERREUR,"erreur lors du write sur le fichier %s",fd->nom_fichier); - cr=CAI_PB_WRITE; - goto ERREUR; - } -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas nominal */ -/*---------------------------------------------------------------------------*/ -return(CAI_OK); -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas d'erreur */ -/*---------------------------------------------------------------------------*/ -ERREUR: -return(cr); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_decodedonDA */ -/* */ -/* ROLE: Cette operation interne decode une donnee sous la forme */ -/* ENTIER: (( 1 2 24 ) ( 4 5 6 )) ou REEL: ((1. 2. 24.) (4. 5. 6.)) */ -/* ASCII: (( "1" "2" "24" ) ( "4" "5" "6" )) */ -/* BLOC ( donnee vide ) */ -/* cette operation commence par rechercher la premiere donnee pour determiner*/ -/* le type de donnee puis decode chaque donnee , alloue la place necessaire */ -/* et parcourt ainsi tout le buffer */ -/* NB: Si la donnee est coupee on rend a l'appelant le statut "en cours" */ -/* ainsi qu'un pointeur sur le caractere suivant la derniere donnee lus et */ -/* l'etat de l'automate . */ -/* la place est alloue par cette operation mais l'appelant se charge de la */ -/* liberer si besoin. */ -/* */ -/* */ -/* ETAT = ( DEBUT DECODAGE <=> ATTENTE (( 0 */ -/* ATTENTE ( 1 */ -/* ATTENTE DONNEE 2 */ -/* ATTENTE DONNEE ou ) 3 */ -/* ATTENTE ) ou ( 4 */ -/* FIN decodage 5 */ -/* BLOC 6 */ -/* ERREUR parenthese 11 */ -/* ERREUR fin de donne prematuree 13 */ -/* CARACTERE = ( */ -/* ) */ -/* AUTRE */ -/* < */ -/* BLANC ou TAB ou \N */ -/* etat: CARACTERE ( ) AUTRE < BLANC ou TAB ou \n */ -/* 0 1 11 11 6 0 */ -/* 1 2 11 11 13 1 */ -/* 2 11 4 3 13 2 */ -/* 3 11 4 3 13 3 */ -/* 4 2 5 11 13 4 */ -/* */ -/* dans les etats 2 et 3 si l'evenement = AUTRE on passe a un nouvel */ -/* automate ( remarque :si 2 dimensions on passe de l'etat 4 a l'etat 2 */ -/* */ -/* ETAT1 = Debut decodage donnee 0 */ -/* attente point(reel) ou blanc (entier) 1 */ -/* attente " 2 */ -/* attente BLANC ou TAB ou \n 3 */ -/* ENTIER 4 */ -/* chaine de caracteres 5 */ -/* REEL 6 */ -/* erreur donnee 11 */ -/* CARACTERE1 = . */ -/* " */ -/* BLANC ou TAB ou \n */ -/* CHIFFRE */ -/* SIGNE */ -/* AUTRE */ -/* */ -/* etat :caractere1 . " BLANC ou TAB ou \n ou ) CHIFFRE SIGNE AUTRE*/ -/* 0 3 2 11 1 1 11 */ -/* 1 3 11 4 1 11 11 */ -/* 2 2 5 2 2 2 2 */ -/* 3 3 11 6 3 3 3 */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* CODE RETOUR : CAI_OK ou CAI_KO */ -/* "ERREUR donnee non presente ( mot cle %s)" */ -/* "erreur parenthese ( mot cle %s)" */ -/* "erreur fin de donnee prematuree ( mot cle %s) */ -/* "erreur type de donne non reconnu" */ -/* "erreur de decodage de la donne (mot cle %s) " */ -/*****************************************************************************/ -static CAI_OK_KO cai_decodedonDA(long taille_buf, char buff[],long ad_deb, - CAI_TYPE *type_lu,int *nb_lig_lu,int *nb_elt_lu, - int *nb_elt_alloc,long *taille_cell_lu, - void **don_lue, CAI_ETAT1 *etat1,long *ad_fin_dec) -{ -long indice; /* indice de parcourt du buffer */ -CAI_TYPE type; /* type de la donnee decodee */ -int nb_lig; /* nombre de lignes de la donnee */ -int nb_elt; /* nombre d'elements de la donnee */ -long taille_max; /* taille max d'une cellule CAI_ASCII */ -int cr; /* code retour de la fonction */ -CAI_OK_KO code; /* code retour */ -char car; /* caractere courant traite */ -CAI_ETAT1 etat1_prec; /* etat precedent de niveau 1 */ -CAI_EVT1 evt1; /* evenement de niveau 1 detectee */ -CAI_ETAT2 etat2; /* etat de niveau 2 ( determination du type ) */ -CAI_EVT2 evt2; /* evenement de niveau2 */ -long ad_deb_do; /* adresse de debut de la donnee courante */ -long int *entier; /* pointeur sur donnees entieres */ -double *reel; /* pointeur sur donnees reelles */ -char *asc; /* pointeur sur donnees ascii */ -int nb_elt_alloues;/* nombres d'elements alloues */ -long taille; /* taille d'une donnee a decoder */ -int nb_col; /* nombre de colonnes */ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -/* initialisations */ - -cr=CAI_OK; -indice=ad_deb; -type= *type_lu; -nb_lig= *nb_lig_lu; -nb_elt= *nb_elt_lu; -taille_max = *taille_cell_lu; -nb_elt_alloues= *nb_elt_alloc; -taille=0; -if (type == CAI_ASCII) - { - asc=(char *) *don_lue; - } -else - { - if (type == CAI_REEL8) - { - reel=(double *) *don_lue; - } - else - { - if (type == CAI_ENTIER4) - { - entier=(long int *) *don_lue; - } - else - { - asc = (char *)malloc(CAI_TAILLE_MAX_ASCII); - if (asc == NULL ) - { - sprintf(CAI_ERREUR,"Erreur d'allocation lors de la lecture de la donnees"); - cr=CAI_ERR_ALLOC; - goto ERREUR; - } - reel=(double *)asc; - entier=(long int *)asc; - } - } - } - -/*---------------------------------------------------------------------------*/ -/* TANT QUE non erreur et non fin decodage et indice < taille buffer */ -/*---------------------------------------------------------------------------*/ -while( *etat1 >= 0 && *etat1 != CAI_FINDEC && indice < taille_buf) - { -/* car = buff[indice] */ -/* etat1_prec=etat1 */ - car = buff[indice]; - etat1_prec=*etat1; -/*---------------------------------------------------------------------------*/ -/* fonction interne testant ( ) < BLANC ou TAB ou n AUTRE */ -/*---------------------------------------------------------------------------*/ - code=cai_analyseDA( - car, /* [E] caractere a tester */ - &evt1 /* [S] evenement detecte */ - ); - -/* etat1 = automate1[etat1][evt1] */ - *etat1 = autom1[*etat1][evt1]; -/* si erreur on affiche le messsage associe et on sort */ - if (*etat1 > 10) - { - switch (*etat1) { - case CAI_ERR11:cr = CAI_ERR_FORME_FIC; - sprintf(CAI_ERREUR,"erreur: forme donnee non coherente"); - break; - case CAI_ERR13:cr = CAI_ERR_FIN_DO; - sprintf(CAI_ERREUR,"erreur: fin de donnee prematuree"); - break; - default:cr = CAI_KO; - sprintf(CAI_ERREUR,"erreur automate1 non reconnue"); - break; - } - goto ERREUR; - } -/* si etat1= 2 et etat1_prec=4 */ -/* dim2 = dim2 + 1 */ - if ( *etat1 == CAI_ETAT12 && etat1_prec == CAI_ETAT14) - { - nb_lig=nb_lig + 1; - } -/* sauvegarde ad_deb_do */ - ad_deb_do=indice+1; - if ( *etat1 == CAI_BLOCVIDE ) - { - type=CAI_BLOC; - nb_lig=1; - nb_elt=0; - *etat1 = CAI_FINDEC; - } -/* SI (etat1=3) */ - if ( *etat1 == CAI_ETAT13) - { -/* initialisation etat2 */ - etat2= CAI_DEBUTYPE; -/* sauvegarde ad_deb_do */ - ad_deb_do=indice; -/*---------------------------------------------------------------------------*/ -/* TANT QUE etat2 non REEL et non ENTIER et non ASCII et indice < taille buffer */ -/*---------------------------------------------------------------------------*/ - while ( etat2 != CAI_REEL && etat2 != CAI_ENTIER && etat2 != CAI_ASC && indice <taille_buf ) - { -/*---------------------------------------------------------------------------*/ -/* fonction interne testant . " CHIFFRE SIGNE BLANC AUTRE */ -/*---------------------------------------------------------------------------*/ - code=cai_typeDA( - car, /* [E] caractere a tester */ - &evt2 /* [S] evenement detecte */ - ); -/* etat2 = automate2[etat2][evt2] */ - etat2=autom2[etat2][evt2]; -/* si erreur on affiche le messsage associe et on sort */ - if (etat2 > 10) - { - switch (etat2) { - case CAI_ERR21:cr = CAI_ERR_TYP; - sprintf(CAI_ERREUR,"erreur: type de donnee non coherente"); - break; - default:cr = CAI_KO; - sprintf(CAI_ERREUR,"erreur automate2 non reconnue"); - break; - } - goto ERREUR; - } -/* l'indice est incremente */ - indice ++; - car = buff[indice]; - } -/*---------------------------------------------------------------------------*/ -/* FIN TANT QUE non erreur et non REEL et non ENTIER et non ASCII */ -/*---------------------------------------------------------------------------*/ - -/* SI on arrive en fin de buffer sans avoir decode la donnee */ - if ( indice == taille_buf && (etat2 != CAI_REEL || etat2 != CAI_ENTIER || etat2 != CAI_ASC)) - { - cr= CAI_EOF; - } - else - { - if (etat2 == CAI_ASC || type == CAI_ASCII ) - { - if (etat2 != CAI_ASC || (type != CAI_ASCII && type != CAI_INCONNU)) - { - sprintf(CAI_ERREUR,"Erreur: melange de type dans une meme donnee"); - cr=CAI_ERR_ASCII; - goto ERREUR; - } - type=CAI_ASCII; -/*---------------------------------------------------------------------------*/ -/* si CAI_ASCII allocation et decodage entre ad_deb+1 et ad_fin -1 */ -/* ( verification que la taille est inferieure a la taille max CAI_ASCII) */ -/*---------------------------------------------------------------------------*/ - taille= (indice) - (ad_deb_do) -2 + 1; - if (taille >= CAI_TAILLE_MAX_ASCII) - { - sprintf(CAI_ERREUR,"donnee ascii de taille sup a CAI_TAILLE_MAX_ASCII (%d)",taille); - cr=CAI_ERR_ASCII; - goto ERREUR; - } -/* allocation de CAI_NB_ALLOC element reel entier et ASCII */ -/* par un realloc d'un ascii ( taille max) et sscanf(%s) */ - if (nb_elt_alloues <= nb_elt) - { - asc = (char *)realloc(asc,CAI_TAILLE_MAX_ASCII*(CAI_NB_ALLOC + nb_elt_alloues)); - if (asc != NULL ) - { - nb_elt_alloues = CAI_NB_ALLOC + nb_elt_alloues; - } - else - { - sprintf(CAI_ERREUR,"Erreur d'allocation lors de la lecture de la donnees"); - cr=CAI_ERR_ALLOC; - goto ERREUR; - } - } - - strncpy(asc + (nb_elt*CAI_TAILLE_MAX_ASCII),buff+ad_deb_do+1,taille-1); - *(asc + (nb_elt)*CAI_TAILLE_MAX_ASCII +taille -1 )='\0'; -/* taille_max = sup (taille_max,taille) */ - taille_max=maxi(taille,taille_max); - -/* nbelt = nbelt + 1 */ - nb_elt=nb_elt +1; - } - else - { - indice--; -/*---------------------------------------------------------------------------*/ -/* si REEL allocation et decodage entre ad_deb et ad_fin-1 */ -/* par un realloc d'un reel et sscanf(%lf) */ -/*---------------------------------------------------------------------------*/ - if (etat2 == CAI_REEL || type == CAI_REEL8) - { - if (etat2 != CAI_REEL || (type != CAI_REEL8 && type != CAI_INCONNU)) - { - sprintf(CAI_ERREUR,"Erreur: melange de types dans une meme donnee"); - cr=CAI_ERR_REEL; - goto ERREUR; - } - type = CAI_REEL8; -/* allocation de CAI_NB_ALLOC element reel */ - if (nb_elt_alloues <= nb_elt) - { - reel=(double *)realloc(reel,sizeof(double)*(CAI_NB_ALLOC + nb_elt_alloues)); - if (reel != NULL ) - { - nb_elt_alloues = CAI_NB_ALLOC + nb_elt_alloues; - } - else - { - sprintf(CAI_ERREUR,"Erreur d'allocation lors de la lecture de la donnees"); - cr=CAI_ERR_ALLOC; - goto ERREUR; - } - } - code=sscanf(buff+ad_deb_do," %lf",reel+nb_elt); - if (code != 1) - { - sprintf(CAI_ERREUR,"Erreur de decodage de la donnee reelle (element %d)",nb_elt); - cr=CAI_ERR_REEL; - goto ERREUR; - } - } - else - { - if (etat2 != CAI_ENTIER || (type != CAI_ENTIER4 && type != CAI_INCONNU)) - { - sprintf(CAI_ERREUR,"Erreur: melange de type dans une meme donnee"); - cr=CAI_ERR_ENTIER; - goto ERREUR; - } - type = CAI_ENTIER4; -/*---------------------------------------------------------------------------*/ -/* si ENTIER allocation et decodage entre ad_deb et ad_fin -1 */ -/* par un realloc d'un entier4 et sscanf(%d) */ -/* allocation de CAI_NB_ALLOC element entier */ -/*---------------------------------------------------------------------------*/ - if (nb_elt_alloues <= nb_elt) - { - entier=(long int *)realloc(entier,sizeof(long int)*(CAI_NB_ALLOC+nb_elt_alloues)); - if (entier != NULL ) - { - nb_elt_alloues = CAI_NB_ALLOC + nb_elt_alloues; - } - else - { - sprintf(CAI_ERREUR,"Erreur d'allocation lors de la lecture de la donnees"); - cr=CAI_ERR_ALLOC; - goto ERREUR; - } - } - code =sscanf(buff+ad_deb_do," %ld", - entier+nb_elt); - if (code != 1) - { - sprintf(CAI_ERREUR,"Erreur de decodage de la donnee entier(element %d)",nb_elt); - cr=CAI_ERR_ENTIER; - goto ERREUR; - } - } -/* nbelt = nbelt + 1 */ - nb_elt=nb_elt +1; - } -/* FIN SI on arrive en fin de buffer sans avoir decode la donnee */ -/* on se positionne sur le dernier caractere de la donnee */ - indice--; - } - *etat1 = CAI_ETAT12; -/* FIN SI (etat1=3) */ - } -/*---------------------------------------------------------------------------*/ -/* FIN SI */ -/*---------------------------------------------------------------------------*/ -/* l'indice est incremente */ - indice++; - } -/*---------------------------------------------------------------------------*/ -/* FIN TANT QUE non erreur et non fin decodage et indice < taille buffer */ -/*---------------------------------------------------------------------------*/ -if (indice == taille_buf) - { - cr=CAI_EOF; - } -if (*etat1 == CAI_FINDEC) - { -/* nb_col = nbelt nb_lig */ - nb_col = (nb_elt/nb_lig); -/* SI nb_lig . nb_col <> nbelt alors erreur dans le nombre d'elements d'une ligne*/ - if ( (nb_lig * nb_col) != nb_elt) - { - sprintf(CAI_ERREUR,"Nombre d'elements decodes incoherent (nb_elt:%d nb_lig:%d)",nb_elt,nb_lig); - cr=CAI_ERR_DIM; - goto ERREUR; - } - } -/*---------------------------------------------------------------------------*/ -/* nb_elt_lu = nb_elt */ -/* nb_lig_lu = dim2 */ -/* etat1 = etat1 */ -/* type_lu = type */ -/* taille_cell_lu= CAI_REEL8 ou CAI_ENTIER4 ou CAI_ASCII( taille max ) */ -/* ad_fin_dec= ad_fin ( pour lecture du prochain buffer si besoin) */ -/*---------------------------------------------------------------------------*/ -*type_lu=type; -*nb_lig_lu=nb_lig; -*nb_elt_lu=nb_elt; -*taille_cell_lu=taille_max; -*ad_fin_dec=ad_deb_do; -*nb_elt_alloc=nb_elt_alloues; -if (type == CAI_ASCII) - { - *don_lue=(void *)asc; - } -else - { - if (type == CAI_REEL8) - { - *don_lue=(void *)reel; - } - else - { - *don_lue=(void *)entier; - } - } -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas nominal */ -/*---------------------------------------------------------------------------*/ -return(cr); -/*---------------------------------------------------------------------------*/ -/*CD fin de l'operation en cas d'erreur */ -/*---------------------------------------------------------------------------*/ -ERREUR: -/* affectation pour pouvoir liberer la place allouee ( par l'appelant )*/ -if (type == CAI_ASCII) - { - *don_lue=(void *)asc; - } -else - { - if (type == CAI_REEL8) - { - *don_lue=(void *)reel; - } - else - { - *don_lue=(void *)entier; - } - } -return(cr); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_analyseDA */ -/* */ -/* ROLE: Cette operation interne est un automate qui teste les caracteres */ -/* ( , ) , AUTRE , < , BLANC ou TAB ou \N */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* CODE RETOUR : CAI_OK ou CAI_KO */ -/*****************************************************************************/ -static CAI_OK_KO cai_analyseDA(char car, CAI_EVT1 *evt1) - -{ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -/*CD si char = '(' evt1 = 0 */ -if (car == '(' ) - { - *evt1 = CAI_PAR_OUV; - } -else - { -/*CD sinon si char = ')' evt1 = 1 */ - if (car == ')' ) - { - *evt1 = CAI_PAR_FERM; - } - else - { -/*CD sinon si char = '<' evt1 = 3 */ - if (car == '<' ) - { - *evt1=CAI_INF; - } - else - { -/*CD sinon si char = BLANC ou TAB ou n evt1= 4 */ - if (car==' ' || car==' ' || car=='\n') - { - *evt1=CAI_BLANC; - } - else - { -/*CD sinon evt1 = 2 */ - *evt1=CAI_DONNEE; - } -/*CD fin si */ - } -/*CD fin si */ - } -/*CD fin si */ - } -/*CD fin si */ - return(CAI_OK); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_typeDA */ -/* */ -/* ROLE: Cette operation interne est un automate qui teste les caracteres */ -/* . , " , BLANC ou TAB ou \n ou ), CHIFFRE , SIGNE , AUTRE */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* CODE RETOUR : CAI_OK ou CAI_KO */ -/*****************************************************************************/ -static CAI_OK_KO cai_typeDA(char car, CAI_EVT2 *evt2) - -{ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -/*CD si char = '.' evt1 = 0 */ -if (car == '.' ) - { - *evt2=CAI_POINT; - } -else - { -/*CD sinon si char = '"' evt1 = 1 */ - if (car=='"' ) - { - *evt2=CAI_GUILL; - } - else - { -/*CD sinon si char = BLANC ou TAB ou \n ou ) evt1 = 2 */ - if (car==' ' || car==' ' || car=='\n' || car==')' ) - { - *evt2=CAI_ESPACE; - } -else - { -/*CD sinon si char = CHIFFRE (isdigit) evt1= 3 */ - if ( isdigit(car) != 0) - { - *evt2=CAI_CHIFFRE; - } - else - { -/*CD sinon si char = SIGNE evt1= 4 */ - if ( car == '+' || car =='-') - { - *evt2=CAI_SIGNE; - } - else - { -/*CD sinon evt1= 5 */ - *evt2=CAI_AUTRE; - } - } -/*CD fin si */ - } -/*CD fin si */ - } -/*CD fin si */ - } -/*CD fin si */ - - return(CAI_OK); - -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/********************************************************************************/ -/* */ -/* OPERATION: cai_recherchecleDA */ -/* */ -/* ROLE: Cette operation interne recherche un mot cle dans le buffer buff. */ -/* (de taille specifiee dans CAI_FILE_DA). on retourne le mot cle, sa longueur */ -/* et l'adresse dans le tableau du caractere suivant le mot cle . */ -/* NB: attention au cas ou le mot cle est coupe on renvoie un statut */ -/* "non trouve" comme si rien n'avait pu etre detecte */ -/* */ -/* ETAT = ( DEBUT DECODAGE <=> ATTENTE < 0 */ -/* ATTENTE > 1 */ -/* FIN DECODAGE 2 | */ -/* ERREUR Syntaxe (<...<) CAI_ERR_CROCHET | status de */ -/* ERREUR Donnee non presente CAI_EOF| retour */ -/* ERREUR fin de donnee prematuree CAI_PAS_MC | */ -/* */ -/* CARACTERE = < > AUTRE FIN_FICHIER */ -/* */ -/* Etat : CARACTERE < > AUTRE FIN_FICHIER */ -/* 0 1 0 0 -1 */ -/* 1 -25 2 1 -24 */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* */ -/********************************************************************************/ -static CAI_OK_KO cai_recherchecleDA(long taille_buf,char *buff, - long ad_deb,char *mot_cle,long *ad_suiv) - -{ -long retour; /* code retour */ -char * indice; /* indice de parcourt du buffer */ -int nb_car; /* nombre de caracteres du mot cle */ -char *ad; /* adresse d'un caractere */ -long adr_deb_mot; /* adresse debut de mot cle */ -CAI_ETAT3 etat; /* etat de niveau 3 */ -CAI_EVT3 evt3; /* evenement de niveau 3 */ -char c; /* caractere courant traite */ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -/*CD Initialisation : On se positionne a l'adresse a partir de laquelle il */ -/*CD faut scanner le buffer */ -/*CD On recherche le premier caractere < (strchr) */ -/*------------------------------------------------------------------------------*/ - -indice =(char *) strchr ((char *)(buff+ad_deb), '<'); - -/*CD Si le code retour de strchr est NULL (< non trouve), erreur rencontree, */ -if (indice == NULL) - { - retour = CAI_EOF; - sprintf(CAI_ERREUR,"erreur: pas de mots cle a partir de l adresse %d", ad_deb); - goto ERREUR; - } - -/*------------------------------------------------------------------------------*/ -/*CD On sauvegarde l'adresse relative de debut du mot cle */ -/*------------------------------------------------------------------------------*/ -adr_deb_mot = (long)(indice - buff) + 1; - -/*------------------------------------------------------------------------------*/ -/*CD On utilise un automate pour analyser les caracteres (en les comptant) ; */ -/*CD on sort de l'analyse avec : 2 fin decodage ok */ -/*CD -1 erreur syntaxe ( < < ) */ -/*CD -3 On n'a pas assez de donnees pour */ -/*CD analyser integralement le mot cle */ -/*------------------------------------------------------------------------------*/ -etat = 0; -nb_car = 0; - -while (etat != 2 && etat != CAI_PAS_MC && etat != CAI_ERR_CROCHET) - { - ad = (char *)(indice + nb_car); - c = *ad; - nb_car = nb_car + 1; - retour =cai_mot_cleDA(c, /* [E] caractere a tester */ - &evt3); /* [S] evenement detecte */ - etat = autom3 [etat] [evt3]; - } -nb_car = nb_car -2; - -/*CD si etat erreur : envoi message */ -if (etat == CAI_PAS_MC) - { - retour = CAI_PAS_MC; - sprintf (CAI_ERREUR,"le mot cle n'est pas inclu entierement dans le buffer"); - goto ERREUR; - } -if (etat == CAI_ERR_CROCHET ) - { - retour = CAI_ERR_CROCHET; - sprintf (CAI_ERREUR,"2 crochets ouvrant < < ont ete detecte dans le mot cle"); - goto ERREUR; - } - -/*CD si mot cle trop long, erreur */ -if (nb_car > CAI_TAILLE_MAX_CLEDA) - { - retour = CAI_CLE_TROP_LONG; - sprintf (CAI_ERREUR,"le mot cle est trop long"); - goto ERREUR; - } - -/*CD si decodage ok et si le mot cle n'est pas trop long, */ -if (etat ==2 ) - { -/*CD sauvegarde du mot cle, de sa longueur, et de l'adresse du premier */ -/*CD caractere suivant le mot cle */ - memcpy (mot_cle,(indice + 1), nb_car); - *(mot_cle + nb_car) = '\0'; - *ad_suiv = adr_deb_mot + nb_car + 1; - } - -/*---------------------------------------------------------------------------*/ -/* Fin du traitement nominal */ -/*---------------------------------------------------------------------------*/ -retour = CAI_OK; -return (retour); - -/*---------------------------------------------------------------------------*/ -/* traitement degrade : */ -/*---------------------------------------------------------------------------*/ -ERREUR : -return (retour); - -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_decodeautom3DA */ -/* */ -/* ROLE: Cette operation interne est un automate qui teste les caracteres */ -/* < > fin_buffer blanc (' ' '\n') autre */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* CODE RETOUR : CAI_OK ou CAI_KO */ -/*****************************************************************************/ -static CAI_OK_KO cai_mot_cleDA(char car, CAI_EVT3 *evt3) - -{ -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -/*CD si char = ' ' ou \n evt3 = ESPACE */ -/*CD si char = '<' evt3 = INFERIEUR */ -/*CD si char = '>' evt3 = SUPERIEUR */ -/*CD si char = \0 evt3 = FIN */ -/*CD sinon evt3 = AUTRES */ - -switch (car) - { - case (' ') : - *evt3 = CAI_ESPACE; - break; - case ('\n') : - *evt3 = CAI_ESPACE; - break; - - case '<' : - *evt3 = CAI_INFERIEUR; - break; - case '>' : - *evt3 = CAI_SUPERIEUR; - break; - case '\0' : - *evt3 = CAI_FIN; - break; - - default: - *evt3 = CAI_AUTRES; - break; - } -return (CAI_OK); -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_ecritDA_buf */ -/* */ -/* ROLE: Cette operation ecrit une DA dans un buffer */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* Cette operation doit etre appelee apres ouverture prealable fichier */ -/* de Donnees Auxiliaires */ -/* */ -/* VERSION: */ -/* */ -/* CODE RETOUR : CAI_OK ou CAI_KO */ -/* si CAI_KO, l'erreur peut etre affichee via la variable globale CAI_ERREUR*/ -/* " fichier de donnees auxiliaires %s non ouvert " */ -/* " erreur de positionnement en fin de fichier " */ -/* " erreur d'ecriture dans le fichier " */ -/*****************************************************************************/ -static CAI_OK_KO cai_ecritDA_buf(CAI_FILE_DA *fd,char *mot_cle, - CAI_TYPE type,int nb_lig,int nb_col, - long taille_cell, void *donnee, - int indic_ecrit,char **da_ascii) -{ -CAI_OK_KO retour; /* code retour des fonctions */ -char don_ascii[CAI_TAILLE_MAX_LIGDA];/* buffer contenant une donnee en ascii */ -char * pt_don; /* pointeur sur don_ascii utilise pour l'ascii */ -char * pt_ascii; /* pointe sur da_ascii a l'emplacement du premier caractere libre*/ -int lig; /* indice de boucle sur les lignes */ -int col; /* indice de boucle sur les colonnes */ -char * pt_deb_lig; /* pointe sur da_ascii a l'adresse de debut de derniere ligne */ -int nb_bloc; /* nombre de blocs de CAI_TAILLE_BUFFER alloues pour da_ascii */ -long *dbentier; /* pointeur sur variable entiere double */ -float *reel; /* pointeur sur variable reelle simple precision */ -double *dbreel; /* pointeur sur variable double precision */ -long longueur; /* longueur significative d'un buffer */ -long sauv_diff_deb; /* difference d'adresse entre derniere ligne du buffer et debut du buffer */ -long sauv_diff_cour; /* difference d'adresse entre premier element libre du buffer et debut du buffer */ -char * tempo; - -/*---------------------------------------------------------------------------*/ -/* DEBUT DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -/*CD initialisation des types */ -dbentier = (long *) donnee; -reel = (float *) donnee; -dbreel = (double *) donnee; -/*------------------------------------------------------------------------------*/ -/*CD Allocation d'un espace memoire pour le buffer d'ecriture de la donnee */ -/*CD auxiliaire */ -/*CD (il faut essayer d'allouer un maximum de place representative afin */ -/*CD d'eviter un trop grand nombre de realloc) */ -/*------------------------------------------------------------------------------*/ -*da_ascii = NULL; -*da_ascii = (char *)malloc (CAI_TAILLE_BUFFER); -if (*da_ascii== NULL) - { - retour = CAI_ERR_ALLOC; - sprintf (CAI_ERREUR," erreur allocation memoire pour DA ascii "); - goto ERREUR; - } - nb_bloc = 1; - -/*------------------------------------------------------------------------------*/ -/*CD On ecrit dans le buffer, avec la syntaxe desiree le mot cle suivi d'un \n */ -/*------------------------------------------------------------------------------*/ -sprintf (*da_ascii, "<%s>\n", mot_cle); -pt_ascii = *da_ascii + strlen (*da_ascii); -pt_deb_lig = pt_ascii; - -/*------------------------------------------------------------------------------*/ -/*CD Initialisation d'une ligne de caracteres ascii, si des donnees sont */ -/*CD a ecrire */ -/*------------------------------------------------------------------------------*/ - -if ((nb_lig != 0 && nb_col != 0 ) || type == CAI_BLOC) - { - if (type == CAI_BLOC) - { - nb_lig=0; - } - else - { - *pt_deb_lig = '('; - pt_ascii = pt_ascii + 1; - } - } -/*------------------------------------------------------------------------------*/ -/*CD POUR chaque ligne des donnees */ -/*------------------------------------------------------------------------------*/ -for (lig=0; lig < nb_lig; lig++) - { - -/*------------------------------------------------------------------------------*/ -/*CD Initialisation ( pour chaque ligne */ -/*------------------------------------------------------------------------------*/ - strcpy (pt_ascii ,"( "); - pt_ascii = pt_ascii + 2; - -/*------------------------------------------------------------------------------*/ -/*CD POUR chaque colonne de donnees */ -/*------------------------------------------------------------------------------*/ - for (col=0; col < nb_col; col++) - { - -/*------------------------------------------------------------------------------*/ -/*CD Suivant le type des donnees (entier double, */ -/*CD reel simple ou double, ascii), on ecrit dans le buffer */ -/*CD DON_ASCII dans un format donne (%d, %f, %lf, %s) la donnee */ -/*CD suivie d'un blanc */ -/*------------------------------------------------------------------------------*/ - - switch (type) - { - case CAI_ENTIER4: - sprintf(don_ascii, "%d ", - *(dbentier+(nb_col*lig + col)) ); - break; - case CAI_REEL4: - sprintf(don_ascii, "%#.6g ", *(reel+(nb_col*lig + col))); - break; - case CAI_REEL8: - sprintf(don_ascii, "%#.14g ", *(dbreel+(nb_col*lig + col))); - break; - case CAI_ASCII: - pt_don = don_ascii; - sprintf(pt_don, "\""); - pt_don = pt_don + 1; - tempo=((char *)donnee+(nb_col*lig + col)*taille_cell); - longueur = strlen (tempo); - memcpy (pt_don, tempo, longueur); - pt_don = pt_don + longueur; - sprintf(pt_don,"\" \0"); - break; - default: - retour = CAI_ERREUR_ENCODE; - sprintf (CAI_ERREUR," erreur ecriture en ascii de donnee "); - goto ERREUR; - } - -/*--------------------------------------------------------------------------------------*/ -/*CD On determine la longueur significative de ce buffer DON_ASCII (sans \0) */ -/*--------------------------------------------------------------------------------------*/ - longueur = strlen (don_ascii); - -/*--------------------------------------------------------------------------------------*/ -/*CD SI cette longueur + taille significative de da_ascii + \n))\n\0 est */ -/*CD superieure a la taille allouee pour da_ascii, on se realloue */ -/*CD de la place */ -/*--------------------------------------------------------------------------------------*/ - if ( (longueur+5 + (long) pt_ascii - (long)&(**da_ascii)) > (CAI_TAILLE_BUFFER*nb_bloc) ) - { - nb_bloc = nb_bloc + 1; - - sauv_diff_deb = (long) pt_deb_lig - (long)&(**da_ascii); - sauv_diff_cour = (long) pt_ascii - (long)&(**da_ascii); - - *da_ascii = (char *)realloc (*da_ascii, (CAI_TAILLE_BUFFER*nb_bloc)); - if (*da_ascii== NULL) - { - retour = CAI_ERR_ALLOC; - sprintf (CAI_ERREUR, - " erreur re-allocation memoire pour DA ascii-bloc %d ", - nb_bloc); - goto ERREUR; - } - - pt_deb_lig = *da_ascii + sauv_diff_deb; - pt_ascii = *da_ascii + sauv_diff_cour; - } - -/*--------------------------------------------------------------------------------------------------------------*/ -/*CD SI avec cette longueur + taille de ligne est superieure a CAI_TAILLE_MAX_LIGDA caracteres */ -/*CD A l'adresse courante on ecrit \n dans le buffer da_ascii */ -/*--------------------------------------------------------------------------------------------------------------*/ - if ( (longueur + (long)pt_ascii - (long)pt_deb_lig) >= CAI_TAILLE_MAX_LIGDA) - { - *pt_ascii = '\n'; - pt_ascii = pt_ascii + 1; - pt_deb_lig = pt_ascii; - - } - -/*------------------------------------------------------------------------------*/ -/*CD On recopie les donnees significatives de DON_ASCII dans le */ -/*CD buffer da_ascii a l'adresse pointeur */ -/*------------------------------------------------------------------------------*/ - strcpy (pt_ascii, don_ascii); - pt_ascii = pt_ascii + longueur; - } /*CD FIN POUR (col) */ - -/*------------------------------------------------------------------------------*/ -/*CD Initialisation ) apres les donnees de la ligne */ -/*CD SI longueur de la ligne < CAI_TAILLE_MAX_LIGDA alors */ -/*CD on ecrit \n */ -/*CD SINON */ -/*CD on ecrit \n)\n */ -/*------------------------------------------------------------------------------*/ - if (lig != (nb_lig-1)) - { - if ((pt_ascii - pt_deb_lig + 2) < (CAI_TAILLE_MAX_LIGDA) ) - { - strcpy (pt_ascii ,")\n"); - pt_ascii = pt_ascii + 2; - pt_deb_lig = pt_ascii; - } - else - { - strcpy (pt_ascii ,"\n)\n"); - pt_ascii = pt_ascii + 3; - pt_deb_lig = pt_ascii; - } - } - else /*CD on traite le cas de la derniere ligne */ - { - if ((pt_ascii - pt_deb_lig + 3) < (CAI_TAILLE_MAX_LIGDA) ) - { - strcpy (pt_ascii ,"))\n"); - pt_ascii = pt_ascii + 3; - pt_deb_lig = pt_ascii; - } - else - { - if ((pt_ascii - pt_deb_lig + 2) < (CAI_TAILLE_MAX_LIGDA) ) - { - strcpy (pt_ascii ,")\n)\n"); - pt_ascii = pt_ascii + 4; - pt_deb_lig = pt_ascii; - } - else - { - strcpy (pt_ascii ,"\n))\n"); - pt_ascii = pt_ascii + 4; - pt_deb_lig = pt_ascii; - } - } - - } - - - -} /*CD FIN POUR (lig) */ - -/*------------------------------------------------------------------------------*/ -/*CD On ecrit \0 en fin de buffer */ -/*------------------------------------------------------------------------------*/ -*pt_ascii='\0'; - -/*------------------------------------------------------------------------------*/ -/*CD Si l'utilisateur le desire on ecrit en fin de fichier le buffer */ -/*------------------------------------------------------------------------------*/ -if (indic_ecrit == 1) - { -/*CD On se positionne a la fin du fichier de DA. */ - retour = lseek(fd->descr, 0L, SEEK_END); - if (retour == -1) - { - retour = CAI_PB_LSEEK; - sprintf(CAI_ERREUR,"Dans ajouteDA, erreur positionnement en fin de fichier"); - goto ERREUR; - } - -/*CD On ecrit le buffer dans le fichier */ - longueur = (long) strlen(*da_ascii); - write (fd->descr, *da_ascii, longueur); - - } /* fin ecriture fichier */ - -/*------------------------------------------------------------------------------*/ -/*CD re-initialisations des pointeurs de la structure CAI_FILE_DA */ -/*CD ( buffers de lecture , liste de mots cles , longueurs ...) */ -/*------------------------------------------------------------------------------*/ -if (indic_ecrit == 1) { - fd->num_buffer=-1; - fd->nb_mot_cle=-1; - if (fd->liste_mot_cle != NULL) - { - free(fd->liste_mot_cle); - fd->liste_mot_cle=NULL; - - } - if (fd->ad_mot_cle != NULL) - { - free(fd->ad_mot_cle); - fd->ad_mot_cle=NULL; - - } - if (fd->ad_donnee != NULL) - { - free(fd->ad_donnee); - fd->ad_donnee=NULL; - } - -} - - -/*---------------------------------------------------------------------------*/ -/* Fin du traitement nominal */ -/*---------------------------------------------------------------------------*/ -retour = CAI_OK; -return (retour); - -/*---------------------------------------------------------------------------*/ -/* traitement degrade : */ -/*---------------------------------------------------------------------------*/ -ERREUR : - fd->num_buffer=-1; - fd->nb_mot_cle=-1; - if (fd->liste_mot_cle != NULL) - { - free(fd->liste_mot_cle); - fd->liste_mot_cle=NULL; - - } - if (fd->ad_mot_cle != NULL) - { - free(fd->ad_mot_cle); - fd->ad_mot_cle=NULL; - - } - if (fd->ad_donnee != NULL) - { - free(fd->ad_donnee); - fd->ad_donnee=NULL; - } - -return (retour); - -/*---------------------------------------------------------------------------*/ -/* FIN DE L'OPERATION */ -/*---------------------------------------------------------------------------*/ -} -/*****************************************************************************/ -/* */ -/* OPERATION: cai_lecture_colormap */ -/* */ -/* ROLE: lecture de la colormap dans les DA */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* */ -/* CODE RETOUR : CAI_OK ou CAI_KO */ -/* si CAI_KO, l'erreur peut etre affichee via la variable globale CAI_ERREUR*/ -/* */ -/*****************************************************************************/ - CAI_OK_KO cai_lecture_colormap(CAI_IMAGE *fdima) - -{ - CAI_MODE_OUVERTURE mode; /* mode de lecture du fichier de DA */ - char mot_cle[9]; /* mot cle associe aux donnees colormap */ - CAI_TYPE type; /* type des donnees a lire */ - int nb_lig; /* nombre de lignes du tableau a lire */ - int nb_col; /* nombre de colonnes du tableau a lire */ - long taille_cell; /* taille maxi en octets d'un element */ - /* (significatif si type = ascii) */ - CAI_OK_KO icr; /* compte-rendu de la fonction */ - CAI_FILE_DA *fd; /* Descripteur du fichier DA */ - char fic_DA[1024]; /* nom fichier de donnees auxillaires */ - - strcpy(fic_DA,fdima->NOM_IMAGE); - -/*** Ouverture du fichier de donnees auxilliaires ***/ - - mode = CAI_LECTURE; - fd=cai_openDA(fic_DA,fdima->TYPE_IMAGE,fdima->NB_CANAUX,mode); - if (fd == NULL) - { - /*--- il n'y a pas de donnees Colormap ---*/ - fdima->COLORMAP=0; - - } - else - { -/*** Recherche des caracteristiques des donnees Colormap ***/ - - strcpy(mot_cle,"COLORMAP"); - mot_cle[8]='\0'; - icr=cai_lirecaractDA(fd,mot_cle,&type,&nb_lig,&nb_col,&taille_cell); - if (icr != CAI_OK) - /*--- il n'y a pas de donnees Colormap ---*/ - fdima->COLORMAP=0; - else - { -/*** Lecture des donnees de Colormap ***/ - - fdima->TABCOLOR = (int *) malloc(sizeof(int)*768); - icr = cai_lireDA(fd,mot_cle,&type,&nb_lig,&nb_col, - &taille_cell,fdima->TABCOLOR); - if (icr == CAI_KO) - goto ERREUR; - fdima->COLORMAP = nb_col*nb_lig; - } - -/*** Fermeture du fichier de Donnees Auxilliaires ***/ - icr = cai_closeDA(fd); - } - return (CAI_OK); - -ERREUR: - return(CAI_KO); -} -/* - Fin de l'operation cai_lecture_colormap -*/ -/*****************************************************************************/ -/* */ -/* OPERATION: cai_ecriture_colormap */ -/* */ -/* ROLE: ecriture de la colormap dans les DA */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL: */ -/* */ -/* VERSION: */ -/* */ -/* CODE RETOUR : CAI_OK ou CAI_KO */ -/* si CAI_KO, l'erreur peut etre affichee via la variable globale CAI_ERREUR*/ -/* */ -/*****************************************************************************/ - CAI_OK_KO cai_ecriture_colormap(CAI_IMAGE *fdima) - - -{ - CAI_MODE_OUVERTURE mode; /* mode de lecture du fichier de DA */ - char mot_cle[13]; /* mot cle associe aux donnees colormap */ - CAI_TYPE type; /* type des donnees a ecrire */ - int nb_lig; /* nombre de lignes du tableau a ecrire */ - int nb_col; /* nombre de colonnes du tableau a ecrire */ - CAI_OK_KO icr; /* compte-rendu de la fonction */ - CAI_FILE_DA *fd; /* Descripteur du fichier DA */ - int Infos[3]; /* infos colormap pour attribution R V B */ - int taille_cell; - char fic_DA[1024]; - - strcpy(fic_DA,fdima->NOM_IMAGE); - -/*** Ouverture du fichier de donnees auxilliaires ***/ - - mode = CAI_ECRITURE; - - fd=cai_openDA(fic_DA,fdima->TYPE_IMAGE,fdima->NB_CANAUX,mode); - if (fd == NULL) - goto ERREUR; - else - { -/*** Initialisation et ecriture du champ infos colormap ***/ - - strcpy(mot_cle,"COLORMAPINFO"); - mot_cle[12]='\0'; - nb_lig=1; - nb_col=3; - type = CAI_ENTIER4; - taille_cell= sizeof (int); - Infos[0]=1; - Infos[1]=1; - Infos[2]=1; - icr = cai_ajouteDA(fd,mot_cle,type,nb_lig, - nb_col,taille_cell,Infos); - if (icr == CAI_KO) - goto ERREUR; - - -/*** Initialisation des caracteristiques des donnees Colormap ***/ - - strcpy(mot_cle,"COLORMAP"); - mot_cle[8]='\0'; - nb_lig=3; - nb_col=256; - type = CAI_ENTIER4; - taille_cell= sizeof (int); - -/*** Ecriture des donnees de Colormap ***/ - - icr = cai_ajouteDA(fd,mot_cle,type,nb_lig, - nb_col,taille_cell,fdima->TABCOLOR); - if (icr == CAI_KO) - goto ERREUR; - -/*** Fermeture du fichier de Donnees Auxilliaires ***/ - icr = cai_closeDA(fd); - } - return (CAI_OK); - -ERREUR: - return(CAI_KO); -} -/* - Fin de l'operation cai_ecriture_colormap -*/ - diff --git a/Utilities/CAI/cai_dll/src/cai_arcinfo.c b/Utilities/CAI/cai_dll/src/cai_arcinfo.c deleted file mode 100755 index 0f33a0b6ea..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_arcinfo.c +++ /dev/null @@ -1,1402 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_arcinfo.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format arcinfo version 7.4 et superieure */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : fevrier 1995 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <sys/types.h> -#include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> - -#define _CAI_IMAGE -# include "cai_image.h" - - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_arcinfo.c,v 1.5 00/11/29 11:02:59 cmf Exp $"; - - -extern char *getenv(); - -static void invert_oct(); - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_arcinfo */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format arcinfo */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_arcinfo(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_arcinfo (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -int cai_liste_ima_arcinfo (repert, - tab_ima) - -char *repert; -char ***tab_ima; - -{ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - struct dirent *dp; /* structure resultat de la fonction readdir */ - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - char *pch2,*pch3; /* pointeurs sur chaine de caracteres */ - char car; /* variable de travail */ - int nb_ima; /* nombre d'images arcinfo identifiees */ - int i; /* indice de boucle */ - - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - - dirp=opendir(repert); - - if(dirp!=NULL) - { -/*...................................... - - premiere passe pour comptabiliser les images du format donne - - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE ARCINFO - (EXTENSION =.lan ou .gis) - ..........................................*/ - - while((dp=readdir(dirp))!=NULL) - { - - car='.'; - pch0=strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='g'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='i'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - car='s'; - pch3=strrchr(dp->d_name,car); - if ((pch3 != NULL)&&(pch3==pch2+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - *pch3=' '; - nb_ima=nb_ima+1; - } - } - } - else - { - car='l'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='a'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - car='n'; - pch3=strrchr(dp->d_name,car); - if ((pch3 != NULL)&&(pch3==pch2+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - *pch3=' '; - nb_ima=nb_ima+1; - } - } - } - } - } - } - - (void)closedir(dirp); -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT ARCINFO - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE ARCINFO - (EXTENSION =.lan ou .gis) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - - while((dp=readdir(dirp))!=NULL) - { - - car='.'; - pch0=strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='g'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='i'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - car='s'; - pch3=strrchr(dp->d_name,car); - if ((pch3 != NULL)&&(pch3==pch2+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - *pch3=' '; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - } - else - { - car='l'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='a'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - car='n'; - pch3=strrchr(dp->d_name,car); - if ((pch3 != NULL)&&(pch3==pch2+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - *pch3=' '; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - } - } - } - } - - (void)closedir(dirp); - - } - else - { - /* Erreur : Repertoire inexistant */ - nb_ima=-1; - } - - return(nb_ima); - -} -/* Fin de l'operation cai_liste_ima_arcinfo -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_arcinfo */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format arcinfo */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_arcinfo(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_arcinfo (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_lecture_arcinfo(repert, - nom_image, - nb_can, - nboct_pix, - nb_col, - nb_lig) - -char *repert; -char *nom_image; -int *nb_can; -int *nboct_pix; -int *nb_col; -int *nb_lig; -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - short ncan; /* nombre de canaux dans le fichier en-tete */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - char car[5]; /* indice du canal traite */ - char entete[6]; /* HEADER ou HEAD74 lu dans l'entete */ - int i,num; /* indices */ - short ipack; /* variables de travail */ - int lg,col; /* variables de travail */ - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*................................................. - Constituion du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if (strlen(repert)!= 0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,".lan"); - nom_fic[strlen(repert)+1+strlen(nom_image)+4]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,".lan"); - nom_fic[strlen(nom_image)+4]='\0'; - } - -/*........................ - Ouverture du fichier entete avec l'extension .lan - ..........................................*/ - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { -/*...................................................... - Test sur l'existence du fichier avec l'extension .gis - .......................................................*/ - - strncpy(&nom_fic[strlen(nom_fic)-4],".gis",4); - - fic_in = fopen(nom_fic,"r"); - if (fic_in == NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete ARCINFO"); - } - } - if (iret!=0) - { - - - /*------------------------------------------- - Verification de l'entete - -------------------------------------------*/ - fread(entete,6,1,fic_in); - if (strncmp(entete,"HEAD74",6)!=0) - { - iret = 0; - strcpy(CAI_ERREUR,"Version autre que 7.4 non traitee"); - goto ERREUR; - } - - - - /*------------------------------------------- - recuperation du nombre d'octets par pixel - -------------------------------------------*/ - fread(&ipack,2,1,fic_in); - lg=sizeof(ipack)-1; - invert_oct(&ipack,lg); - if (ipack == 0) - *nboct_pix = 1; - else if (ipack == 2) - *nboct_pix = 2; - else - { - iret = 0; - strcpy(CAI_ERREUR,"Erreur : les donnees image doivent etre codees sur 8 ou 16 octets"); - goto ERREUR; - - } - - /*------------------------------------------- - recuperation du nombre de canaux - -------------------------------------------*/ - fread(&ncan,2,1,fic_in); - lg=sizeof(ncan)-1; - invert_oct(&ncan,lg); - *nb_can = (int) ncan; - - /*------------------------------------------- - positionnement sur le nombre de colonnes - -------------------------------------------*/ - fseek(fic_in,6,1); - - /*------------------------------------------- - recuperation du nombre de colonnes - -------------------------------------------*/ - fread(nb_col,4,1,fic_in); - lg = sizeof(*nb_col)-1; - invert_oct(nb_col,lg); - col=*nb_col; - - /*------------------------------------------- - recuperation du nombre de lignes - -------------------------------------------*/ - fread(nb_lig,4,1,fic_in); - lg = sizeof(*nb_lig)-1; - invert_oct(nb_lig,lg); - - /*------------------------------------------- - Fermeture du fichier - -------------------------------------------*/ - fclose(fic_in); - } - if (iret !=0) - { -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - if (*nb_can == 1) - strcpy(car,".gis"); - else - strcpy(car,".lan"); - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - for (i=0;i<*nb_can;i=i+1) - { - num=open(nom_fic,O_RDONLY,0); - if (num!= -1) - { - sscanf(nom_image,"%s",deb); - strcat(deb,car); - deb=deb+100; - sscanf(nom_image,"%s",deb1); - strcat(deb1,car); - deb1=deb1+100; - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=128+(i*col*(*nboct_pix)); - } - - } - } - - if (iret == 0) - { - return (NULL); - } - else - { - image1->NB_BITS_PIX=*nboct_pix; - return(image1); - } -ERREUR: - - return (NULL); - -} -/* - Fin de l'operation cai_ouvre_lecture_arcinfo -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_arcinfo */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format arcinfo et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_arcinfo(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_arcinfo (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_creation_arcinfo(repert, - nom_image, - nb_can, - nboct_pix, - nb_col, - nb_lig, - label) - -char *repert; -char *nom_image; -int *nb_can; -int *nboct_pix; -int *nb_col; -int *nb_lig; -char *label; -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - int retour; /* retour de fonction */ - int i,num; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - - short ipack; /* indicateur de pack type des donnees */ - short short_tempo; /* short utilise pour inversion d'octets */ - int int_tempo; /* entier utilise pour inversion d'octets */ - int lg; /* longueur de l'entier - 1 */ - int taille; /* longueur de l'entete a ecrire */ - unsigned char *buff; /* permet d'ecrire l'entete fichier arcinfo */ - - - - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - ipack = 0; - -/*................................................. - Constitution du nom du fichier et verification qu'il - n'existe pas deja - pour un canal ,l'extension est .gis, sinon .lan - .................................................*/ - nom_fic[0]='\0'; - if (strlen(repert)!= 0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - if (*nb_can == 1) - strcat(nom_fic,".gis"); - else - strcat(nom_fic,".lan"); - nom_fic[strlen(repert)+1+strlen(nom_image)+4]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - if (*nb_can == 1) - strcat(nom_fic,".gis"); - else - strcat(nom_fic,".lan"); - nom_fic[strlen(nom_image)+4]='\0'; - } - - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s ARCINFO existe \n" , nom_image ); - goto ERREUR; - } - - -/*...................................................... - Ouverture du fichier en ecriture - Ecriture de l'entete - ..........................................................*/ - fic = fopen(nom_fic,"w"); - if (fic == NULL) - { - sprintf(CAI_ERREUR,"Erreur: Creation fichier %s impossible\n",nom_fic); - goto ERREUR; - } - taille=128 + (*nb_can)*(*nb_col)*(*nboct_pix)*(*nb_lig) ; - - buff = (unsigned char *) malloc(taille); - if ( fic == NULL ) - { - strcpy ( CAI_ERREUR , "Erreur : probleme d'allocation \n" ); - unlink(nom_fic); - goto ERREUR; - } - - memcpy ( buff , "HEAD74" , 6 ); - if ( *nboct_pix == 1 ) - ipack = 0; - else if ( *nboct_pix == 2 ) - ipack = 2; - memcpy ( &buff[6] , &ipack , 2 ); - - short_tempo = (short) (*nb_can); - lg = sizeof(short_tempo)-1; - invert_oct(&short_tempo,lg); - memcpy ( &buff[8] , &short_tempo , 2 ); - - for ( i = 10 ; i < 16 ; i++ ) - { - buff[i] = 0; - } - - int_tempo = *nb_col; - lg = sizeof(int_tempo)-1; - invert_oct(&int_tempo,lg); - memcpy ( &buff[16] , &int_tempo , 4 ); - - int_tempo = *nb_lig; - lg = sizeof(int_tempo)-1; - invert_oct(&int_tempo,lg); - memcpy ( &buff[20] , &int_tempo , 4 ); - - for ( i=24 ; i<taille ; i++ ) - { - buff[i] = 0; - } - - retour = fwrite ( buff , taille ,1 , fic); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "Erreur : ecriture impossible dans fichier %s\n" ,nom_fic ); - unlink(nom_fic); - goto ERREUR; - } - - free (buff ); - fclose(fic); - -/*........................................... - Ouverture du fichier pour ecriture radiometrie - ...............................................*/ - num = open(nom_fic,O_RDWR,0); - if (num == -1) - { - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic); - goto ERREUR; - } - for (i=0;i<*nb_can;i=i+1) - { - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=128; - } - - return (image1); - -ERREUR : - return(NULL); -} - -/* - Fin de l'operation cai_ouvre_creation_arcinfo -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_arcinfo */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image Arcinfo */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_arcinfo(image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_arcinfo (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_lecture_canal_arcinfo(image1 , - canal , - premiere_ligne , - premiere_colonne, - nombre_lignes_lire , - nombre_colonnes_lire, - pas_ligne , - pas_colonne, - data_image ) -CAI_IMAGE *image1; -int *canal ; -int *premiere_ligne ; -int *premiere_colonne ; -int *nombre_lignes_lire ; -int *nombre_colonnes_lire; -int *pas_ligne ; -int *pas_colonne; -unsigned char *data_image; - -{ - - int num,i,j,k,n; /* variables de travail */ - int pt_oct; /* position courante dans le fichier image */ - int no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - int lig; /* indice de boucle sur les lignes */ - int oct_pix; /* nb octets par pixels */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - long oct_lig; /* nb oct. par ligne en considerant taille pixel */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - - -/*........................... - Initialisations diverses - ..........................*/ - iret=CAI_OK; - num=image1->ACCES_CANAL_INT[*canal-1]; - oct_pix=image1->NBOCT_PIX; - oct_lig=oct_pix*image1->NB_COL; - -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - - buf_lec = (unsigned char *) malloc(oct_lig); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - } - else - { -/*.................... - Initialisation - ......................*/ - lig=*premiere_ligne; - i=1; - pch=data_image; - -/*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i <= *nombre_lignes_lire)&&(iret==CAI_OK)) - { -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - - no_oct=image1->POS_OCTET[*canal-1]+ - (lig-1)*image1->NB_COL*oct_pix*image1->NB_CANAUX; - - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture d'une ligne image - ................................................*/ - n=read(num,buf_lec,oct_lig); - - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image ARCINFO"); - } - else - { -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - deb=buf_lec+(*premiere_colonne-1)*oct_pix; - j=1; - while (j <= *nombre_colonnes_lire) - { - for (k=0;k<oct_pix;k=k+1) - { - *(pch+k)=*(deb+k); - } - j=j+1; - pch=pch+oct_pix; - deb=deb+(*pas_colonne*oct_pix); - } - - } - i=i+1; - lig=lig+(*pas_ligne); - - } - - free(buf_lec); - } - return(iret); -} -/* - Fin de l'operation cai_lecture_canal_arcinfo -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_arcinfo */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image arcinfo */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_arcinfo(image1, canal, */ /* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_arcinfo (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_ecriture_canal_arcinfo (image1 , - canal , - premiere_ligne , - nombre_lignes_ecrire , - nombre_colonnes_ecrire, - data_image ) -CAI_IMAGE *image1; -int *canal ; -int *premiere_ligne ; -int *nombre_lignes_ecrire ; -int *nombre_colonnes_ecrire; -unsigned char *data_image; - -{ -long position_first_lig; /* position de la 1ere ligne a ecrire */ -long position_courante; /* position courante dans le fichier */ -long deplacement; /* deplacement a effectuer */ -int i_ligne; /* compteur de lignes */ -unsigned char *buff_lig; /* tableau contenant une ligne a ecrire */ -int cr_write; /* code retour de write */ -int num; /* descripteur de fichier */ -int nboct_pix; /* nombre d'octets par pixel */ -int nb_canaux; /* nombre de canaux de l'image totale */ - -/* ................ - Initialisations - .................*/ - -i_ligne = 0; -num = image1->ACCES_CANAL_INT[*canal-1]; -nboct_pix = image1->NBOCT_PIX; -nb_canaux = image1->NB_CANAUX; -position_first_lig = 0; -position_courante = 0; -deplacement = 0; - -/********************************************************/ -/* Calcul de la position de la premiere ligne a ecrire */ -/********************************************************/ - -position_first_lig = (long) ( image1->POS_OCTET[*canal-1] + - ((*canal) - 1) * (*nombre_colonnes_ecrire) * nboct_pix - + (*premiere_ligne - 1) * (*nombre_colonnes_ecrire) * nboct_pix * nb_canaux ); - - -/********************************************************/ -/* Recuperation de la position courante */ -/********************************************************/ - -position_courante = lseek ( num , 0L , 1 ); - - -/********************************************************/ -/* Calcul du deplacement jusqu'a la 1ere ligne a ecrire */ -/********************************************************/ - -deplacement = position_first_lig - position_courante; - - -/********************************************************/ -/* TANT QUE il y a des lignes a ecrire */ -/********************************************************/ -while (i_ligne < (*nombre_lignes_ecrire)) -{ - -/********************************************************/ -/* extraction de la ligne du tableau */ -/********************************************************/ - - buff_lig = data_image + (*nombre_colonnes_ecrire) * nboct_pix * i_ligne; - -/********************************************************/ -/* deplacement jusqu'a la ligne a ecrire */ -/********************************************************/ - - lseek ( num , deplacement , 1 ); - -/********************************************************/ -/* ecriture de la ligne */ -/********************************************************/ - - cr_write = write ( num , buff_lig , (*nombre_colonnes_ecrire)*nboct_pix ); - if ( cr_write != (*nombre_colonnes_ecrire)*nboct_pix ) - { - strcpy ( CAI_ERREUR , "Erreur ecriture canal image arcinfo\n" ); - goto ERREUR; - } - -/********************************************************/ -/* mise a jour du deplacement jusqu'a la ligne */ -/* suivante */ -/********************************************************/ - - deplacement = ( nb_canaux - 1 ) * (*nombre_colonnes_ecrire)*nboct_pix; - -/********************************************************/ -/* incrementation du nombre de lignes */ -/********************************************************/ - - i_ligne++; - -/********************************************************/ -/* FIN TANT QUE */ -/********************************************************/ -} - - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} -/* - Fin de l'operation cai_ecriture_canal_arcinfo -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_arcinfo */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format arcinfo et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_arcinfo(image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_arcinfo (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_arcinfo (image1) - -CAI_IMAGE *image1; - -{ - - int iret; /* code retour de l'operation */ - int i_can; /* indice du canal a fermer */ - int num; /* descripteur du fichier a fermer */ - - iret=CAI_OK; -/*............................................. - Fermeture du fichier qui contient tous les canaux - .............................................*/ - num=image1->ACCES_CANAL_INT[0]; - close(num); - - - return (iret); -} - -/* - Fin de l'operation cai_ferme_arcinfo -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_arcinfo */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en arcinfo et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_arcinfo(format,nom_ima) */ /* ------------------ */ -/* format (E) (char *) : format de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_arcinfo (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_dest_ima_arcinfo ( repertoire , - nom_ima ) - -char *repertoire; /* repertoire de stockage de l'image */ -char *nom_ima; /* nom de l'image */ - -{ -char nom_fic_ima[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ -int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ - - -/************************************************/ -/* Constitution du nom du fichier */ -/************************************************/ -if (strlen(repertoire) != 0) -{ - strcpy ( nom_ima_complet , repertoire ); - strcat ( nom_ima_complet, "/" ); - strcat ( nom_ima_complet , nom_ima ); -} -else -{ - strcpy ( nom_ima_complet , nom_ima ); -} - strcpy(nom_fic_ima , nom_ima_complet); - strcat ( nom_fic_ima , ".gis" ); - nom_fic_ima[strlen(nom_ima_complet)+4]='\0'; - -/* le nombre de canaux etant inconnu, on construit */ -/* d'abord le nom d'un fichier image avec un seul */ -/* canal et on teste son existence; si un tel */ -/* fichier n'existe pas, on construit le nom d'un */ -/* fichier image avec plusieurs canaux */ - -cr_stat = stat ( nom_fic_ima , &buf_stat ); -if ( cr_stat != 0 ) -{ - strncpy ( &nom_fic_ima[strlen(nom_fic_ima)-4] , ".lan" , 4 ); - cr_stat = stat ( nom_fic_ima , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_ima ); -} -else -{ - unlink ( nom_fic_ima ); -} - - -return (CAI_OK); - -} -/* - Fin de l'operation cai_dest_ima_arcinfo -*/ - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS INTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : invert_oct */ -/* ---------- */ -/* */ -/* ROLE : Inversion des octets poids forts,poids faibles */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : void invert_oct(s,nboct) */ -/* ----------------- */ -/* */ -/* s (E/S) (char *) : chaine a inverser */ -/* nboct (E) (int) : longueur de la chaine */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -static void invert_oct ( s , nboct ) -char *s; -int nboct; -{ - int c; - char *t; - - for ( t=s+nboct ; s<t ; s++,t-- ) - { - c=*s; - *s=*t; - *t=c; - } -} -/* Fin de l'operation invert_oct */ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_arcinfo */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format arcinfo */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_arcinfo(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_arcinfo (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_modifie_arcinfo(repert, - nom_image, - nb_can, - nboct_pix, - nb_col, - nb_lig) - -char *repert; -char *nom_image; -int *nb_can; -int *nboct_pix; -int *nb_col; -int *nb_lig; -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - short ncan; /* nombre de canaux dans le fichier en-tete */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - char car[5]; /* indice du canal traite */ - char entete[6]; /* HEADER ou HEAD74 lu dans l'entete */ - int i,num; /* indices */ - short ipack; /* variables de travail */ - int lg,col; /* variables de travail */ - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*................................................. - Constituion du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if (strlen(repert)!= 0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,".lan"); - nom_fic[strlen(repert)+1+strlen(nom_image)+4]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,".lan"); - nom_fic[strlen(nom_image)+4]='\0'; - } - -/*........................ - Ouverture du fichier entete avec l'extension .lan - ..........................................*/ - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { -/*...................................................... - Test sur l'existence du fichier avec l'extension .gis - .......................................................*/ - - strncpy(&nom_fic[strlen(nom_fic)-4],".gis",4); - - fic_in = fopen(nom_fic,"r"); - if (fic_in == NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete ARCINFO"); - } - } - if (iret!=0) - { - - - /*------------------------------------------- - Verification de l'entete - -------------------------------------------*/ - fread(entete,6,1,fic_in); - if (strncmp(entete,"HEAD74",6)!=0) - { - iret = 0; - strcpy(CAI_ERREUR,"Version autre que 7.4 non traitee"); - goto ERREUR; - } - - - - /*------------------------------------------- - recuperation du nombre d'octets par pixel - -------------------------------------------*/ - fread(&ipack,2,1,fic_in); - lg=sizeof(ipack)-1; - invert_oct(&ipack,lg); - if (ipack == 0) - *nboct_pix = 1; - else if (ipack == 2) - *nboct_pix = 2; - else - { - iret = 0; - strcpy(CAI_ERREUR, - "Erreur : les donnees image doivent etre codees sur 8 ou 16 octets"); - goto ERREUR; - - } - - /*------------------------------------------- - recuperation du nombre de canaux - -------------------------------------------*/ - fread(&ncan,2,1,fic_in); - lg=sizeof(ncan)-1; - invert_oct(&ncan,lg); - *nb_can = (int) ncan; - - /*------------------------------------------- - positionnement sur le nombre de colonnes - -------------------------------------------*/ - fseek(fic_in,6,1); - - /*------------------------------------------- - recuperation du nombre de colonnes - -------------------------------------------*/ - fread(nb_col,4,1,fic_in); - lg = sizeof(*nb_col)-1; - invert_oct(nb_col,lg); - col=*nb_col; - - /*------------------------------------------- - recuperation du nombre de lignes - -------------------------------------------*/ - fread(nb_lig,4,1,fic_in); - lg = sizeof(*nb_lig)-1; - invert_oct(nb_lig,lg); - - /*------------------------------------------- - Fermeture du fichier - -------------------------------------------*/ - fclose(fic_in); - } - if (iret !=0) - { -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - if (*nb_can == 1) - strcpy(car,".gis"); - else - strcpy(car,".lan"); - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - for (i=0;i<*nb_can;i=i+1) - { - num=open(nom_fic,O_RDWR,0); - if (num!= -1) - { - sscanf(nom_image,"%s",deb); - strcat(deb,car); - deb=deb+100; - sscanf(nom_image,"%s",deb1); - strcat(deb1,car); - deb1=deb1+100; - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=128+(i*col*(*nboct_pix)); - } - - } - } - - if (iret == 0) - { - return (NULL); - } - else - { - image1->NB_BITS_PIX=*nboct_pix; - return(image1); - } -ERREUR: - - return (NULL); - -} -/* - Fin de l'operation cai_ouvre_modifie_arcinfo -*/ diff --git a/Utilities/CAI/cai_dll/src/cai_atg2.c b/Utilities/CAI/cai_dll/src/cai_atg2.c deleted file mode 100755 index f73661a1b3..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_atg2.c +++ /dev/null @@ -1,2170 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_atg2.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format atg2 */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : fevrier 1995 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <sys/types.h> -#include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> - -#define _CAI_IMAGE -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_atg2.c,v 1.5 98/10/19 10:29:06 cmf Exp $"; - - -extern char *getenv(); - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_atg2 */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format atg2 */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_atg2(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees*/ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_atg2 (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -int cai_liste_ima_atg2(repert, - tab_ima) - -char *repert; -char ***tab_ima; - -{ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - -struct dirent *dp; /* structure resultat de la fonction readdir */ -struct dirent *cr_readdir; /* structure resultat de la fonction readdir */ - - int nb_ima; /* nombre d'images atg2 identifiees */ - DIR *ptr_sub_dir; /* pointeur sur struct. ouverture repert. ima */ - char *str_sub_dir; /* repertoire image atg2 a ouvrir */ - int cr_stat; /* compte-rendu de la fonction stat */ - struct stat buf_stat; /* structure retour de la fonction stat */ - - int i; /* indice de boucle */ - - - - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - dirp=opendir(repert); - - if(dirp!=NULL) - { - -/*...................................... - premiere passe pour comptabiliser les images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UN REPERTOIRE - SI C'EST LE CAS : - OUVERTURE DU REPERTOIRE - VERIFICATION QU'IL CONTIENT UN FICHIER D'EXTENSION .gen - ..........................................*/ - - while((dp=readdir(dirp))!=NULL) - { - - /* ne se traite pas lui-meme ni le repertoire pere */ - if ((strcmp(dp->d_name,".")==0) || (strcmp(dp->d_name,"..")==0)) - continue; - - /* construction du nom complet de l'objet */ - str_sub_dir = (char *) malloc(strlen(repert)+1+strlen(dp->d_name)+1); - if (str_sub_dir == NULL) - { - /* Erreur : probleme d'allocation memoire */ - nb_ima=-3; - return(nb_ima); - } - - strcpy(str_sub_dir,repert); - strcat(str_sub_dir,"/"); - strcat(str_sub_dir,dp->d_name); - str_sub_dir[strlen(repert)+1+strlen(dp->d_name)]='\0'; - - /* on verifie que l'objet est un repertoire */ - cr_stat = stat(str_sub_dir,&buf_stat); - - if ((cr_stat == -1) || ((buf_stat.st_mode & S_IFMT) != S_IFDIR)) - { - - /* acces impossible a l'objet ou l'objet n'est pas un repertoire */ - free(str_sub_dir); - continue; - } - - /* on verifie que l'objet est un repertoire ATG2 */ - /* c'est a dire contenant un fichier ".gen" */ - - ptr_sub_dir = opendir(str_sub_dir); - if(ptr_sub_dir!=NULL) - { - while ((cr_readdir=readdir(ptr_sub_dir)) != NULL) - { - - if (strcmp(".gen",cr_readdir->d_name) == 0) - { - /* c'est un repertoire ATG2 */ - nb_ima=nb_ima+1; - } - } - closedir(ptr_sub_dir); - } - else - { - - /* acces impossible a l'objet */ - free(str_sub_dir); - continue; - - } - - free(str_sub_dir); - } - closedir(dirp); - -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT ATG2 - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UN REPERTOIRE - SI C'EST LE CAS : - OUVERTURE DU REPERTOIRE - VERIFICATION QU'IL CONTIENT UN FICHIER D'EXTENSION .gen - SI C'EST LE CAS STOCKAGE DE L'IMAGE DANS LA LISTE DES IMAGES ATG2 - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - while((dp=readdir(dirp))!=NULL) - { - /* ne se traite pas lui-meme ni le repertoire pere */ - if ((strcmp(dp->d_name,".")==0) || (strcmp(dp->d_name,"..")==0)) - continue; - - /* construction du nom complet de l'objet */ - str_sub_dir = (char *) malloc(strlen(repert)+1+strlen(dp->d_name)+1); - if (str_sub_dir == NULL) - { - /* Erreur : probleme d'allocation memoire */ - nb_ima=-3; - return(nb_ima); - } - - strcpy(str_sub_dir,repert); - strcat(str_sub_dir,"/"); - strcat(str_sub_dir,dp->d_name); - str_sub_dir[strlen(repert)+1+strlen(dp->d_name)]='\0'; - - /* on verifie que l'objet est un repertoire */ - cr_stat = stat(str_sub_dir,&buf_stat); - if ((cr_stat == -1) || ((buf_stat.st_mode & S_IFMT) != S_IFDIR)) - { - - /* acces impossible a l'objet ou l'objet n'est pas un repertoire */ - free(str_sub_dir); - continue; - } - - /* on verifie que l'objet est un repertoire ATG2 */ - /* c'est a dire contenant un fichier ".gen" */ - - ptr_sub_dir = opendir(str_sub_dir); - if(ptr_sub_dir!=NULL) - { - while ((cr_readdir=readdir(ptr_sub_dir)) != NULL) - { - if (strcmp(".gen",cr_readdir->d_name) == 0) - { - /* c'est un repertoire ATG2 */ - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - closedir(ptr_sub_dir); - - } - else - { - - /* acces impossible a l'objet */ - free(str_sub_dir); - continue; - - } - - free(str_sub_dir); - } - closedir(dirp); - - } - else - { - /* Erreur : Repertoire inexistant */ - nb_ima=-1; - } - - return(nb_ima); - -} -/* Fin de l'operation cai_liste_ima_atg2 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_atg2 */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format atg2 */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_atg2(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_atg2 (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -typedef struct { - char rty[80]; - char rid[80]; - char prt[8]; - char nam[80]; - int str; - double lod; - double lad; - char uniloa[8]; - char mbu[8]; - int cov; - int fec; - int poc; - int lic; - int alc; - int sgc; - int zna; - double psp; - char imr[4]; - int arv; - int brv; - double lso; - double pso; - char txt[80]; - int nul; - int nus; - int nll; - int nls; - int nfl; - int nfc; - int pnc; - int pnl; - int cod; - int rod; - int por; - int pcb; - int pvb; - char bad[80]; - char tif[2]; - char fmt[8]; - char pty[2]; - int ofs; - double mpl; - double mpc; - int rol[100]; - int roc[100]; -} Fsro_format_data; - - -CAI_IMAGE *cai_ouvre_lecture_atg2(repert, - nom_image, - nb_can, - nboct_pix, - nb_col, - nb_lig) - -char *repert; -char *nom_image; -int *nb_can; -int *nboct_pix; -int *nb_col; -int *nb_lig; -{ - int fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - char car[2]; /* indce du canal traite */ - int num,k,n; /* indice */ - Fsro_format_data fsro; /* structure decrivant l'entete atg2 */ - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - *nb_can=0; - - iret=1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if (strlen(repert)!= 0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,"/"); - strcat(nom_fic,".gen"); - nom_fic[strlen(repert)+1+strlen(nom_image)+5]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,".gen"); - nom_fic[strlen(nom_image)+5]='\0'; - } -/*........................ - Ouverture du fichier entete - ..........................................*/ - num=open(nom_fic,O_RDONLY,0); - - if (num == -1) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete ATG2"); - } - else - { - -/*.................................... - Lecture du fichier entete - ............................................*/ - - n=read( num , &fsro , sizeof(Fsro_format_data)); - if ( n <= 0 ) - { - sprintf(CAI_ERREUR,"Erreur lecture entete ATG2 %s\n",nom_fic), - iret=0; - return (NULL); - } - -/*......................................... - Fermeture du fichier entete ATG2 - ..........................................*/ - close ( num ); - -/*......................................... - Recuperation du nombre d'octets par pixel . - ....................................................*/ - if (fsro.pvb>16) - { - iret=0; - sprintf(CAI_ERREUR,"Taille du pixel non traitable %d\n",fsro.pvb); - return (NULL); - } - else - { - if ((fsro.pvb%8)==0) - *nboct_pix=fsro.pvb/8; - else - *nboct_pix=fsro.pvb/8+1; - image1->NB_BITS_PIX = fsro.pvb; - } - -/*......................................... - Recuperation de la taille d'un pave en lignes - ....................................................*/ - image1->LIGNES_PAVE=fsro.pnl; -/*......................................... - Recuperation de la taille d'un pave en colonnes - ....................................................*/ - image1->COLONNES_PAVE=fsro.pnc; - -/*......................................... - Calcul du nombre de lignes : taille du pave*nombre de pave en ligne - ....................................................*/ - *nb_lig=fsro.nfl*image1->LIGNES_PAVE; -/*......................................... - Calcul du nombre de colonnes: taille pave*nombre pave en colonnes - ....................................................*/ - *nb_col=fsro.nfc*image1->COLONNES_PAVE; -/*......................................................... - Recuperation du nombre de canaux en fonction du nom des fichiers .gds - 1 - test sur l'existence du fichier PAN.gds monochrome - ...........................................................*/ - nom_fic[0]='\0'; - if (strlen(repert)!= 0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,"/PAN.gds"); - nom_fic[strlen(repert)+1+strlen(nom_image)+8]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,"/PAN.gds"); - nom_fic[strlen(nom_image)+8]='\0'; - } - num=open(nom_fic,O_RDONLY,0); - if (num<=0) - { - -/* 2 - test sur l'existence du fichier XS1.gds monochrome - ...........................................................*/ - - nom_fic[0]='\0'; - if (strlen(repert)!= 0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,"/XS1.gds"); - nom_fic[strlen(repert)+1+strlen(nom_image)+8]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,"/XS1.gds"); - nom_fic[strlen(nom_image)+8]='\0'; - } - - fic=open(nom_fic,O_RDONLY,0); - if (fic<=0) - { - iret=0; - sprintf(CAI_ERREUR,"Erreur nombre de canaux incorrect ATG2\n"); - return (NULL); - } - else - { - close(fic); - *nb_can=3; - } - } - else - { - close(num); - *nb_can=1; - } - - } - if (iret !=0) - { -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL et ouverture - de ces fichiers - .....................................................*/ - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - if (*nb_can==1) - { - sscanf(nom_image,"%s",deb); - strcat(deb,"/PAN.gds"); - sscanf(nom_image,"%s",deb1); - strcat(deb1,"/PAN.gds"); - nom_fic[0]='\0'; - if (strlen(repert)!=0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,"/PAN"); - strcat(nom_fic,car); - strcat(nom_fic,".gds"); - nom_fic[strlen(repert)+1+strlen(nom_image)+8]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,"/PAN"); - strcat(nom_fic,car); - strcat(nom_fic,".gds"); - nom_fic[strlen(nom_image)+8]='\0'; - } - fic=open(nom_fic,O_RDONLY,0); - image1->ACCES_CANAL_INT[0]=fic; - image1->POS_OCTET[0]=0; - - - } - else - { - - k=1; - while((k<=*nb_can)&&(k<CAI_NB_MAX_CAN)) - { - sprintf(car,"%d",k); - sscanf(nom_image,"%s",deb); - strcat(deb,"/XS"); - strcat(deb,car); - strcat(deb,".gds"); - deb=deb+100; - sscanf(nom_image,"%s",deb1); - strcat(deb1,".XS"); - strcat(deb1,car); - strcat(deb1,".gds"); - deb1=deb1+100; - nom_fic[0]='\0'; - if (strlen(repert)!=0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,"/XS"); - strcat(nom_fic,car); - strcat(nom_fic,".gds"); - nom_fic[strlen(repert)+1+strlen(nom_image)+8]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,"/XS"); - strcat(nom_fic,car); - strcat(nom_fic,".gds"); - nom_fic[strlen(nom_image)+8]='\0'; - } - fic=open(nom_fic,O_RDONLY,0); - if (fic != -1) - { - image1->ACCES_CANAL_INT[k-1]=fic; - image1->POS_OCTET[k-1]=0; - k=k+1; - } - else - { - iret=0; - strcpy(CAI_ERREUR,"incoherence au niveau du nb fichiers canaux"); - return(NULL); - } - } - } - - return (image1); - } - else - { - return(NULL); - } - -} - -/* - Fin de l'operation cai_ouvre_lecture_atg2 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_atg2 */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format atg2 et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_atg2 (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_atg2 (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_creation_atg2(repert, - nom_image, - nb_can, - nboct_pix, - nb_col, - nb_lig, - label) - -char *repert; -char *nom_image; -int *nb_can; -int *nboct_pix; -int *nb_col; -int *nb_lig; -char *label; -{ - int fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char repertoire_ima[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - int retour; /* retour de fonction */ - char car[3]; /* indice du canal traite */ - int i,num,can; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - Fsro_format_data fsro; /* structure informations format image */ - - char nom_fic_tim[1024]; /* nom de fichier de travail */ - char nom_fic_his[1024]; /* nom de fichier de travail */ - char nom_fic_bid[1024]; /* nom de fichier de travail */ - char **tab_nom_tim; /* tableau contenant les Tile index Maps */ - char **tab_nom_his; /* tableau contenant les histogrammes */ - char **tab_nom_bid; /* tableau contenant les caracteristiques des - plans */ - FILE *ptr_file_tim; /* flot de fichier tim */ - FILE *ptr_file_his; /* flot de fichier his */ - FILE *ptr_file_bid; /* flot de fichier bid */ - unsigned char *ptr_buff_tim; /* pointeur sur buffer tim */ - int offset; /* offset a ecrire dans fichier tim */ - - char str_cmd[100]; /* chaine de commande pour appels systeme */ - int nb_blocs_ns; /* nombre de blocs N/S */ - int nb_blocs_we; /* nombre de blocs W/E */ - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*************************************************/ -/* Construction du nom de la sous-directory */ -/* d'accueil des fichiers */ -/*************************************************/ - if (strlen(repert)!= 0) - { - strcpy ( repertoire_ima , repert ); - strcat ( repertoire_ima , "/" ); - strcat ( repertoire_ima , nom_image ); - repertoire_ima[strlen(repert)+1+strlen(nom_image)]='\0'; - } - else - { - strcpy ( repertoire_ima , nom_image ); - repertoire_ima[strlen(nom_image)]='\0'; - } - -/*************************************************/ -/* verification que cette sous-directory */ -/* n'existe pas deja */ -/*************************************************/ - -retour = stat ( repertoire_ima , &buf_stat ); -if (( retour != -1 ) && ( (buf_stat.st_mode & S_IFMT) == S_IFDIR )) -{ - sprintf ( CAI_ERREUR , "L'image %s atg2 existe \n" , nom_image ); - goto ERREUR; - } - -/*************************************************/ -/* Creation de la sous-directory d'accueil des */ -/* fichiers */ -/*************************************************/ - -sprintf(str_cmd,"mkdir %s",repertoire_ima); -system(str_cmd); - -/*************************************************/ -/* Creation du fichier caracteristiques : .gen */ -/*************************************************/ -nom_fic[0]='\0'; -strcpy ( nom_fic, repertoire_ima ); -strcat ( nom_fic, "/.gen" ); -nom_fic[strlen(repertoire_ima)+5]='\0'; -fic = creat ( nom_fic,PERMS); -if ( fic == -1 ) -{ - sprintf ( CAI_ERREUR , "Erreur : creation fichier %s impossible\n",nom_fic ); - goto ERREUR; -} - - -/*************************************************/ -/* ecriture de l'enregistrement d'entete */ -/*************************************************/ - -memset(&fsro,'\0',sizeof(Fsro_format_data)); - -/* Record in field */ - -for (i=0;i<80;i++) - fsro.rty[i]='\0'; -strcpy(fsro.rty,"GIN"); -for (i=0;i<80;i++) - fsro.rid[i]='\0'; -strcpy(fsro.rid,"1"); - -/* Data set id field */ - -for (i=0;i<8;i++) - fsro.prt[i]='\0'; -strcpy(fsro.prt,"IMAGE"); -for (i=0;i<80;i++) - fsro.nam[i]='\0'; -strcpy(fsro.nam,nom_image); - -/* General information field */ - -fsro.str = 3; -fsro.lod = 0.0; -fsro.lad = 0.0; -for (i=0;i<8;i++) - fsro.uniloa[i]='\0'; -strcpy(fsro.uniloa,""); -for (i=0;i<8;i++) - fsro.mbu[i]='\0'; -strcpy(fsro.mbu,""); -fsro.cov = 0; -fsro.fec = 0; -fsro.poc = 0; -fsro.lic = 0; -fsro.alc = 0; -fsro.sgc = 0; -fsro.zna = 0; -fsro.psp = 0.0; -for (i=0;i<4;i++) - fsro.imr[i]='\0'; -strcpy(fsro.imr,"no"); -fsro.arv = 0; -fsro.brv = 0; -fsro.lso = 0.0; -fsro.pso = 0.0; -for (i=0;i<80;i++) -fsro.txt[i]='\0'; -strcpy(fsro.txt,""); - -/* Data set parameters fields */ - -fsro.nul = 0; -fsro.nus = 0; -fsro.nll = 0; -fsro.nls = 0; -/* nombre de blocs N/S */ -if ( (*nb_lig) % 256 == 0 ) - fsro.nfl = (*nb_lig) / 256; -else - fsro.nfl = (*nb_lig) / 256 + 1; -/* nombre de blocs W/E */ -if ( (*nb_col) % 256 == 0 ) - fsro.nfc = (*nb_col) / 256; -else - fsro.nfc = (*nb_col) / 256 + 1; -/* taille des blocs */ -fsro.pnc = 256; -fsro.pnl = 256; -fsro.cod = 0; -fsro.rod = 1; -fsro.por = 0; -fsro.pcb = 0; -fsro.pvb = (*nboct_pix)*8; -for (i=0;i<80;i++) - fsro.bad[i]='\0'; -strcpy(fsro.bad,nom_image); -for (i=0;i<2;i++) - fsro.tif[i]='\0'; -/* nombre de blocs W/S */ -strcpy(fsro.tif,"y"); - -/* Non Digest fiel - Specific ATG2/MULTISCOPE */ - -for (i=0;i<8;i++) - fsro.fmt[i]='\0'; -strcpy(fsro.fmt,"gds"); -for (i=0;i<2;i++) - fsro.pty[i]='\0'; -strcpy(fsro.pty,"S "); -fsro.ofs = 0; -fsro.mpl = 0.0; -fsro.mpc = 0.0; -for (i=0;i<100;i++) - fsro.rol[i]=0; -for (i=0;i<100;i++) - fsro.roc[i]=0; -retour = write ( fic , &fsro , sizeof(Fsro_format_data)); -if ( retour != sizeof(Fsro_format_data) ) -{ - sprintf ( CAI_ERREUR , "Erreur : ecriture impossible dans fichier %s\n", - nom_fic ); - close(fic); - unlink(nom_fic); - goto ERREUR; -} - -close ( fic ); - -/*************************************************/ -/* Creation des fichiers : */ -/* - Tile index Map */ -/* - Histo */ -/* - Caracterisitiques du plan */ -/*************************************************/ - -tab_nom_tim = (char **) malloc ( (*nb_can) * sizeof(char *) ); -tab_nom_his = (char **) malloc ( (*nb_can) * sizeof(char *) ); -tab_nom_bid = (char **) malloc ( (*nb_can) * sizeof(char *) ); - -for (can=0; can<*nb_can; can=can+1 ) -{ - strcpy ( nom_fic_tim , repertoire_ima ); - strcpy ( nom_fic_his , repertoire_ima ); - strcpy ( nom_fic_bid , repertoire_ima ); - if (*nb_can == 1) - { - strcat ( nom_fic_tim , "/PAN.tim" ); - nom_fic_tim[strlen(repertoire_ima)+8]='\0'; - strcat ( nom_fic_his , "/PAN.his" ); - nom_fic_his[strlen(repertoire_ima)+8]='\0'; - strcat ( nom_fic_bid , "/PAN.bid" ); - nom_fic_bid[strlen(repertoire_ima)+8]='\0'; - } - else - { - strcat ( nom_fic_tim , "/XS" ); - sprintf ( car , "%d" , can+1 ); - strcat ( nom_fic_tim , car ); - strcat ( nom_fic_tim , ".tim" ); - nom_fic_tim[strlen(repertoire_ima)+3+strlen(car)+4]='\0'; - strcat ( nom_fic_his , "/XS" ); - sprintf ( car , "%d" ,can+1 ); - strcat ( nom_fic_his , car ); - strcat ( nom_fic_his , ".his" ); - nom_fic_his[strlen(repertoire_ima)+3+strlen(car)+4]='\0'; - strcat ( nom_fic_bid , "/XS" ); - sprintf ( car , "%d" , can+1 ); - strcat ( nom_fic_bid , car ); - strcat ( nom_fic_bid , ".bid" ); - nom_fic_bid[strlen(repertoire_ima)+3+strlen(car)+4]='\0'; - } - - tab_nom_tim[can] = (char *) malloc ( strlen(nom_fic_tim) + 1 ); - strcpy ( tab_nom_tim[can] , nom_fic_tim ); - tab_nom_his[can] = (char *) malloc ( strlen(nom_fic_his) + 1 ); - strcpy ( tab_nom_his[can] , nom_fic_his ); - tab_nom_bid[can] = (char *) malloc ( strlen(nom_fic_bid) + 1 ); - strcpy ( tab_nom_bid[can] , nom_fic_bid ); - } - -/* calcul du nombre de blocs */ - -/* Blocs N/S */ -if ( (*nb_lig) % 256 == 0 ) - nb_blocs_ns = (*nb_lig) / 256; -else - nb_blocs_ns = (*nb_lig) / 256 + 1; -/* Blocs W/E */ -if ( (*nb_col) % (256/(*nboct_pix)) == 0 ) - nb_blocs_we = (*nb_col) / (256/(*nboct_pix)); -else - nb_blocs_we = (*nb_col) / (256/(*nboct_pix)) + 1; - -ptr_buff_tim = (unsigned char *) malloc ( nb_blocs_ns*nb_blocs_we*sizeof(int) ); -if ( ptr_buff_tim == NULL ) -{ - sprintf ( CAI_ERREUR , "Erreur : probleme d'allocation \n" ); - unlink(nom_fic); - free ( ptr_buff_tim ); - free ( tab_nom_tim ); - free ( tab_nom_his ); - free ( tab_nom_bid ); - goto ERREUR; -} -for ( can = 0 ; can < (*nb_can) ; can++ ) -{ - ptr_file_tim = fopen ( tab_nom_tim[can] ,"w"); - ptr_file_his = fopen ( tab_nom_his[can] ,"w"); - ptr_file_bid = fopen ( tab_nom_bid[can] ,"w"); - if ((ptr_file_tim == NULL) || (ptr_file_his == NULL) || (ptr_file_bid == NULL)) - { - sprintf (CAI_ERREUR,"Erreur : creation fichier %s impossible\n",tab_nom_tim[can] ); - unlink(nom_fic); - for(i=0;i<can;i++) - { - unlink(tab_nom_tim[i]); - unlink(tab_nom_his[i]); - unlink(tab_nom_bid[i]); - } - - free ( ptr_buff_tim ); - free ( tab_nom_tim ); - free ( tab_nom_his ); - free ( tab_nom_bid ); - goto ERREUR; - } - - for ( i = 0 ; i < nb_blocs_ns*nb_blocs_we ; i++ ) - { - offset = 256*256*i + 1; - memcpy(&ptr_buff_tim[i*4],&offset,4); - } - retour = fwrite ( ptr_buff_tim , nb_blocs_ns*nb_blocs_we , sizeof(int) , ptr_file_tim ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR ,"Erreur : ecriture impossible dans %s\n ",tab_nom_tim[can] ); - unlink(nom_fic); - for(i=0;i<=can;i++) - { - unlink(tab_nom_tim[i]); - unlink(tab_nom_his[i]); - unlink(tab_nom_bid[i]); - } - free ( ptr_buff_tim ); - free ( tab_nom_tim ); - free ( tab_nom_his ); - free ( tab_nom_bid ); - goto ERREUR; - } - - fclose ( ptr_file_tim ); - fclose ( ptr_file_his ); - fclose ( ptr_file_bid ); -} - - -/*************************************************/ -/* Constitution du nom des fichiers a ecrire */ -/* et insertion dans les tableaux */ -/*************************************************/ - - -for (can=0; can<*nb_can; can ++ ) -{ - nom_fic_canal[0]='\0'; - strcpy ( nom_fic_canal , repertoire_ima ); - if (*nb_can == 1) - { - strcat ( nom_fic_canal , "/PAN.gds" ); - nom_fic_canal[strlen(repertoire_ima)+8]='\0'; - } - else - { - strcat ( nom_fic_canal , "/XS" ); - sprintf ( car , "%d" , can+1 ); - strcat ( nom_fic_canal , car ); - strcat ( nom_fic_canal , ".gds" ); - nom_fic_canal[strlen(repertoire_ima)+3+strlen(car)+4]='\0'; - } - - num = creat(nom_fic_canal,PERMS); - if (num == -1) - { - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic_canal); - unlink(nom_fic); - for(i=0;i<=can;i++) - { - unlink(tab_nom_tim[i]); - unlink(tab_nom_his[i]); - unlink(tab_nom_bid[i]); - } - - goto ERREUR; - } - image1->ACCES_CANAL_INT[can]=num; - image1->POS_OCTET[can]=0; - } - - - -free ( ptr_buff_tim ); -free ( tab_nom_tim ); -free ( tab_nom_his ); -free ( tab_nom_bid ); - -return (image1); - -ERREUR : - return(NULL); -} - - -/* - Fin de l'operation cai_ouvre_creation_atg2 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_atg2 */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image atg2 */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_atg2(image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_atg2 (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_lecture_canal_atg2(image1 , - canal , - premiere_ligne , - premiere_colonne, - nombre_lignes_lire , - nombre_colonnes_lire, - pas_ligne , - pas_colonne, - data_image ) -CAI_IMAGE *image1; -int *canal ; -int *premiere_ligne ; -int *premiere_colonne ; -int *nombre_lignes_lire ; -int *nombre_colonnes_lire; -int *pas_ligne ; -int *pas_colonne; -unsigned char *data_image; - -{ - - int num,i,j,k,n,l,p; /* variables de travail */ - int pt_oct; /* position courante dans le fichier image */ - int no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - int lig; /* indice de boucle sur les lignes */ - int oct_pix; /* nb octets par pixels */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - unsigned char *buf_lec; /* buffer lecture d'un pave */ - unsigned char *buffer; /* buffer lecture de taille_pave lignes completes*/ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - long nb_oct_pave; /* taille du pave en octets */ - unsigned char *ind_lec; /* pointeur de travai pour transfert pave */ - unsigned char *ind_tab; /* pointeur de travai pour transfert pave */ - int pave; /* nombre de paves colonnes dans une ligne */ - int nbcol_tot; /* nb pave*taille colonnes du pave */ - int taille; /* nbcol_tot*taille lignes pave */ - int bloc; /* indice de boucle sur les paves */ - int nolig; /* indice de boucle sur les lignes */ - int numlig; /* numero de la ligne reconstituee */ - - -/*......................... - Initialisations - ........................*/ - iret=CAI_OK; - num=image1->ACCES_CANAL_INT[*canal-1]; - oct_pix=image1->NBOCT_PIX; - nb_oct_pave=oct_pix*image1->LIGNES_PAVE*image1->COLONNES_PAVE; - lig=*premiere_ligne; - i=0; - pch=data_image; - -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - pave=image1->NB_COL/image1->COLONNES_PAVE; - if ((image1->NB_COL%image1->COLONNES_PAVE)!=0) - { - pave=pave+1; - } - nbcol_tot=pave*image1->COLONNES_PAVE; - taille=nbcol_tot*image1->LIGNES_PAVE*oct_pix; - - buf_lec = (unsigned char *) malloc(nb_oct_pave); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme d'allocation memoire"); - return(iret); - } - else - { - buffer = (unsigned char *) malloc(taille); - if (buffer == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme d'allocation memoire"); - free(buf_lec); - return(iret); - } - } - - -/*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i < (*nombre_lignes_lire))&&(iret==CAI_OK)) - { -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - nolig=((lig-1)/image1->LIGNES_PAVE)*image1->LIGNES_PAVE; - no_oct=image1->POS_OCTET[*canal-1]+(nolig*nbcol_tot*oct_pix); - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture de image1->LIGNES_PAVE lignes completes de nolig+1 - a nolig+image1->LIGNES_PAVE - ................................................*/ - for (bloc=1;bloc<=pave;bloc=bloc+1) - { -/* lecture d'un bloc de nb_oct_pave octets consecutifs */ - n=read(num,buf_lec,nb_oct_pave); - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image atg2"); - } - else - { -/* stockage du pave dans le tableau de image1->LIGNES_PAVE lignes - completes */ - ind_tab=buffer+(bloc-1)*image1->COLONNES_PAVE*oct_pix; - ind_lec=buf_lec; - - for (l=1;l<=image1->LIGNES_PAVE;l=l+1) - { - for (p=1;p<=image1->COLONNES_PAVE*oct_pix;p=p+1) - { - *ind_tab=*ind_lec; - ind_tab=ind_tab+1; - ind_lec=ind_lec+1; - } - ind_tab=ind_tab+(nbcol_tot-image1->COLONNES_PAVE)*oct_pix; - } - } - } - -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - - if (iret == CAI_OK) - { - numlig=lig-nolig; - deb=buffer+(numlig-1)*nbcol_tot*oct_pix+ - ((*premiere_colonne)-1)*oct_pix; - - while ((numlig<=image1->LIGNES_PAVE)&&(i<(*nombre_lignes_lire))) - { - j=1; - while (j<=(*nombre_colonnes_lire)) - { - for (k=0;k<oct_pix;k=k+1) - { - *(pch+k)=*(deb+k); - } - j=j+1; - pch=pch+oct_pix; - deb=deb+((*pas_colonne)*oct_pix); - } - numlig=numlig+(*pas_ligne); - deb=buffer+((numlig-1)*nbcol_tot*oct_pix)+ - ((*premiere_colonne)-1)*oct_pix; - lig=lig+(*pas_ligne); - i=i+1; - } - } - } - free(buffer); - free(buf_lec); - - return(iret); - -} - -/* - Fin de l'operation cai_lecture_canal_atg2 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_atg2 */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image atg2 */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_atg2 (image1, canal, */ /* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_atg2 (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ecriture_canal_atg2(image1 , - canal , - premiere_ligne , - nombre_lignes_ecrire , - nombre_colonnes_ecrire, - data_image ) -CAI_IMAGE *image1; -int *canal ; -int *premiere_ligne ; -int *nombre_lignes_ecrire ; -int *nombre_colonnes_ecrire; -unsigned char *data_image; - -{ -int nb_colon_correc; /* nombre de colonnes multiple de 256 */ -int nb_blocs; /* nombre de paquets de 256 pixels */ -int i_bloc; /* compteur de blocs */ -int nb_last_pix; /* nb initial de pixels dans le dernier bloc */ -int nb_blocs_prec_first_lig;/* nb de blocs avant 1ere ligne a ecrire */ -int nb_blocs_prec_lig; /* nb de blocs avant ligne courante */ -int pos_first_lig_ds_bloc; /* position 1ere ligne a ecrire dans son bloc */ -int pos_lig_ds_bloc; /* position ligne courante dans son bloc */ -long position_first_oct; /* position du 1er octet a ecrire */ -long position_courante; /* position courante dans le fichier */ -long deplacement; /* deplacement a effectuer */ -long depla_bl; /* deplacement a effectuer */ -int i_ligne; /* compteur de lignes */ -unsigned char *buff_lig; /* tableau contenant une ligne a ecrire */ -unsigned char *buff_bloc; /* tableau contenant un bloc a ecrire */ -int taille_wr; /* nombre d'elements du buffer a ecrire */ -int cr_write; /* code retour de write */ -unsigned char *completion; /* caractere completant les blocs */ -int num; /* descripteur de fichier */ -int nboct_pix; /* nombre d'octets par pixel */ -unsigned char *pch; /* pointeur chaine servant au transfert */ -int i; /* indice de boucle */ - - - -/* initialisations */ - -i_ligne = 0; -num = image1->ACCES_CANAL_INT[*canal-1]; -nboct_pix = image1->NBOCT_PIX; - - - -/********************************************************/ -/* Calcul du nombre de colonnes multiple de 256 de */ -/* l'image a ecrire */ -/********************************************************/ - -if ( (*nombre_colonnes_ecrire) % 256 == 0 ) - nb_colon_correc = (*nombre_colonnes_ecrire); -else - nb_colon_correc = (*nombre_colonnes_ecrire) - ((*nombre_colonnes_ecrire)%256) + 256; - -/********************************************************/ -/* Calcul du nombre de blocs complets de 256 pixels */ -/* sur une meme ligne (eventuellement completes par 0) */ -/********************************************************/ - -nb_blocs = nb_colon_correc / 256; - - -/********************************************************/ -/* Calcul du nombre de pixels presents initialement */ -/* dans le dernier bloc d'une ligne */ -/********************************************************/ - -nb_last_pix = 256 - ( nb_colon_correc - (*nombre_colonnes_ecrire) ); - - -/********************************************************/ -/* Calcul du nombre de blocs de 256 lignes precedant la */ -/* premiere ligne a ecrire */ -/* Calcul de la position de la premiere ligne a ecrire */ -/* au sein d'un bloc de 256 lignes */ -/********************************************************/ - -if ( *premiere_ligne <= 256 ) -{ - nb_blocs_prec_first_lig = 0; - pos_first_lig_ds_bloc = *premiere_ligne; -} -else if ( (*premiere_ligne - 1) % 256 == 0 ) -{ - nb_blocs_prec_first_lig = (*premiere_ligne - 1) / 256; - pos_first_lig_ds_bloc = 1; -} -else -{ - nb_blocs_prec_first_lig = - ( (*premiere_ligne- 1 ) - (*premiere_ligne - 1)%256 ) / 256; - pos_first_lig_ds_bloc = 1 + (*premiere_ligne - 1)%256; -} - - - -/********************************************************/ -/* Initialisations */ -/********************************************************/ - -pos_lig_ds_bloc = pos_first_lig_ds_bloc; -nb_blocs_prec_lig = nb_blocs_prec_first_lig; - - -/********************************************************/ -/* POUR chacune des lignes a ecrire */ -/********************************************************/ -for ( i_ligne = 0 ; i_ligne < *nombre_lignes_ecrire ; i_ligne++ ) -{ -/********************************************************/ -/* calcul de la position du premier octet de la */ -/* ligne a ecrire */ -/********************************************************/ - - position_first_oct = (long) ( image1->POS_OCTET[*canal-1] - + 256 * nboct_pix * (pos_lig_ds_bloc - 1) - + 256 * nb_blocs_prec_lig * nb_colon_correc * nboct_pix ); - -/********************************************************/ -/* recuperation de la position courante */ -/********************************************************/ - - position_courante = lseek ( num , 0L , 1 ); - -/********************************************************/ -/* deplacement jusqu'au premier octet a ecrire */ -/********************************************************/ - - deplacement = position_first_oct - position_courante; - lseek ( num , deplacement , 1 ); - -/********************************************************/ -/* extraction de la ligne du tableau */ -/********************************************************/ - - buff_lig = data_image +(*nombre_colonnes_ecrire) * nboct_pix * i_ligne; - -/********************************************************/ -/* initialisation du decalage de 255*256 pixels */ -/********************************************************/ - - depla_bl = 0; - -/********************************************************/ -/* POUR chacun des blocs de 256 pixels */ -/********************************************************/ - for ( i_bloc = 0 ; i_bloc < nb_blocs ; i_bloc++ ) - { -/********************************************************/ -/* deplacement */ -/********************************************************/ - - lseek ( num , depla_bl , 1 ); - -/********************************************************/ -/* extraction d'un bloc de la ligne */ -/********************************************************/ - - buff_bloc = buff_lig + i_bloc * 256 * nboct_pix; - -/********************************************************/ -/* determination du nombre d'octets a */ -/* ecrire */ -/********************************************************/ - if ( i_bloc == nb_blocs - 1 ) - { - taille_wr = nb_last_pix*nboct_pix; - } - else - { - taille_wr = 256 * nboct_pix; - } - -/********************************************************/ -/* ecriture dans le fichier */ -/********************************************************/ - cr_write = write ( num , buff_bloc , taille_wr ); - if ( cr_write != taille_wr ) - { - strcpy ( CAI_ERREUR , "Erreur ecriture canal image atg2\n" ); - goto ERREUR; - } - -/********************************************************/ -/* completion eventuelle du dernier bloc */ -/********************************************************/ - - if ((i_bloc == nb_blocs - 1) && ((256 - nb_last_pix) > 0)) - { - taille_wr = (256 - nb_last_pix)*nboct_pix; - completion=(unsigned char *) malloc(taille_wr); - pch=completion; - for (i=0;i<taille_wr;i=i+1) - { - *pch='\0'; - pch=pch+1; - } - cr_write = write ( num , completion , taille_wr ); - if ( cr_write != taille_wr ) - { - - strcpy ( CAI_ERREUR , "Erreur ecriture canal image atg2\n" ); - goto ERREUR; - } - free(completion); - } - -/********************************************************/ -/* mise a jour du decalage de 255*256 pixels*/ -/********************************************************/ - - depla_bl = 255*256*nboct_pix; - -/********************************************************/ -/* FIN POUR */ -/********************************************************/ - } - -/********************************************************/ -/* mise a jour de la position de la ligne dans le */ -/* bloc, et du nombre de blocs precedant la ligne */ -/********************************************************/ - - if ( pos_lig_ds_bloc == 256 ) - { - pos_lig_ds_bloc = 1; - nb_blocs_prec_lig++; - } - else - pos_lig_ds_bloc++; - -/********************************************************/ -/* FIN POUR */ -/********************************************************/ -} - - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} -/* - Fin de l'operation cai_ecriture_canal_atg2 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_atg2 */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format atg2 et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_atg2(image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_atg2 (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_atg2 (image1) - -CAI_IMAGE *image1; - -{ - - int iret; /* code retour de l'operation */ - int i_can; /* indice du canal a fermer */ - int num; /* descripteur du fichier a fermer */ - - iret=CAI_OK; -/*............................................. - Fermeture des fichiers image - .............................................*/ - for (i_can=0;i_can<image1->NB_CANAUX;i_can=i_can+1) - { - num=image1->ACCES_CANAL_INT[i_can]; - close(num); - } - - - return (iret); -} - -/* - Fin de l'operation cai_ferme_atg2 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_atg2 */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en atg2 et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_atg2(format,nom_ima) */ /* ------------------ */ -/* format (E) (char *) : format de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_atg2 (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_dest_ima_atg2 ( repertoire , - nom_ima ) - -char *repertoire; /* repertoire de stockage de l'image */ -char *nom_ima; /* nom de l'image */ - -{ -int iret ; /* code retour fonction de fermeture */ -int i_can; /* compteur de canaux */ -char nom_fic_courant[1024]; /* nom du fichier entete a detruire */ -char repertoire_ima[1024]; /* repertoire + nom de l'image */ -char str_num_fic[6]; /* chaine numero du canal */ -int numero_fic; /* numero du fichier canal */ -char str_cmd[100]; /* chaine de commande pour appels systeme */ - -int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ - -CAI_IMAGE *image1; /* structure ouverture image */ -int nb_can; /* nombre de canaux de l'image */ -int nboct_pix; /* nombre d'octets par pixel image */ -int nb_col; /* nombre de colonnes de l'image */ -int nb_lig; /* nombre de lignes de l'image */ - -/*************************************************/ -/* Construction du nom de la sous-directory */ -/* qui contient l'image ATG2 */ -/*************************************************/ -if (strlen(repertoire) != 0) -{ - strcpy ( repertoire_ima , repertoire ); - strcat ( repertoire_ima, "/" ); - strcat ( repertoire_ima , nom_ima ); - repertoire_ima[strlen(repertoire)+1+strlen(nom_ima)]='\0'; -} -else -{ - strcpy ( repertoire_ima , nom_ima ); - repertoire_ima[strlen(nom_ima)]='\0'; -} - -/************************************************/ -/* Extraction des caracteristiques de l'image */ -/* du fichier entete par l'appel a la fonction */ -/* cai_ouvre_lecture_atg2 */ -/************************************************/ - - image1 = cai_ouvre_lecture_atg2 ( repertoire,nom_ima, &nb_can ,&nboct_pix , - &nb_col , &nb_lig ); - if ( image1 == NULL) goto ERREUR; - - image1->NB_CANAUX=nb_can; - image1->NB_COL=nb_col; - image1->NB_LIG=nb_lig; - image1->NBOCT_PIX=nboct_pix; - - iret=cai_ferme_atg2(image1); - - - -/************************************************/ -/* Verification de l'existence de la sous- */ -/* directory */ -/************************************************/ - -cr_stat = stat ( repertoire_ima , &buf_stat ); -if ( cr_stat == -1 ) -{ - sprintf ( CAI_ERREUR , - "Erreur : acces impossible a %s\n" , repertoire_ima ); - goto ERREUR; -} -if ( (buf_stat.st_mode & S_IFMT) != S_IFDIR ) -{ - sprintf ( CAI_ERREUR , - "Erreur : %s n'est pas un repertoire\n" , repertoire_ima ); - goto ERREUR; -} - -/************************************************/ -/* Constitution du nom des fichiers et */ -/* destruction */ -/************************************************/ - -strcpy ( nom_fic_courant , repertoire_ima ); -strcat ( nom_fic_courant , "/.gen" ); -nom_fic_courant[strlen(repertoire_ima)+5]='\0'; -cr_stat = stat ( nom_fic_courant , &buf_stat ); -if ( cr_stat == 0 ) - unlink ( nom_fic_courant ); - -if ( nb_can == 1 ) -{ - strcpy ( nom_fic_courant , repertoire_ima ); - strcat ( nom_fic_courant , "/PAN.bid" ); - nom_fic_courant[strlen(repertoire_ima)+8]='\0'; - cr_stat = stat ( nom_fic_courant , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_courant ); - - strcpy ( nom_fic_courant , repertoire_ima ); - strcat ( nom_fic_courant , "/PAN.his" ); - nom_fic_courant[strlen(repertoire_ima)+8]='\0'; - cr_stat = stat ( nom_fic_courant , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_courant ); - - strcpy ( nom_fic_courant , repertoire_ima ); - strcat ( nom_fic_courant , "/PAN.gds" ); - nom_fic_courant[strlen(repertoire_ima)+8]='\0'; - cr_stat = stat ( nom_fic_courant , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_courant ); - - strcpy ( nom_fic_courant , repertoire_ima ); - strcat ( nom_fic_courant , "/PAN.tim" ); - nom_fic_courant[strlen(repertoire_ima)+8]='\0'; - cr_stat = stat ( nom_fic_courant , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_courant ); -} -else -{ - i_can=1; - numero_fic=1; - while ( (i_can<=nb_can) && (numero_fic<10000) ) - { - strcpy ( nom_fic_courant , repertoire_ima ); - strcat ( nom_fic_courant , "/XS" ); - sprintf ( str_num_fic , "%d" , numero_fic ); - strcat ( nom_fic_courant , str_num_fic ); - strcat ( nom_fic_courant , ".bid" ); -nom_fic_courant[strlen(repertoire_ima)+3+strlen(str_num_fic)+4]='\0'; - cr_stat = stat ( nom_fic_courant , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_courant ); - - strcpy ( nom_fic_courant , repertoire_ima ); - strcat ( nom_fic_courant , "/XS" ); - sprintf ( str_num_fic , "%d" , numero_fic ); - strcat ( nom_fic_courant , str_num_fic ); - strcat ( nom_fic_courant , ".his" ); - nom_fic_courant[strlen(repertoire_ima)+3+strlen(str_num_fic)+4]='\0'; - cr_stat = stat ( nom_fic_courant , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_courant ); - - strcpy ( nom_fic_courant , repertoire_ima ); - strcat ( nom_fic_courant , "/XS" ); - sprintf ( str_num_fic , "%d" , numero_fic ); - strcat ( nom_fic_courant , str_num_fic ); - strcat ( nom_fic_courant , ".gds" ); - nom_fic_courant[strlen(repertoire_ima)+3+strlen(str_num_fic)+4]='\0'; - cr_stat = stat ( nom_fic_courant , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_courant ); - - strcpy ( nom_fic_courant , repertoire_ima ); - strcat ( nom_fic_courant , "/XS" ); - sprintf ( str_num_fic , "%d" , numero_fic ); - strcat ( nom_fic_courant , str_num_fic ); - strcat ( nom_fic_courant , ".tim" ); - nom_fic_courant[strlen(repertoire_ima)+3+strlen(str_num_fic)+4]='\0'; - cr_stat = stat ( nom_fic_courant , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_courant ); - - i_can++; - numero_fic++; - } - - -} - -sprintf(str_cmd,"rmdir %s",repertoire_ima); -system(str_cmd); - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} -/* - Fin de l'operation cai_dest_ima_atg2 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_atg2 */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture ecriture d'une image au format */ -/* ----- atg2 et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_atg2(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_atg2 (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_modifie_atg2(repert, - nom_image, - nb_can, - nboct_pix, - nb_col, - nb_lig) - -char *repert; -char *nom_image; -int *nb_can; -int *nboct_pix; -int *nb_col; -int *nb_lig; - -{ - int fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - char car[2]; /* indce du canal traite */ - int num,k,n; /* indice */ - Fsro_format_data fsro; /* structure decrivant l'entete atg2 */ - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - *nb_can=0; - - iret=1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if (strlen(repert)!= 0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,"/"); - strcat(nom_fic,".gen"); - nom_fic[strlen(repert)+1+strlen(nom_image)+5]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,".gen"); - nom_fic[strlen(nom_image)+5]='\0'; - } -/*........................ - Ouverture du fichier entete - ..........................................*/ - num=open(nom_fic,O_RDONLY,0); - - if (num == -1) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete ATG2"); - } - else - { - -/*.................................... - Lecture du fichier entete - ............................................*/ - - n=read( num , &fsro , sizeof(Fsro_format_data)); - if ( n <= 0 ) - { - sprintf(CAI_ERREUR,"Erreur lecture entete ATG2 %s\n",nom_fic), - iret=0; - return (NULL); - } - -/*......................................... - Fermeture du fichier entete ATG2 - ..........................................*/ - close ( num ); - -/*......................................... - Recuperation du nombre d'octets par pixel . - ....................................................*/ - if (fsro.pvb>16) - { - iret=0; - sprintf(CAI_ERREUR,"Taille du pixel non traitable %d\n",fsro.pvb); - return (NULL); - } - else - { - if ((fsro.pvb%8)==0) - *nboct_pix=fsro.pvb/8; - else - *nboct_pix=fsro.pvb/8+1; - image1->NB_BITS_PIX = fsro.pvb; - } - -/*......................................... - Recuperation de la taille d'un pave en lignes - ....................................................*/ - image1->LIGNES_PAVE=fsro.pnl; -/*......................................... - Recuperation de la taille d'un pave en colonnes - ....................................................*/ - image1->COLONNES_PAVE=fsro.pnc; - -/*......................................... - Calcul du nombre de lignes : taille du pave*nombre de pave en ligne - ....................................................*/ - *nb_lig=fsro.nfl*image1->LIGNES_PAVE; -/*......................................... - Calcul du nombre de colonnes: taille pave*nombre pave en colonnes - ....................................................*/ - *nb_col=fsro.nfc*image1->COLONNES_PAVE; -/*......................................................... - Recuperation du nombre de canaux en fonction du nom des fichiers .gds - 1 - test sur l'existence du fichier PAN.gds monochrome - ...........................................................*/ - nom_fic[0]='\0'; - if (strlen(repert)!= 0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,"/PAN.gds"); - nom_fic[strlen(repert)+1+strlen(nom_image)+8]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,"/PAN.gds"); - nom_fic[strlen(nom_image)+8]='\0'; - } - num=open(nom_fic,O_RDONLY,0); - if (num<=0) - { - -/* 2 - test sur l'existence du fichier XS1.gds monochrome - ...........................................................*/ - - nom_fic[0]='\0'; - if (strlen(repert)!= 0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,"/XS1.gds"); - nom_fic[strlen(repert)+1+strlen(nom_image)+8]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,"/XS1.gds"); - nom_fic[strlen(nom_image)+8]='\0'; - } - - fic=open(nom_fic,O_RDONLY,0); - if (fic<=0) - { - iret=0; - sprintf(CAI_ERREUR,"Erreur nombre de canaux incorrect ATG2\n"); - return (NULL); - } - else - { - close(fic); - *nb_can=3; - } - } - else - { - close(num); - *nb_can=1; - } - - } - if (iret !=0) - { -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL et ouverture - de ces fichiers - .....................................................*/ - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - if (*nb_can==1) - { - sscanf(nom_image,"%s",deb); - strcat(deb,"/PAN.gds"); - sscanf(nom_image,"%s",deb1); - strcat(deb1,"/PAN.gds"); - nom_fic[0]='\0'; - if (strlen(repert)!=0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,"/PAN"); - strcat(nom_fic,car); - strcat(nom_fic,".gds"); - nom_fic[strlen(repert)+1+strlen(nom_image)+8]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,"/PAN"); - strcat(nom_fic,car); - strcat(nom_fic,".gds"); - nom_fic[strlen(nom_image)+8]='\0'; - } - fic=open(nom_fic,O_RDWR,0); - image1->ACCES_CANAL_INT[0]=fic; - image1->POS_OCTET[0]=0; - - - } - else - { - - k=1; - while((k<=*nb_can)&&(k<CAI_NB_MAX_CAN)) - { - sprintf(car,"%d",k); - sscanf(nom_image,"%s",deb); - strcat(deb,"/XS"); - strcat(deb,car); - strcat(deb,".gds"); - deb=deb+100; - sscanf(nom_image,"%s",deb1); - strcat(deb1,".XS"); - strcat(deb1,car); - strcat(deb1,".gds"); - deb1=deb1+100; - nom_fic[0]='\0'; - if (strlen(repert)!=0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,"/XS"); - strcat(nom_fic,car); - strcat(nom_fic,".gds"); - nom_fic[strlen(repert)+1+strlen(nom_image)+8]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,"/XS"); - strcat(nom_fic,car); - strcat(nom_fic,".gds"); - nom_fic[strlen(nom_image)+8]='\0'; - } - fic=open(nom_fic,O_RDWR,0); - if (fic != -1) - { - image1->ACCES_CANAL_INT[k-1]=fic; - image1->POS_OCTET[k-1]=0; - k=k+1; - } - else - { - iret=0; - strcpy(CAI_ERREUR,"incoherence au niveau du nb fichiers canaux"); - return(NULL); - } - } - } - - return (image1); - } - else - { - return(NULL); - } - -} -/* - Fin de l'operation cai_ouvre_modifie_atg2 -*/ diff --git a/Utilities/CAI/cai_dll/src/cai_bandeau.c b/Utilities/CAI/cai_dll/src/cai_bandeau.c deleted file mode 100755 index d059d4f921..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_bandeau.c +++ /dev/null @@ -1,730 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_bandeau.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format bandeau */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : novembre 2005 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V5.3 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 5.3 : Prise en compte du format bandeau dans CAI */ -/* */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <stdlib.h> -# include <sys/types.h> -# include <unistd.h> -# include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> -#include <errno.h> - -#define _CAI_IMAGE -#define IN_CAI_BANDEAU - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header$"; - -extern char *getenv(); - - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_bandeau */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format bandeau */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_bandeau(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_bandeau (S) (long int) : = -1 repertoiren inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -long int cai_liste_ima_bandeau (char *repert, - char ***tab_ima) - -{ - - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - - struct dirent *dp; /* structure resultat de la fonction readdir */ - - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - char *pch2,*pch3; /* pointeurs sur chaine de caracteres */ - char car[6]; /* variable de travail */ - int nb_ima; /* nombre d'images bandeau identifiees */ - int i; /* indice de boucle */ - long int diff,Long; - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - dirp=opendir(repert); - - if(dirp!=NULL) - { - - -/*...................................... - - premiere passe pour comptabiliser les images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE BANDEAU_CNES - (EXTENSION =.band) - ..........................................*/ - while((dp=readdir(dirp))!=NULL) - { - sprintf(car,".band"); - pch0=strstr(dp->d_name,car); - if (pch0 != NULL) - { - *pch0='\0'; - nb_ima=nb_ima+1; - } -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - else - { - sprintf(car,".BAND"); - pch1=strstr(dp->d_name,car); - if (pch1 != NULL) - { - *pch1='\0'; - nb_ima=nb_ima+1; - } - } - } - - (void)closedir(dirp); - if (nb_ima ==0) goto FIN; - -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT BANDEAU - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE BANDEAU_CNES - (EXTENSION =.band) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - while((dp=readdir(dirp))!=NULL) - { - sprintf(car,".band"); - pch0=strstr(dp->d_name,car); - if (pch0 != NULL) - { - *pch0='\0'; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - else - { - sprintf(car,".BAND"); - pch1=strstr(dp->d_name,car); - if (pch1 != NULL) - { - *pch1='\0'; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - } - - (void)closedir(dirp); - - - } - else - { - /* repertoire inexistant */ - nb_ima=-1; - } - -FIN: - return(nb_ima); - -} - -/* Fin de l'operation cai_liste_ima_bandeau -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_bandeau */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format bandeau */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_bandeau (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_bandeau (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -CAI_IMAGE *cai_ouvre_lecture_bandeau(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) -{ - CAI_IMAGE *image1,*image2; /* pointeur su descripteur de fichier image */ - int NbBandeaux; /* nombre de bandeaux */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char label[80]; /* contient un enregistrement du fichier */ - int retour; /* retour de la fonction comparaison chaines*/ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - char format[20]; /* Format de stockage de chaque bandeau */ - int nbcan, nboctpix; - int nbcol,nblig; - int ific,num,ind; - CH50 tab_ima[20]; - - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_lecture"); - goto ERREUR; - } - -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)== 0) - sprintf(repert,"./"); - sprintf(nom_fic,"%s/%s.band",repert,nom_image); - sprintf(image1->NOM_IMAGE,"%s/%s",repert,nom_image); - - /*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=NULL; - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { -/* verification si extension en majuscule */ - nom_fic[0]='\0'; - sprintf(nom_fic,"%s/%s.BAND",repert,nom_image); - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete BANDEAU-CNES"); - goto ERREUR; - } - } - -/*.................................... - Decodage du nombre de BANDEAU - ............................................*/ - fscanf(fic_in,"%s %d\n",label,&NbBandeaux); - retour=strncmp(label,"BANDEAU",7); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne BANDEAU dans %s", - nom_fic); - goto ERREUR; - } -/*.................................... - Decodage du nombre du format - ............................................*/ - fscanf(fic_in,"%s\n",format); - -/*.................................... - Recuperation du nom de chaque bandeau - ............................................*/ - for (ific=0;ific<NbBandeaux;ific++) - { - fscanf(fic_in,"%s %d\n",label,&num); - strcpy(tab_ima[num-1],label); - } - -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in!=NULL) - { - fclose(fic_in); - fic_in=NULL; - } - -/*.................................... - Ouverture de chaque bandeau - ............................................*/ - for (ific=0;ific<NbBandeaux;ific++) - { - sprintf(nom_fic,"%s/%s",repert,tab_ima[ific]); - image2 = cai_ouvre_lecture_image(nom_fic, format,&nbcan, - &nboctpix,&nbcol,&nblig); - if (image2 == NULL) - { - sprintf(CAI_ERREUR,"Erreur ouverture du bandeau %s \n",nom_fic); - goto ERREUR; - } - *nb_can = nbcan; - *nboct_pix = nboctpix; - *nb_col = nbcol; - *nb_lig = (*nb_lig) + nblig; - image1->POS_OCTET[ific]=0; - - FBANDEAU[ific] = image2; - - } -/*.................................. - Initialisation du type de codage, indicateur d'inversion des octets, - nombre d'octets par pixel, - ........................................................*/ - sprintf(image1->COD_PIX,image2->COD_PIX); - image1->NB_BITS_PIX = image2->NB_BITS_PIX; - image1->NBOCT_PIX = image2->NBOCT_PIX; - image1->INV_OCTETS = image2->INV_OCTETS; - -/*.................................. - On stocke l'information "nombre de bandeaux" dans ACCES_CANAL_INT - qui n'est pas utilisé par ailleurs - ........................................................*/ - image1->ACCES_CANAL_INT[0] = NbBandeaux; - - return(image1); - -ERREUR: - if (fic_in!=NULL) - { - fclose(fic_in); - fic_in=NULL; - } - return (NULL); -} - -/* - Fin de l'operation cai_ouvre_lecture_bandeau -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_bandeau */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image bandeau */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_bandeau(image1, canal, */ -/* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (lint): numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_bandeau (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -CAI_OK_KO cai_lecture_canal_bandeau(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) - -{ - int NbBandeaux; /* Nombre de bandeaux constituant l'image */ - int iret; /* indicateur d'erreur */ - long int oct_pix; /* nb octets par pixels */ - long int oct_lig; /* nb oct. par ligne en considerant taille pixel */ - int lig,ilig; /* indice de boucle sur les lignes */ - int ific; /* boucle sur le nombre de bandeaux */ - CAI_IMAGE *image2; /* pointeur sur descripteur de fichier image */ - int BandDeb,Tot; /* indicateur du bandeau de la premiere ligne */ - int BandFin,Fin; /* indicateur du bandeau de la derniere ligne */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *pch; /* pointeur chaine pour transfert buffer sortie */ - int Un; - -/*........................... - Initialisations diverses - ..........................*/ - NbBandeaux = image1->ACCES_CANAL_INT[0]; - iret=CAI_OK; - oct_pix=image1->NBOCT_PIX; - oct_lig=(*nombre_colonnes_lire)*oct_pix; - lig=*premiere_ligne; - ilig=1; - Un=1; - pch = data_image; - -/*.............................................. - allocation de memoire pour lire une ligne image complete - ............................................. */ - buf_lec = (unsigned char *) calloc(oct_lig,sizeof(unsigned char)); - if (buf_lec == NULL) - { - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - goto ERREUR; - } - -/*.................... - Recherche du bandeau dans lequel se trouve la premiere ligne à lire - ............................................. */ - BandDeb = -1; - ific=0; - Tot = 1; - while ((BandDeb == -1) && (ific<NbBandeaux)) - { - if (ific != 0) lig = lig - image2->NB_LIG; - image2 = FBANDEAU[ific]; - Tot = Tot + image2->NB_LIG; - if ((*premiere_ligne) < Tot) BandDeb=ific; - ific = ific+1; - } - if (BandDeb == -1) - { - strcpy(CAI_ERREUR,"Recherche du premier bandeau"); - goto ERREUR; - } -/*.................... - Recherche du bandeau dans lequel se trouve la derniere ligne à lire - ............................................. */ - BandFin = -1; - ific=0; - Fin = (*premiere_ligne)+(*nombre_lignes_lire)-1; - Tot = 0; - while ((BandFin == -1) && (ific<NbBandeaux)) - { - image2 = FBANDEAU[ific]; - Tot = Tot + image2->NB_LIG; - if (Fin <= Tot) BandFin=ific; - ific = ific+1; - } - if (BandFin == -1) - { - strcpy(CAI_ERREUR,"Recherche du dernier bandeau"); - goto ERREUR; - } - - ific = BandDeb; - image2 = FBANDEAU[ific]; - if (BandDeb == BandFin) - { - iret = cai_lecture_canal(image2,*canal, - lig,*premiere_colonne, - *nombre_lignes_lire,*nombre_colonnes_lire, - *pas_ligne,*pas_colonne,data_image); - if (iret != CAI_OK) - goto ERREUR; - } - else - { - while (ilig <= (*nombre_lignes_lire)) - { - iret = cai_lecture_canal(image2,*canal,lig,*premiere_colonne,Un, - *nombre_colonnes_lire,*pas_ligne, - *pas_colonne,buf_lec); - if (iret != CAI_OK) - goto ERREUR; - - memcpy ( pch, buf_lec , oct_lig ); - pch = pch+oct_lig; - ilig=ilig+1; - lig=lig+(*pas_ligne); - if (lig > image2->NB_LIG) - { - lig = lig - image2->NB_LIG; - ific=ific+1; - if (ific<NbBandeaux) - image2 = FBANDEAU[ific]; - } - } - } - - return(CAI_OK); - -ERREUR: - return(CAI_KO); - } -/* - Fin de l'operation cai_lecture_canal_bandeau -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_bandeau */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format bandeau et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_bandeau(image1) */ -/* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_bandeau (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_bandeau (CAI_IMAGE *image1) - -{ - int iret,retour; /* code retour de l'operation */ - int ific; /* indice du bandeau a fermer */ - int NbBandeaux; /* Nombre de bandeaux constituant l'image */ - CAI_IMAGE *image2; /* pointeur sur descripteur de fichier image */ - - - NbBandeaux = image1->ACCES_CANAL_INT[0]; - retour=CAI_OK; - -/*............................................. - Fermeture de tous les bandeaux - .............................................*/ - - for (ific=0;ific<NbBandeaux;ific++) - { - image2 = FBANDEAU[ific]; - iret = cai_ferme_image(image2); - if (iret != CAI_OK) retour=CAI_KO; - } - - return (retour); -} - -/* - Fin de l'operation cai_ferme_bandeau -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_bandeau */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en bandeau et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_bandeau(repertoire,nom_ima) */ -/* ------------------ */ -/* repertoire (E) (char *) : repertoire de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_bandeau (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_dest_ima_bandeau ( char *repertoire , - char *nom_ima ) -{ - CAI_IMAGE *image1,*image2; /* pointeur su descripteur de fichier image */ - int NbBandeaux; /* nombre de bandeaux */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char label[80]; /* contient un enregistrement du fichier */ - int retour; /* retour de la fonction comparaison chaines*/ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - char format[20]; /* Format de stockage de chaque bandeau */ - CH50 tab_ima[20]; - int num,ific; -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repertoire)== 0) - sprintf(repertoire,"./"); - sprintf(nom_fic,"%s/%s.band",repertoire,nom_ima); - - /*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=NULL; - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { -/* verification si extension en majuscule */ - nom_fic[0]='\0'; - sprintf(nom_fic,"%s/%s.BAND",repertoire,nom_ima); - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete BANDEAU-CNES"); - goto ERREUR; - } - } -/*.................................... - Decodage du nombre de BANDEAU - ............................................*/ - fscanf(fic_in,"%s %d\n",label,&NbBandeaux); - retour=strncmp(label,"BANDEAU",7); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne BANDEAU dans %s", - nom_fic); - goto ERREUR; - } -/*.................................... - Decodage du nombre du format - ............................................*/ - fscanf(fic_in,"%s\n",format); - -/*.................................... - Recuperation du nom de chaque bandeau - ............................................*/ - for (ific=0;ific<NbBandeaux;ific++) - { - fscanf(fic_in,"%s %d\n",label,&num); - strcpy(tab_ima[num-1],label); - } - -/*.................................. - Fermeture du fichier et destruction du fichier d'entete - ......................................*/ - if (fic_in!=NULL) - { - fclose(fic_in); - fic_in=NULL; - unlink ( nom_fic ); - - } - -/*.................................... - destruction de chaque bandeau - ............................................*/ - for (ific=0;ific<NbBandeaux;ific++) - { - sprintf(nom_fic,"%s/%s",repertoire,tab_ima[ific]); - retour = cai_destruction_image(format,nom_fic); - - } - - return(CAI_OK); - -ERREUR: - return(CAI_KO); - -} - -/* - Fin de l'operation cai_dest_ima_bandeau -*/ - - diff --git a/Utilities/CAI/cai_dll/src/cai_bil.c b/Utilities/CAI/cai_dll/src/cai_bil.c deleted file mode 100755 index 672c3de0b9..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_bil.c +++ /dev/null @@ -1,1810 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_bil.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format bil */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : Septembre 97 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 3.3 : DM : optimisation des acces */ -/*****************************************************************************/ -/* MOD : VERSION : 4.1 : FA : Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : FA : anomalie a la lecture d'images codees sur plus */ -/* de 1 octet */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : FA : prise en compte des extensions en majuscule */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : test sur fclose pour PC/LINUX */ -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : FA : pb ouverture en modification et ecriture */ -/* Modification pour compatibilite ouverture en modification */ -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : FA : pb lecture ligne d'une image 24000x24000 */ -/* EN 64bits, modification de int en long int */ -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : DM : Maj du tag TYPE lorsque l'image est codée */ -/* en reel et que l'utilisateur le precise dans le param "label" */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte des I2,I4,UI2,UI4 et R8 */ -/* en lecture et ecriture */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte de l'information INTEL ou IEEE*/ -/* en lecture et ecriture dans l'entete .hd */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <stdlib.h> -# include <unistd.h> -# include <sys/types.h> -#include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> - -#define _CAI_IMAGE -#define IN_CAI_BIL - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_bil.c,v 1.10 01/05/31 10:47:22 cmf Exp $"; - - -extern char *getenv(); - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_bil */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format bil */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_bil(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_bil (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -long int cai_liste_ima_bil (char *repert, - char ***tab_ima) - -{ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - struct dirent *dp; /* structure resultat de la fonction readdir */ - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - char car; /* variable de travail */ - int nb_ima; /* nombre d'images bil identifiees */ - long int i; /* indice de boucle */ - long int ll,dif; /* variables de travail */ - char blanc; /* caractere blanc */ - - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - blanc=' '; - dirp=opendir(repert); - - if(dirp!=NULL) - { -/*...................................... - - premiere passe pour comptabiliser les images du format donne - - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE BIL - (EXTENSION =.bil) - ..........................................*/ - - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,".bil"); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long int)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - nb_ima=nb_ima+1; - - } -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - else - { - pch0=strstr(dp->d_name,".BIL"); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long int)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - nb_ima=nb_ima+1; - } - } - - } - - closedir(dirp); -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT BIL - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE BIL - (EXTENSION =.lan ou .gis) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,".bil"); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - { - *pch0='\0'; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - - } -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - else - { - pch0=strstr(dp->d_name,".BIL"); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long int)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - nb_ima=nb_ima+1; - } - } - } - - closedir(dirp); - - } - else - { - /* Erreur : Repertoire inexistant */ - nb_ima=-1; - } - - return(nb_ima); - -} -/* Fin de l'operation cai_liste_ima_bil -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_bil */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format bil */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_bil(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_bil (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_lecture_bil(char *repert, - char * nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - char label[80]; /* contient un enregistrement du fichier */ - int nbbit; /* nb de bits par pixel du fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines*/ - char *deb,*deb1,*pch0; /* pointeurs sur chaine de caracteres */ - int i,num; /* indice */ - int nbplan; /* nombre de canaux dans le fichier en-tete */ - char COD_PIX[80]; /* type de codage du pixel (optionnel) */ - struct stat buf_stat; /* structure decrivant status de fichier */ - char *type_machine; /* ordre rangement octets machine de travail*/ - int cmp; /* retour de comparaison de chaine */ - int reconnaissance_type; - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - pch0=NULL; - reconnaissance_type = -1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - - /*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - type_machine = cai_test_pFpf(); - -/*****************************************************************************/ -/* MOD : VERSION : 4.1: FA :Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_lecture"); - } - else - { -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.bil_hd",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.bil_hd",nom_image); - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=NULL; - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - nom_fic[0]='\0'; - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.BIL_HD",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.BIL_HD",nom_image); - } - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete BIL-CNES"); - } - } - if (iret !=0) - { -/*.................................... - Decodage du commentaire - ......................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"COMMENT",7); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne COMMENT"); - iret=0; - } - else - { - fgets(image1->COMMENT,80,fic_in); - - - /*........................................ - Decodage du nombre de canaux - .........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"CHANNELS",8); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne CHANNELS"); - iret=0; - } - else - { - fscanf(fic_in,"%d\n",&nbplan); - *nb_can=nbplan; - -/*....................................... - Decodage du nombre de lignes - ........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"LINES",5); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne LINES"); - iret=0; - } - else - { - fscanf(fic_in,"%d\n",nb_lig); - - -/*....................................... - Decodage du nombre de colonnes - ........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"COLUMNS",7); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne COLUMNS"); - iret=0; - } - else - { - - fscanf(fic_in,"%d\n",nb_col); - -/*....................................... - Decodage du nombre de bits par pixel - ........................................*/ - fgets(label,80,fic_in); - retour=strncmp(label,"BITS PER PIXEL",14); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne BITS "); - iret=0; - } - else - { - fscanf(fic_in,"%d\n",&nbbit); - -/*........................................................ - Decodage du type de codage du pixel (optionnel) - ........................................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"TYPE",4); - if (retour==0) - { - fscanf(fic_in,"%s\n",COD_PIX); - retour=1; - } - else - sprintf(COD_PIX,"UND"); - - pch0=cai_En_majuscule( COD_PIX ); - -/* Verification si type de codage reconnu */ - reconnaissance_type = cai_istyp_connu(pch0); -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte de l'information INTEL ou IEEE*/ -/* en lecture et ecriture dans l'entete .hd */ -/*****************************************************************************/ - if (retour !=0) fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"SENSCODAGE",10); - if (retour!=0) - { -/* Si absent, pas d'inversion */ - image1->INV_OCTETS =0; - sprintf(image1->SENS_COD,type_machine); - } - else - { - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"IEEE",4); - if (retour==0) - sprintf(image1->SENS_COD,"BE"); - else - sprintf(image1->SENS_COD,"LE"); - cmp = strncmp(type_machine,image1->SENS_COD,2); - if (cmp!=0) - image1->INV_OCTETS =1; - else - image1->INV_OCTETS =0; - } - - } - } - } - } - } - } -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in !=NULL) fclose(fic_in); - - if (iret !=0) - { -/*.................................. - Initialisation du nombre d'octets par pixel - ........................................................*/ - if ((nbbit%8)==0) - *nboct_pix=(int)(nbbit/8); - else - *nboct_pix=(int)((nbbit/8)+1); - - if (reconnaissance_type != -1) - { - sprintf(image1->COD_PIX,"%s",COD_PIX); - } - else - { - sprintf(image1->COD_PIX,"UND"); - - if (*nboct_pix==1) - sprintf(image1->COD_PIX,"OCT"); - else if (*nboct_pix==2) - sprintf(image1->COD_PIX,"I2"); - else if (*nboct_pix==4) - { - retour=strncmp(COD_PIX,"I4",2); - if (retour==0) - sprintf(image1->COD_PIX,"I4"); - else - { - retour=strncmp(COD_PIX,"R4",2); - if (retour==0) - sprintf(image1->COD_PIX,"R4"); - } - } - else if (*nboct_pix==8) - { - sprintf(image1->COD_PIX,"R8"); - } - } - -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.bil",repert,nom_image); - } - else - { - sprintf(nom_fic_canal,"%s.bil",nom_image); - } -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : FA : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - retour = stat ( nom_fic_canal , &buf_stat ); - if ( retour != 0 ) - { - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.BIL",repert,nom_image); - } - else - { - sprintf(nom_fic_canal,"%s.BIL",nom_image); - } - } - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - num=open(nom_fic_canal,O_RDONLY|O_BINARY,0); - if (num!= -1) - { - - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_image,"%s",deb); - deb=deb+100; - sscanf(nom_image,"%s",deb1); - deb1=deb1+100; - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=(*nb_col)*i*(*nboct_pix); - } - } - else - iret=0; - } - } - if (iret == 0) - { - return (NULL); - } - else - { - return(image1); - } - -} -/* - Fin de l'operation cai_ouvre_lecture_bil -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_bil */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format bil et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_bil(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_bil (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_creation_bil(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig, - char *label) - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - int retour; /* retour de fonction */ - char car[4]; /* indice du canal traite */ - int i,num,Coher; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - char *type_machine; /* ordre rangement octets machine de travail*/ - int reconnaissance_type; - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1: FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } -/*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - type_machine = cai_test_pFpf(); - -/*................................................. - Constitution du nom du fichier entete et verification qu'il - n'existe pas deja - .................................................*/ - - nom_fic[0]='\0'; - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.bil_hd",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.bil_hd",nom_image); - } - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s BIL existe \n" , nom_image ); - goto ERREUR; - } - -/*............................................................... - constitution du nom de fichier correspondant a la radiometrie de l'image - Verification qu'il n'existe pas deja - Ouverture du fichier en ecriture - .................................................................*/ - - nom_fic_canal[0]='\0'; - sscanf(nom_fic,"%s",nom_fic_canal); - nom_fic_canal[strlen(nom_fic_canal)-3]='\0'; - retour = stat ( nom_fic_canal , &buf_stat ); - - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s BIL existe \n" , nom_image ); - goto ERREUR; - } - - num = open(nom_fic_canal,O_RDWR|O_CREAT|O_BINARY,PERMS); - if (num == -1) - { - - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic_canal); - goto ERREUR; - } - - for (i=0;i<*nb_can;i=i+1) - { - image1->ACCES_CANAL_INT[i]=num; -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : FA : pb ouverture en modification et ecriture */ -/* Modification pour compatibilite ouverture en modification */ -/*****************************************************************************/ - - image1->POS_OCTET[i]=(*nb_col)*i*(*nboct_pix); - } - -/*...................................................... - Ouverture du fichier entete en ecriture - Ecriture du contenu - ..........................................................*/ - fic = fopen(nom_fic,"w"); - if (fic == NULL) - { - sprintf(CAI_ERREUR,"Erreur: Creation fichier %s impossible\n",nom_fic); - goto ERREUR; - } - - retour=fprintf ( fic , "COMMENT\n"); - if (retour == 0) - { - sprintf(CAI_ERREUR,"Erreur: Ecriture %s impossible\n",nom_fic); - goto ERREUR; - } - - fprintf ( fic , "%s\n" , label ); - fprintf ( fic , "CHANNELS\n" ); - fprintf ( fic , "%3d\n" , *nb_can ); - fprintf ( fic , "LINES\n" ); - fprintf ( fic , "%5d\n" , *nb_lig ); - fprintf ( fic , "COLUMNS\n" ); - fprintf ( fic , "%5d\n" , *nb_col ); - fprintf ( fic , "BITS PER PIXEL\n" ); - fprintf ( fic , "%2d\n" , (*nboct_pix)*8 ); - fprintf ( fic , "TYPE\n"); -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : Maj du tag TYPE lorsque l'utilisateur le */ -/* precise dans le param "label" */ -/*****************************************************************************/ -/* Verification si type de codage reconnu dans le label */ - reconnaissance_type = cai_istyp_connu(label); - if (reconnaissance_type == -1) - { - if (*nboct_pix==1) - sprintf ( image1->COD_PIX , "OCT" ); - else if (*nboct_pix==2) - sprintf ( image1->COD_PIX , "I2" ); - else if (*nboct_pix==4) - { -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : DM : Maj du tag TYPE lorsque l'image est codée */ -/* en reel et que l'utilisateur le precise dans le param "label" */ -/*****************************************************************************/ - if ((strcasecmp(label,"R4") == 0)|| - (strcasecmp(label,"FLOAT")== 0)|| - (strcasecmp(label,"REEL") == 0)) - sprintf ( image1->COD_PIX , "R4" ); - else - sprintf ( image1->COD_PIX , "I4" ); - } - else - sprintf ( image1->COD_PIX , "UND" ); - fprintf ( fic , "%s\n",image1->COD_PIX ); - } - else - { -/* Verification de coherence entre le nb d'octets par pixel et le type donne */ - Coher=1; - if(*nboct_pix == 1) - if (reconnaissance_type > 1) Coher=0; - else if(*nboct_pix == 2) - if ((reconnaissance_type != 2) || (reconnaissance_type != 3)) Coher=0; - else if(*nboct_pix == 4) - if ((reconnaissance_type <4) || (reconnaissance_type > 6)) Coher=0; - else if(*nboct_pix == 8) - if (reconnaissance_type != 7) Coher=0; - else - Coher = 0; - if (Coher == 0) - { - sprintf(CAI_ERREUR,"incoherence entre TYPE et Nb bits par pixels\n"); - goto ERREUR; - } - else - { - sprintf ( image1->COD_PIX , "%s" ,label); - fprintf ( fic , "%s\n", label ); - } - } - fprintf ( fic , "SENSCODAGE\n" ); - retour=strncmp(type_machine,"BE",2); - sprintf(image1->SENS_COD,"%s",type_machine); - if (retour == 0) - fprintf ( fic , "IEEE\n" ); - else - fprintf ( fic , "INTEL\n" ); - - -/*************************************************/ -/* Fermeture du fichier */ -/*************************************************/ - - if (fic!=NULL) fclose ( fic ); - return (image1); - -ERREUR : - - if (fic !=NULL) cai_dest_ima_bil ( repert , nom_image ); - return(NULL); - - } - -/* - Fin de l'operation cai_ouvre_creation_bil -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_bil */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image BIL */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_bil(image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_bil (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_lecture_canal_bil(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) - -{ -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : FA : pb lecture ligne d'une image 24000x24000 */ -/* EN 64bits, modification de int no_oct en long int no_oct */ -/*****************************************************************************/ - int num,i,j,k ; /* variables de travail */ - long pt_oct,n; /* position courante dans le fichier image */ - long no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - int lig; /* indice de boucle sur les lignes */ - int oct_pix; /* nb octets par pixels */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - long oct_lig; /* nb oct. par ligne en considerant taille pixel */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - unsigned char *data_image2;/* pointeur donnees image pour inversion octets */ - int taille_image,Nb; /* taille en octets de l'image */ - -/*........................... - Initialisations diverses - ..........................*/ - iret=CAI_OK; - num=image1->ACCES_CANAL_INT[*canal-1]; - oct_pix=image1->NBOCT_PIX; - oct_lig=oct_pix*image1->NB_COL; - -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - - buf_lec = (unsigned char *) calloc(oct_lig,sizeof(unsigned char)); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - } - else - { -/*.................... - Initialisation - ......................*/ - lig=*premiere_ligne; - i=1; - pch=data_image; - -/*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i <= *nombre_lignes_lire)&&(iret==CAI_OK)) - { -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - - no_oct=(long)image1->POS_OCTET[*canal-1]+ - ((long)(lig-1)*(long)image1->NB_COL* - (long)oct_pix*(long)image1->NB_CANAUX); - - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture d'une ligne image - ................................................*/ - n=read(num,buf_lec,oct_lig); - - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image BIL"); - } - else - { -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - deb=buf_lec+(*premiere_colonne-1)*oct_pix; - j=1; - while (j <= *nombre_colonnes_lire) - { -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : FA : anomalie a la lecture d'images codees sur plus */ -/* de 1 octet */ -/*****************************************************************************/ - for (k=0;k<oct_pix;k=k+1) - { - *(pch+k)=*(deb+k); - } - j=j+1; - pch=pch+oct_pix; - deb=deb+(*pas_colonne*oct_pix); - } - - } - i=i+1; - lig=lig+(*pas_ligne); - - } - - free(buf_lec); - } -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte de l'information INTEL ou IEEE*/ -/* en lecture et ecriture dans l'entete .hd */ -/*****************************************************************************/ - - if ( (iret!= CAI_KO) && (image1->INV_OCTETS==1) && (oct_pix!=1) ) - { - taille_image = (*nombre_lignes_lire)*oct_pix*(*nombre_colonnes_lire); - data_image2 = NULL; - data_image2 = (unsigned char *) calloc(taille_image, - sizeof(unsigned char)); - if (data_image2 == NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoire cai_lecture_canal"); - iret=CAI_KO; - } - else - { - /*modification ordre selon nb octets par pixel*/ - swab( (void*)(data_image), (void*)(data_image2), taille_image); - - if (oct_pix!=2) - { - Nb = taille_image/2; - cai_inverser_tableau(data_image, data_image2,Nb); - } - else - for (i=0; i<taille_image;i++) - { - /*stockage dans data_image*/ - data_image[i] = data_image2[i]; - } - - if (data_image2!= NULL) free(data_image2); - } - } - - return(iret); -} -/* - Fin de l'operation cai_lecture_canal_bil -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_bil */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image bil */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_bil(image1, canal, */ /* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_bil (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_ecriture_canal_bil (CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) - -{ -long position_first_lig; /* position de la 1ere ligne a ecrire */ -long position_courante; /* position courante dans le fichier */ -long deplacement; /* deplacement a effectuer */ -int i_ligne; /* compteur de lignes */ -unsigned char *buff_lig; /* tableau contenant une ligne a ecrire */ -long cr_write; /* code retour de write */ -int num; /* descripteur de fichier */ -int nboct_pix; /* nombre d'octets par pixel */ -int nb_canaux; /* nombre de canaux de l'image totale */ - -/* ................ - Initialisations - .................*/ - -i_ligne = 0; -num = image1->ACCES_CANAL_INT[*canal-1]; -nboct_pix = image1->NBOCT_PIX; -nb_canaux = image1->NB_CANAUX; -position_first_lig = 0; -position_courante = 0; -deplacement = 0; - -/********************************************************/ -/* Calcul de la position de la premiere ligne a ecrire */ -/********************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : FA : pb ouverture en modification et ecriture */ -/* Modification pour compatibilite ouverture en modification */ -/*****************************************************************************/ -position_first_lig = (long) ( image1->POS_OCTET[*canal-1] + - (*premiere_ligne - 1) * (*nombre_colonnes_ecrire) * nboct_pix * nb_canaux ); - - -/********************************************************/ -/* Recuperation de la position courante */ -/********************************************************/ - -position_courante = lseek ( num , 0L , 1 ); - - -/********************************************************/ -/* Calcul du deplacement jusqu'a la 1ere ligne a ecrire */ -/********************************************************/ - -deplacement = position_first_lig - position_courante; - - -/********************************************************/ -/* TANT QUE il y a des lignes a ecrire */ -/********************************************************/ -while (i_ligne < (*nombre_lignes_ecrire)) -{ - -/********************************************************/ -/* extraction de la ligne du tableau */ -/********************************************************/ - - buff_lig = data_image + (*nombre_colonnes_ecrire) * nboct_pix * i_ligne; - -/********************************************************/ -/* deplacement jusqu'a la ligne a ecrire */ -/********************************************************/ - - lseek ( num , deplacement , 1 ); - -/********************************************************/ -/* ecriture de la ligne */ -/********************************************************/ - - cr_write = write ( num , buff_lig,(*nombre_colonnes_ecrire)*nboct_pix ); - if ( cr_write != (*nombre_colonnes_ecrire)*nboct_pix ) - { - strcpy ( CAI_ERREUR , "Erreur ecriture canal image bil\n" ); - goto ERREUR; - } - -/********************************************************/ -/* mise a jour du deplacement jusqu'a la ligne */ -/* suivante */ -/********************************************************/ - - deplacement = ( nb_canaux - 1 ) * (*nombre_colonnes_ecrire)*nboct_pix; - -/********************************************************/ -/* incrementation du nombre de lignes */ -/********************************************************/ - - i_ligne++; - -/********************************************************/ -/* FIN TANT QUE */ -/********************************************************/ -} - - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} -/* - Fin de l'operation cai_ecriture_canal_bil -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_bil */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format bil et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_bil(image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_bil (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_bil (CAI_IMAGE *image1) - - -{ - - int iret; /* code retour de l'operation */ - int i_can; /* indice du canal a fermer */ - int num; /* descripteur du fichier a fermer */ - - iret=CAI_OK; -/*............................................. - Fermeture du fichier qui contient tous les canaux - .............................................*/ - num=image1->ACCES_CANAL_INT[0]; - if (num>0) close(num); - - - return (iret); -} - -/* - Fin de l'operation cai_ferme_bil -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_bil */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en bil et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_bil(repertoire,nom_ima) */ /* ------------------ */ -/* repertoire (E) (char *) : repertoire de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_bil (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_dest_ima_bil ( char *repertoire , - char *nom_ima ) - - -{ -int i_can; /* compteur de canaux */ -int iret; /* code retour fonction fermetrue lecture */ -char str_num_canal[3]; /* suffixe numero du canal */ -char nom_fic_entete[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ -char nom_fic_canal[1024]; /* nom du fichier canal a detruire */ - -int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ - -CAI_IMAGE *image1; /* structure ouverture image */ -int nb_can; /* nombre de canaux de l'image */ -int nboct_pix; /* nombre d'octets par pixel image */ -int nb_col; /* nombre de colonnes de l'image */ -int nb_lig; /* nombre de lignes de l'image */ - -/************************************************/ -/* Constitution du nom du fichier d'entete */ -/************************************************/ - -if ((long)strlen(repertoire)!= 0) -{ - sprintf ( nom_ima_complet ,"%s/%s", repertoire ,nom_ima); -} -else -{ - strcpy ( nom_ima_complet , nom_ima); -} - sprintf(nom_fic_entete ,"%s.bil_hd", nom_ima_complet); - -/************************************************/ -/* Destruction du fichier d'entete */ -/************************************************/ - -cr_stat = stat ( nom_fic_entete , &buf_stat ); -if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); -else -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ -{ - sprintf(nom_fic_entete ,"%s.BIL_HD", nom_ima_complet); - cr_stat = stat ( nom_fic_entete , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); - -} - -/************************************************/ -/* Destruction du fichier radiometrie */ -/************************************************/ -sprintf(nom_fic_entete ,"%s.bil", nom_ima_complet); -cr_stat = stat ( nom_fic_entete , &buf_stat ); -if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); -else -{ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - - sprintf(nom_fic_entete ,"%s.BIL", nom_ima_complet); - cr_stat = stat ( nom_fic_entete , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); - -} - - -return (CAI_OK); - -} -/* - Fin de l'operation cai_dest_ima_bil -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_modif_nbbitspix_bil */ -/* ---------- */ -/* */ -/* ROLE : permet de modifier le nombre de bits significatifs par pixel */ -/* ----- dans l'entete de fichier (.hd) */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_modif_nbbitspix_bil(image1,NbBitsPix) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* NbBitsPix (E) (int) : nb de bits significatifs par pixel */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_modif_nbbitspix_bil(CAI_IMAGE *image1,int NbBitsPix) - -{ - int Can; /* indice de boucle sur les canaux */ - char fichierE[1024]; /* fichier a traiter */ - char Command[1024]; /* Commande a envoyer au systeme */ - FILE *fic; /* pointeur descripteur fichier */ - int pt_oct; /* position courante ds le fichier */ - int *Ref; /* Reference du SDS des fichiers */ - char label[80]; /* contient un enregist fichier */ - char repert[1024]; /* repertoire de stockage image */ - char image[1024]; /* nom de l'image a ouvrir */ - char car; /* variable de travail */ - int icr,tempo; /* code retour fonction */ - CAI_CHAINE *NomIma; - int retour; - - -/* Ouverture du fichier d'entete */ - - fichierE[0]='\0'; - sprintf(fichierE,"%s.bil_hd",image1->NOM_IMAGE); - fic = fopen(fichierE,"w"); - if (fic == NULL) - { -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - fichierE[0]='\0'; - sprintf(fichierE,"%s.BIL_HD",image1->NOM_IMAGE); - fic = fopen(fichierE,"w"); - if (fic == NULL) - { - - sprintf(CAI_ERREUR, - "Erreur: Modification fichier %s impossible\n",fichierE); - goto ERREUR; - } - } - -/* Modification du fichier d'entete */ - rewind(fic); - fprintf ( fic , "COMMENT\n"); - fprintf ( fic , "%s\n" ,image1->COMMENT); - fprintf ( fic , "CHANNELS\n" ); - fprintf ( fic , "%3d\n" , image1->NB_CANAUX); - fprintf ( fic , "LINES\n" ); - fprintf ( fic , "%5d\n" , image1->NB_LIG); - fprintf ( fic , "COLUMNS\n" ); - fprintf ( fic , "%5d\n" , image1->NB_COL ); - fprintf ( fic , "BITS PER PIXEL\n" ); - fprintf ( fic , "%2d\n" , NbBitsPix ); - fprintf ( fic , "TYPE\n"); - fprintf ( fic , "%s\n",image1->COD_PIX ); - fprintf ( fic, "SENSCODAGE\n"); - retour=strncmp((char *)image1->SENS_COD,"BE",2); - if (retour == 0) - fprintf ( fic , "IEEE\n" ); - else - fprintf ( fic , "INTEL\n" ); - - fclose ( fic ); - - return(CAI_OK); - -ERREUR : - return(CAI_KO); -} -/* - Fin de l'operation cai_modif_nbbitspix_bil -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_bil */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lec-ecr d'une image au format bil */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_bil(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_bil (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_modifie_bil(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - char label[80]; /* contient un enregistrement du fichier */ - int nbbit; /* nb de bits par pixel du fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines*/ - char *deb,*deb1,*pch0; /* pointeurs sur chaine de caracteres */ - int i,num; /* indice */ - int nbplan; /* nombre de canaux dans le fichier en-tete */ - char COD_PIX[80]; /* type de codage du pixel (optionnel) */ - struct stat buf_stat; /* structure decrivant status de fichier */ - char *type_machine; /* ordre rangement octets machine de travail*/ - int cmp; /* retour de comparaison de chaine */ - int reconnaissance_type; - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - pch0=NULL; - reconnaissance_type = -1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - - /*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - type_machine = cai_test_pFpf(); - -/*****************************************************************************/ -/* MOD : VERSION : 4.1: FA :Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_modifie"); - } - else - { -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.bil_hd",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.bil_hd",nom_image); - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=NULL; - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - nom_fic[0]='\0'; - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.BIL_HD",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.BIL_HD",nom_image); - } - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete BIL-CNES"); - } - } - if (iret !=0) - { -/*.................................... - Decodage du commentaire - ......................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"COMMENT",7); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne COMMENT"); - iret=0; - } - else - { - fgets(image1->COMMENT,80,fic_in); - - - /*........................................ - Decodage du nombre de canaux - .........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"CHANNELS",8); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne CHANNELS"); - iret=0; - } - else - { - fscanf(fic_in,"%d\n",&nbplan); - *nb_can=nbplan; - -/*....................................... - Decodage du nombre de lignes - ........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"LINES",5); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne LINES"); - iret=0; - } - else - { - fscanf(fic_in,"%d\n",nb_lig); - - -/*....................................... - Decodage du nombre de colonnes - ........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"COLUMNS",7); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne COLUMNS"); - iret=0; - } - else - { - - fscanf(fic_in,"%d\n",nb_col); - -/*....................................... - Decodage du nombre de bits par pixel - ........................................*/ - fgets(label,80,fic_in); - retour=strncmp(label,"BITS PER PIXEL",14); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne BITS "); - iret=0; - } - else - { - fscanf(fic_in,"%d\n",&nbbit); - -/*........................................................ - Decodage du type de codage du pixel (optionnel) - ........................................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"TYPE",4); - if (retour==0) - { - fscanf(fic_in,"%s\n",COD_PIX); - retour=1; - } - else - sprintf(COD_PIX,"UND"); - - pch0=cai_En_majuscule( COD_PIX ); - -/* Verification si type de codage reconnu */ - reconnaissance_type = cai_istyp_connu(pch0); -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte de l'information INTEL ou IEEE*/ -/* en lecture et ecriture dans l'entete .hd */ -/*****************************************************************************/ - if (retour !=0) fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"SENSCODAGE",10); - if (retour!=0) - { -/* Si absent, pas d'inversion */ - image1->INV_OCTETS =0; - sprintf(image1->SENS_COD,type_machine); - } - else - { - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"IEEE",4); - if (retour==0) - sprintf(image1->SENS_COD,"BE"); - else - sprintf(image1->SENS_COD,"LE"); - cmp = strncmp(type_machine,image1->SENS_COD,2); - if (cmp!=0) - image1->INV_OCTETS =1; - else - image1->INV_OCTETS =0; - } - - } - } - } - } - } - } -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in !=NULL) fclose(fic_in); - - if (iret !=0) - { -/*.................................. - Initialisation du nombre d'octets par pixel - ........................................................*/ - if ((nbbit%8)==0) - *nboct_pix=(int)(nbbit/8); - else - *nboct_pix=(int)((nbbit/8)+1); - - if (reconnaissance_type != -1) - { - sprintf(image1->COD_PIX,"%s",COD_PIX); - } - else - { - sprintf(image1->COD_PIX,"UND"); - - if (*nboct_pix==1) - sprintf(image1->COD_PIX,"OCT"); - else if (*nboct_pix==2) - sprintf(image1->COD_PIX,"I2"); - else if (*nboct_pix==4) - { - retour=strncmp(COD_PIX,"I4",2); - if (retour==0) - sprintf(image1->COD_PIX,"I4"); - else - { - retour=strncmp(COD_PIX,"R4",2); - if (retour==0) - sprintf(image1->COD_PIX,"R4"); - } - } - else if (*nboct_pix==8) - { - sprintf(image1->COD_PIX,"R8"); - } - } - -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.bil",repert,nom_image); - } - else - { - sprintf(nom_fic_canal,"%s.bil",nom_image); - } -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : FA : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - retour = stat ( nom_fic_canal , &buf_stat ); - if ( retour != 0 ) - { - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.BIL",repert,nom_image); - } - else - { - sprintf(nom_fic_canal,"%s.BIL",nom_image); - } - } - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - num=open(nom_fic_canal,O_RDWR|O_BINARY,0); - if (num!= -1) - { - - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_image,"%s",deb); - deb=deb+100; - sscanf(nom_image,"%s",deb1); - deb1=deb1+100; - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=(*nb_col)*i*(*nboct_pix); - } - } - else - iret=0; - } - } - if (iret == 0) - { - return (NULL); - } - else - { - return(image1); - } - -} - -/* - Fin de l'operation cai_ouvre_modifie_bil -*/ diff --git a/Utilities/CAI/cai_dll/src/cai_bip.c b/Utilities/CAI/cai_dll/src/cai_bip.c deleted file mode 100755 index 6d7c520089..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_bip.c +++ /dev/null @@ -1,1807 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_bip.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format bip */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : Mai 1996 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 3.3 : DM : optimisation des acces */ -/*****************************************************************************/ -/* MOD : VERSION : 4.1 : FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : FA : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : test sur fclose pour PC/LINUX */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte des I2,I4,UI2,UI4 et R8 */ -/* en lecture et ecriture */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte de l'information INTEL ou IEEE*/ -/* en lecture et ecriture dans l'entete .hd */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <stdlib.h> -# include <unistd.h> -# include <sys/types.h> -#include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> -#include <errno.h> - -#define _CAI_IMAGE -#define IN_CAI_BIP - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_bip.c,v 1.11 01/05/31 10:46:56 cmf Exp $"; - - -extern char *getenv(); - - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_bip */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format bip */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_bip(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_bip (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -long int cai_liste_ima_bip (char *repert, - char ***tab_ima) - -{ - - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - struct dirent *dp; /* structure resultat de la fonction readdir */ - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - int nb_ima; /* nombre d'images bip identifiees */ - int i; /* indice de boucle */ - long int ll,dif; /* variables de travail */ - char blanc; /* caractere blanc */ - - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - dirp=opendir(repert); - blanc = ' '; - - if(dirp!=NULL) - { - - -/*...................................... - - premiere passe pour comptabiliser les images du format donne - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE BIP_CNES - (EXTENSION =.bip) - ..........................................*/ - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,".bip"); - if (pch0 != NULL) - { - ll = (long int)strlen(dp->d_name); - dif = (long int)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - nb_ima=nb_ima+1; - - } -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - else - { - pch0=strstr(dp->d_name,".BIP"); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long int)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - nb_ima=nb_ima+1; - } - } - - } - - (void)closedir(dirp); - -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT BIP - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE BIP_CNES - (EXTENSION =.bip) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,".bip"); - if (pch0 != NULL) - { - ll = (long int)strlen(dp->d_name); - dif = (long int)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - { - *pch0='\0'; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - - } -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - else - { - pch0=strstr(dp->d_name,".BIP"); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long int)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - nb_ima=nb_ima+1; - } - } - - } - - (void)closedir(dirp); - - - } - else - { - /* repertoire inexistant */ - nb_ima=-1; - } - return(nb_ima); - -} - -/* Fin de l'operation cai_liste_ima_bip -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_bip */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format bip */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_bip (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_bip (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_lecture_bip(char *repert, - char * nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - char label[80]; /* contient un enregistrement du fichier */ - int nbbit; /* nb de bits par pixel du fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines*/ - char *deb,*deb1,*pch0; /* pointeurs sur chaine de caracteres */ - int i,num; /* indice */ - int nbplan; /* nombre de canaux dans le fichier en-tete */ - char COD_PIX[80]; /* type de codage du pixel (optionnel) */ - struct stat buf_stat; /* structure decrivant status de fichier */ - char *type_machine; /* ordre rangement octets machine de travail*/ - int cmp; /* retour de comparaison de chaine */ - int reconnaissance_type; - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - - /*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - type_machine = cai_test_pFpf(); - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1: FA Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_lecture"); - } - else - { - -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!= 0) - { - sprintf(nom_fic,"%s/%s.bip_hd",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.bip_hd",nom_image); - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=NULL; - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - nom_fic[0]='\0'; - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.BIP_HD",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.BIP_HD",nom_image); - } - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete BIP-CNES"); - } - } - if (iret !=0) - { -/*.................................... - Decodage du commentaire - ......................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"COMMENT",7); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne COMMENT"); - iret=0; - } - else - { - fgets(image1->COMMENT,80,fic_in); - - - /*........................................ - Decodage du nombre de canaux - .........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"CHANNELS",8); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne CHANNELS"); - iret=0; - } - else - { - fscanf(fic_in,"%d\n",&nbplan); - *nb_can=nbplan; - -/*....................................... - Decodage du nombre de lignes - ........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"LINES",5); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne LINES"); - iret=0; - } - else - { - fscanf(fic_in,"%d\n",nb_lig); - - -/*....................................... - Decodage du nombre de colonnes - ........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"COLUMNS",7); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne COLUMNS"); - iret=0; - } - else - { - - fscanf(fic_in,"%d\n",nb_col); - -/*....................................... - Decodage du nombre de bits par pixel - ........................................*/ - fgets(label,80,fic_in); - retour=strncmp(label,"BITS PER PIXEL",14); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne BITS "); - iret=0; - } - else - { - fscanf(fic_in,"%d\n",&nbbit); - -/*........................................................ - Decodage du type de codage du pixel (optionnel) - ........................................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"TYPE",4); - if (retour==0) - { - fscanf(fic_in,"%s\n",COD_PIX); - retour=1; - } - else - sprintf(COD_PIX,"UND"); - pch0=cai_En_majuscule( COD_PIX ); - -/* Verification si type de codage reconnu */ - reconnaissance_type = cai_istyp_connu(pch0); -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte de l'information INTEL ou IEEE*/ -/* en lecture et ecriture dans l'entete .hd */ -/*****************************************************************************/ - if (retour !=0) fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"SENSCODAGE",10); - if (retour!=0) - { -/* Si absent, pas d'inversion */ - image1->INV_OCTETS =0; - sprintf((char *)image1->SENS_COD,type_machine); - } - else - { - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"IEEE",4); - if (retour==0) - sprintf((char *)image1->SENS_COD,"BE"); - else - sprintf((char *)image1->SENS_COD,"LE"); - cmp = strncmp(type_machine,image1->SENS_COD,2); - if (cmp!=0) - image1->INV_OCTETS =1; - else - image1->INV_OCTETS =0; - } - } - } - } - } - } - } -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in !=NULL) fclose(fic_in); - - if (iret !=0) - { -/*.................................. - Initialisation du nombre d'octets par pixel - ........................................................*/ - if ((nbbit%8)==0) - *nboct_pix=(int)(nbbit/8); - else - *nboct_pix=(int)((nbbit/8)+1); - image1->NB_BITS_PIX=nbbit; - - if (reconnaissance_type != -1) - { - sprintf(image1->COD_PIX,"%s",COD_PIX); - } - else - { - sprintf(image1->COD_PIX,"UND"); - - if (*nboct_pix==1) - sprintf(image1->COD_PIX,"OCT"); - else if (*nboct_pix==2) - sprintf(image1->COD_PIX,"I2"); - else if (*nboct_pix==4) - { - retour=strncmp(COD_PIX,"I4",2); - if (retour==0) - sprintf(image1->COD_PIX,"I4"); - else - { - retour=strncmp(COD_PIX,"R4",2); - if (retour==0) - sprintf(image1->COD_PIX,"R4"); - } - } - else if (*nboct_pix==8) - { - sprintf(image1->COD_PIX,"R8"); - } - } - -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - if ((long int)strlen(repert)!= 0) - { - sprintf(nom_fic_canal,"%s/%s.bip",repert,nom_image); - } - else - { - sprintf(nom_fic_canal,"%s.bip",nom_image); - } -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : FA : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - retour = stat ( nom_fic_canal , &buf_stat ); - if ( retour != 0 ) - { - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.BIP",repert,nom_image); - } - else - { - sprintf(nom_fic_canal,"%s.BIP",nom_image); - } - } - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - num=open(nom_fic_canal,O_RDONLY|O_BINARY,0); - if (num!= -1) - { - - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_image,"%s",deb); - deb=deb+100; - sscanf(nom_image,"%s",deb1); - deb1=deb1+100; - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=0; - } - } - else - iret=0; - } - } - if (iret == 0) - { - return (NULL); - } - else - { - return(image1); - } - -} - -/* - Fin de l'operation cai_ouvre_lecture_bip -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_bip */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format bip et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_bip (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_bip (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_creation_bip(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig, - char *label) -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - int retour; /* retour de fonction */ - int i,num,Coher; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - char *type_machine; /* ordre rangement octets machine de travail*/ - int reconnaissance_type; - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1: FA Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } - -/*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - type_machine = cai_test_pFpf(); - -/*................................................. - Constitution du nom du fichier entete et verification qu'il - n'existe pas deja - .................................................*/ - - nom_fic[0]='\0'; - if ((long int)strlen(repert)!= 0) - { - sprintf(nom_fic,"%s/%s.bip_hd",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.bip_hd",nom_image); - } - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s BIP existe \n" , nom_image ); - goto ERREUR; - } - -/*............................................................... - constitution du nom de fichier correspondant a la radiometrie de l'image - Verification qu'il n'existe pas deja - Ouverture du fichier en ecriture - .................................................................*/ - - nom_fic_canal[0]='\0'; - sscanf(nom_fic,"%s",nom_fic_canal); - nom_fic_canal[strlen(nom_fic_canal)-3]='\0'; - retour = stat ( nom_fic_canal , &buf_stat ); - - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s BIP existe \n" , nom_image ); - goto ERREUR; - } - - num = open(nom_fic_canal,O_RDWR|O_CREAT|O_BINARY,PERMS); - if (num == -1) - { - - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic_canal); - goto ERREUR; - } - - for (i=0;i<*nb_can;i=i+1) - { - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=0; - } - -/*...................................................... - Ouverture du fichier entete en ecriture - Ecriture du contenu - ..........................................................*/ - fic = fopen(nom_fic,"w"); - if (fic == NULL) - { - sprintf(CAI_ERREUR,"Erreur: Creation fichier %s impossible\n",nom_fic); - goto ERREUR; - } - - retour=fprintf ( fic , "COMMENT\n"); - if (retour == 0) - { - sprintf(CAI_ERREUR,"Erreur: Ecriture %s impossible\n",nom_fic); - goto ERREUR; - } - - fprintf ( fic , "%s\n" , label ); - fprintf ( fic , "CHANNELS\n" ); - fprintf ( fic , "%3d\n" , *nb_can ); - fprintf ( fic , "LINES\n" ); - fprintf ( fic , "%5d\n" , *nb_lig ); - fprintf ( fic , "COLUMNS\n" ); - fprintf ( fic , "%5d\n" , *nb_col ); - fprintf ( fic , "BITS PER PIXEL\n" ); - fprintf ( fic , "%2d\n" , (*nboct_pix)*8 ); - fprintf ( fic , "TYPE\n"); -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : Maj du tag TYPE lorsque l'utilisateur le */ -/* precise dans le param "label" */ -/*****************************************************************************/ -/* Verification si type de codage reconnu dans le label */ - reconnaissance_type = cai_istyp_connu(label); - if (reconnaissance_type == -1) - { - if (*nboct_pix==1) - sprintf ( image1->COD_PIX , "OCT" ); - else if (*nboct_pix==2) - sprintf ( image1->COD_PIX , "I2" ); - else if (*nboct_pix==4) - { -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : DM : Maj du tag TYPE lorsque l'image est codée */ -/* en reel et que l'utilisateur le precise dans le param "label" */ -/*****************************************************************************/ - if ((strcasecmp(label,"R4") == 0)|| - (strcasecmp(label,"FLOAT")== 0)|| - (strcasecmp(label,"REEL") == 0)) - sprintf ( image1->COD_PIX , "R4" ); - else - sprintf ( image1->COD_PIX , "I4" ); - } - else if (*nboct_pix==8) - sprintf ( image1->COD_PIX , "R8" ); - else - sprintf ( image1->COD_PIX , "UND" ); - fprintf ( fic , "%s\n",image1->COD_PIX ); - } - else - { -/* Verification de coherence entre le nb d'octets par pixel et le type donne */ - Coher=1; - if(*nboct_pix == 1) - if (reconnaissance_type > 1) Coher=0; - else if(*nboct_pix == 2) - if ((reconnaissance_type != 2) || (reconnaissance_type != 3)) Coher=0; - else if(*nboct_pix == 4) - if ((reconnaissance_type <4) || (reconnaissance_type > 6)) Coher=0; - else if(*nboct_pix == 8) - if (reconnaissance_type != 7) Coher=0; - else - Coher = 0; - if (Coher == 0) - { - sprintf(CAI_ERREUR,"incoherence entre TYPE et Nb bits par pixels\n"); - goto ERREUR; - } - else - { - sprintf ( image1->COD_PIX , "%s" ,label); - fprintf ( fic , "%s\n", label ); - } - } - fprintf ( fic , "SENSCODAGE\n" ); - retour=strncmp(type_machine,"BE",2); - sprintf((char *)image1->SENS_COD,"%s",type_machine); - if (retour == 0) - fprintf ( fic , "IEEE\n" ); - else - fprintf ( fic , "INTEL\n" ); - -/*************************************************/ -/* Fermeture du fichier */ -/*************************************************/ - - fclose ( fic ); - return (image1); - -ERREUR : - - if (fic !=NULL) cai_dest_ima_bip ( repert , nom_image ); - return(NULL); -} - -/* - Fin de l'operation cai_ouvre_creation_bip -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_bip */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image bip */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_bip(image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_bip (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_lecture_canal_bip(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) -{ - - int num,i,j,k; /* variables de travail */ - long pt_oct; /* position courante dans le fichier image */ - long no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - int lig; /* indice de boucle sur les lignes */ - int oct_pix; /* nb octets par pixels */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - int oct_lig; /* nb oct. par ligne en considerant taille pixel */ - int nbcan; /* nombre de canaux de l'image */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - unsigned char *data_image2;/* pointeur donnees image pour inversion octets */ - int taille_image,Nb; /* taille en octets de l'image */ - long n; - -/*........................... - Initialisations diverses - ..........................*/ - - iret=CAI_OK; - num=image1->ACCES_CANAL_INT[(*canal)-1]; - oct_pix=image1->NBOCT_PIX; - nbcan = image1->NB_CANAUX; - oct_lig=oct_pix*nbcan*(image1->NB_COL); -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - buf_lec = (unsigned char *) malloc(oct_lig); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - } - else - { -/*.................... - Initialisation - ......................*/ - lig=*premiere_ligne; - i=1; - pch=data_image; - /*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i <= (*nombre_lignes_lire))&&(iret==CAI_OK)) - { - -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=(long int)lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - no_oct=image1->POS_OCTET[(*canal)-1]+ - ((lig-1)*oct_lig); -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long int)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture d'une ligne image - ................................................*/ - n=read(num,buf_lec,oct_lig); - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image BIP"); - } - else - { -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - deb=buf_lec+((*premiere_colonne)-1)*oct_pix*nbcan+ - ((*canal-1)*oct_pix); - j=1; - while (j <= (*nombre_colonnes_lire)) - { - - for (k=0;k<oct_pix;k=k+1) - { - *(pch+k)=*(deb+k); - } - pch=pch+oct_pix; - j=j+1; - deb=deb+((*pas_colonne)*oct_pix*nbcan); - } - - } - i=i+1; - lig=lig+(*pas_ligne); - - } - - free(buf_lec); - } - -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte de l'information INTEL ou IEEE*/ -/* en lecture et ecriture dans l'entete .hd */ -/*****************************************************************************/ - - if ( (iret!= CAI_KO) && (image1->INV_OCTETS==1) && (oct_pix!=1) ) - { - taille_image = (*nombre_lignes_lire)*oct_pix*(*nombre_colonnes_lire); - data_image2 = NULL; - data_image2 = (unsigned char *) calloc(taille_image, - sizeof(unsigned char)); - if (data_image2 == NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoire cai_lecture_canal"); - iret=CAI_KO; - } - else - { - /*modification ordre selon nb octets par pixel*/ - swab( (void*)(data_image), (void*)(data_image2), taille_image); - - if (oct_pix!=2) - { - Nb = taille_image/2; - cai_inverser_tableau(data_image, data_image2,Nb); - } - else - for (i=0; i<taille_image;i++) - { - /*stockage dans data_image*/ - data_image[i] = data_image2[i]; - } - - if (data_image2!= NULL) free(data_image2); - } - } - - return(iret); - } -/* - Fin de l'operation cai_lecture_canal_bip -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_bip */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image bip */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_bip(image1, canal, */ /* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_bip (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ecriture_canal_bip (CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) - -{ - -long position_first_lig; /* position de la 1ere ligne a ecrire */ -long position_courante; /* position courante dans le fichier */ -long deplacement; /* deplacement a effectuer */ -int i_ligne; /* compteur de lignes */ -unsigned char *buff_lig; /* tableau contenant une ligne a ecrire */ -long cr_write; /* code retour de write */ -int num; /* descripteur de fichier */ -int nboct_pix; /* nombre d'octets par pixel */ -int nbcan; /* nombre de canaux de l'image */ -int nboctet; /* nombre d'octets d'une ligne multi */ -unsigned char *deb,*pch; /* pointeur sur chaine pour transfert */ -int i,j,k; /* indice de boucle sur les colonnes */ -long cr_read; /* code retour de la fonction read */ - -/* initialisations */ - -i_ligne = 0; -num = image1->ACCES_CANAL_INT[*canal-1]; -nboct_pix = image1->NBOCT_PIX; -nbcan = image1->NB_CANAUX; -nboctet = (*nombre_colonnes_ecrire)*nbcan*nboct_pix; - -/********************************************************/ -/* Calcul de la position de la premiere ligne a ecrire */ -/********************************************************/ - -position_first_lig =(long) ( image1->POS_OCTET[(*canal)-1]+ - (( *premiere_ligne - 1) *nboctet)); - - -/********************************************************/ -/* Recuperation de la position courante */ -/********************************************************/ - -position_courante = lseek ( num , 0L , 1 ); - - -/********************************************************/ -/* Deplacement jusqu'a la premiere ligne a ecrire */ -/********************************************************/ - -deplacement = position_first_lig - position_courante; -lseek ( num , deplacement , 1 ); - -buff_lig=(unsigned char *)(calloc(nboctet,sizeof(unsigned char))); -if (buff_lig == NULL) -{ - strcpy(CAI_ERREUR,"Probleme d'allocation memoire ecriture"); - goto ERREUR; - } - -pch=data_image; - - -/********************************************************/ -/* TANT QUE il y a des lignes a ecrire */ -/********************************************************/ -while (i_ligne < (*nombre_lignes_ecrire)) -{ - cr_read=read(num,buff_lig,nboctet); - if (cr_read <0) - { - strcpy ( CAI_ERREUR , "Erreur ecriture canal image BIP\n" ); - goto ERREUR; - } - else - { - if (cr_read==0) - { - for (i=0;i<nboctet;i++) - *(buff_lig+i)=0; - deplacement=0; - } - else - deplacement= - nboctet; - } -/************************************************************************/ -/* Redeplacement jusqu'au premier pixel de la premiere ligne a ecrire*/ -/************************************************************************/ - lseek ( num , deplacement , 1 ); - -/*************************************************************************/ -/* chargement de la ligne entrelacant les pixels par rapport aux canaux*/ -/*************************************************************************/ - - deb=buff_lig+((*canal)-1)*nboct_pix; - for (j=0;j<(*nombre_colonnes_ecrire);j=j+1) - { - for (k=0;k<nboct_pix;k=k+1) - { - *(deb+k)=*(pch+k); - } - - pch=pch+nboct_pix; - deb=deb + (nboct_pix*nbcan); - } -/********************************************************/ -/* ecriture de la ligne */ -/********************************************************/ - cr_write = write ( num , buff_lig , nboctet ); - - if ( cr_write != nboctet ) - { - strcpy ( CAI_ERREUR , "Erreur ecriture canal image BIP\n" ); - goto ERREUR; - } -/********************************************************/ -/* incrementation du nombre de lignes */ -/********************************************************/ - - i_ligne++; - -/********************************************************/ -/* FIN TANT QUE */ -/********************************************************/ - -} -free(buff_lig); - -return (CAI_OK); - -ERREUR : - -free(buff_lig); -return (CAI_KO); - - -} - -/* - Fin de l'operation cai_ecriture_canal_bip -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_bip */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format bip et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_bip(image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_bip (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_bip (CAI_IMAGE *image1) - -{ - int iret; /* code retour de l'operation */ - int i_can; /* indice du canal a fermer */ - int num; /* descripteur du fichier a fermer */ - - iret=CAI_OK; -/*............................................. - Fermeture de tous les canaux - .............................................*/ - for (i_can=0;i_can<image1->NB_CANAUX;i_can=i_can+1) - { - - num=image1->ACCES_CANAL_INT[i_can]; - if (num>0) close(num); - } - - - return (iret); -} - -/* - Fin de l'operation cai_ferme_bip -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_bip */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en bip et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_bip(repertoire,nom_ima) */ /* ------------------ */ -/* repertoire (E) (char *) : repertoire de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_bip (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_dest_ima_bip ( char *repertoire , - char *nom_ima ) - -{ - -char nom_fic_entete[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ - -int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ - -/************************************************/ -/* Constitution du nom du fichier d'entete */ -/************************************************/ - -if ((long int)strlen(repertoire)!= 0) -{ - - sprintf ( nom_ima_complet ,"%s/%s", repertoire ,nom_ima); -} -else -{ - strcpy ( nom_ima_complet , nom_ima); -} - sprintf(nom_fic_entete ,"%s.bip_hd", nom_ima_complet); - -/************************************************/ -/* Destruction du fichier d'entete */ -/************************************************/ - -cr_stat = stat ( nom_fic_entete , &buf_stat ); -if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); - -else -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ -{ - sprintf(nom_fic_entete ,"%s.BIP_HD", nom_ima_complet); - cr_stat = stat ( nom_fic_entete , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); - -} - -/************************************************/ -/* Destruction du fichier radiometrie */ -/************************************************/ - sprintf(nom_fic_entete ,"%s.bip", nom_ima_complet); - cr_stat = stat ( nom_fic_entete , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); - else - { -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - - sprintf(nom_fic_entete ,"%s.BIP", nom_ima_complet); - cr_stat = stat ( nom_fic_entete , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); - -} - - - -return (CAI_OK); - -} -/* - Fin de l'operation cai_dest_ima_bip -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_modif_nbbitspix_bip */ -/* ---------- */ -/* */ -/* ROLE : permet de modifier le nombre de bits significatifs par pixel */ -/* ----- dans l'entete de fichier (.hd) */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_modif_nbbitspix_bip(image1,NbBitsPix) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* NbBitsPix (E) (int) : nb de bits significatifs par pixel */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_modif_nbbitspix_bip(CAI_IMAGE *image1,int NbBitsPix) - -{ - int Can; /* indice de boucle sur les canaux */ - char fichierE[1024]; /* fichier a traiter */ - char Command[1024]; /* Commande a envoyer au systeme */ - FILE *fic; /* pointeur descripteur fichier */ - int pt_oct; /* position courante ds le fichier */ - int *Ref; /* Reference du SDS des fichiers */ - char label[80]; /* contient un enregist fichier */ - char repert[1024]; /* repertoire de stockage image */ - char image[1024]; /* nom de l'image a ouvrir */ - char car; /* variable de travail */ - int icr,tempo,retour; /* code retour fonction */ - CAI_CHAINE *NomIma; - - -/* Ouverture du fichier d'entete */ - - fichierE[0]='\0'; - sprintf(fichierE,"%s.bip_hd",image1->NOM_IMAGE); - fic = fopen(fichierE,"w"); - if (fic == NULL) - { -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - fichierE[0]='\0'; - sprintf(fichierE,"%s.BIP_HD",image1->NOM_IMAGE); - fic = fopen(fichierE,"w"); - if (fic == NULL) - { - sprintf(CAI_ERREUR, - "Erreur: Modification fichier %s impossible\n",fichierE); - goto ERREUR; - } - } - -/* Modification du fichier d'entete */ - rewind(fic); - fprintf ( fic , "COMMENT\n"); - fprintf ( fic , "%s\n" ,image1->COMMENT); - fprintf ( fic , "CHANNELS\n" ); - fprintf ( fic , "%3d\n" , image1->NB_CANAUX); - fprintf ( fic , "LINES\n" ); - fprintf ( fic , "%5d\n" , image1->NB_LIG); - fprintf ( fic , "COLUMNS\n" ); - fprintf ( fic , "%5d\n" , image1->NB_COL ); - fprintf ( fic , "BITS PER PIXEL\n" ); - fprintf ( fic , "%2d\n" , NbBitsPix ); - fprintf ( fic , "TYPE\n"); - fprintf ( fic , "%s\n",image1->COD_PIX ); - fprintf ( fic, "SENSCODAGE\n"); - retour=strncmp((char *)image1->SENS_COD,"BE",2); - if (retour == 0) - fprintf ( fic , "IEEE\n" ); - else - fprintf ( fic , "INTEL\n" ); - - - fclose ( fic ); - - return(CAI_OK); - -ERREUR : - return(CAI_KO); -} -/* - Fin de l'operation cai_modif_nbbitspix_bip -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_bip */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture/ecriture d'une image au format */ -/* ----- bip et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_bip (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_bip (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_modifie_bip(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - char label[80]; /* contient un enregistrement du fichier */ - int nbbit; /* nb de bits par pixel du fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines*/ - char *deb,*deb1,*pch0; /* pointeurs sur chaine de caracteres */ - int i,num; /* indice */ - int nbplan; /* nombre de canaux dans le fichier en-tete */ - char COD_PIX[80]; /* type de codage du pixel (optionnel) */ - struct stat buf_stat; /* structure decrivant status de fichier */ - char *type_machine; /* ordre rangement octets machine de travail*/ - int cmp; /* retour de comparaison de chaine */ - int reconnaissance_type; - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - - /*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - type_machine = cai_test_pFpf(); - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1: FA Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_modifie"); - } - else - { - -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!= 0) - { - sprintf(nom_fic,"%s/%s.bip_hd",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.bip_hd",nom_image); - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=NULL; - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - nom_fic[0]='\0'; - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.BIP_HD",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.BIP_HD",nom_image); - } - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete BIP-CNES"); - } - } - if (iret !=0) - { -/*.................................... - Decodage du commentaire - ......................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"COMMENT",7); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne COMMENT"); - iret=0; - } - else - { - fgets(image1->COMMENT,80,fic_in); - - - /*........................................ - Decodage du nombre de canaux - .........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"CHANNELS",8); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne CHANNELS"); - iret=0; - } - else - { - fscanf(fic_in,"%d\n",&nbplan); - *nb_can=nbplan; - -/*....................................... - Decodage du nombre de lignes - ........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"LINES",5); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne LINES"); - iret=0; - } - else - { - fscanf(fic_in,"%d\n",nb_lig); - - -/*....................................... - Decodage du nombre de colonnes - ........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"COLUMNS",7); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne COLUMNS"); - iret=0; - } - else - { - - fscanf(fic_in,"%d\n",nb_col); - -/*....................................... - Decodage du nombre de bits par pixel - ........................................*/ - fgets(label,80,fic_in); - retour=strncmp(label,"BITS PER PIXEL",14); - if (retour!=0) - { - strcpy(CAI_ERREUR,"Informations incoherentes ligne BITS "); - iret=0; - } - else - { - fscanf(fic_in,"%d\n",&nbbit); - -/*........................................................ - Decodage du type de codage du pixel (optionnel) - ........................................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"TYPE",4); - if (retour==0) - { - fscanf(fic_in,"%s\n",COD_PIX); - retour=1; - } - else - sprintf(COD_PIX,"UND"); - pch0=cai_En_majuscule( COD_PIX ); - -/* Verification si type de codage reconnu */ - reconnaissance_type = cai_istyp_connu(pch0); -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte de l'information INTEL ou IEEE*/ -/* en lecture et ecriture dans l'entete .hd */ -/*****************************************************************************/ - if (retour !=0) fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"SENSCODAGE",10); - if (retour!=0) - { -/* Si absent, pas d'inversion */ - image1->INV_OCTETS =0; - sprintf((char *)image1->SENS_COD,type_machine); - } - else - { - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"IEEE",4); - if (retour==0) - sprintf((char *)image1->SENS_COD,"BE"); - else - sprintf((char *)image1->SENS_COD,"LE"); - cmp = strncmp(type_machine,image1->SENS_COD,2); - if (cmp!=0) - image1->INV_OCTETS =1; - else - image1->INV_OCTETS =0; - } - } - } - } - } - } - } -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in !=NULL) fclose(fic_in); - - if (iret !=0) - { -/*.................................. - Initialisation du nombre d'octets par pixel - ........................................................*/ - if ((nbbit%8)==0) - *nboct_pix=(int)(nbbit/8); - else - *nboct_pix=(int)((nbbit/8)+1); - image1->NB_BITS_PIX=nbbit; - - if (reconnaissance_type != -1) - { - sprintf(image1->COD_PIX,"%s",COD_PIX); - } - else - { - sprintf(image1->COD_PIX,"UND"); - - if (*nboct_pix==1) - sprintf(image1->COD_PIX,"OCT"); - else if (*nboct_pix==2) - sprintf(image1->COD_PIX,"I2"); - else if (*nboct_pix==4) - { - retour=strncmp(COD_PIX,"I4",2); - if (retour==0) - sprintf(image1->COD_PIX,"I4"); - else - { - retour=strncmp(COD_PIX,"R4",2); - if (retour==0) - sprintf(image1->COD_PIX,"R4"); - } - } - else if (*nboct_pix==8) - { - sprintf(image1->COD_PIX,"R8"); - } - } - -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - if ((long int)strlen(repert)!= 0) - { - sprintf(nom_fic_canal,"%s/%s.bip",repert,nom_image); - } - else - { - sprintf(nom_fic_canal,"%s.bip",nom_image); - } -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : FA : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - retour = stat ( nom_fic_canal , &buf_stat ); - if ( retour != 0 ) - { - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.BIP",repert,nom_image); - } - else - { - sprintf(nom_fic_canal,"%s.BIP",nom_image); - } - } - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - num=open(nom_fic_canal,O_RDWR|O_BINARY,0); - if (num!= -1) - { - - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_image,"%s",deb); - deb=deb+100; - sscanf(nom_image,"%s",deb1); - deb1=deb1+100; - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=0; - } - } - else - iret=0; - } - } - if (iret == 0) - { - return (NULL); - } - else - { - return(image1); - } - -} -/* - Fin de l'operation cai_ouvre_modifie_bip -*/ diff --git a/Utilities/CAI/cai_dll/src/cai_bsq.c b/Utilities/CAI/cai_dll/src/cai_bsq.c deleted file mode 100755 index ff5446f033..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_bsq.c +++ /dev/null @@ -1,2009 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_bsq.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format bsq */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : fevrier 1995 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 3.3: DM : optimisation des acces */ -/*****************************************************************************/ -/* MOD : VERSION : 4.0: DM : traitement des images en double precision */ -/* en lecture, ecriture et modification */ -/*****************************************************************************/ -/* MOD : VERSION : 4.1 : FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : FA : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : test sur fclose pour PC/LINUX */ -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : DM : Maj du tag TYPE lorsque l'image est codée */ -/* en reel et que l'utilisateur le precise dans le param "label" */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte des I2,I4,UI2,UI4 et R8 */ -/* en lecture et ecriture */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte de l'information INTEL ou IEEE*/ -/* en lecture et ecriture dans l'entete .hd */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <stdlib.h> -# include <sys/types.h> -# include <unistd.h> -# include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> -#include <errno.h> - -#define _CAI_IMAGE -#define IN_CAI_BSQ - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_bsq.c,v 1.12 01/05/31 10:46:59 cmf Exp $"; - -extern char *getenv(); - - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_bsq */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format bsq */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_bsq(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_bsq (S) (long int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -long int cai_liste_ima_bsq (char *repert, - char ***tab_ima) - -{ - - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - - struct dirent *dp; /* structure resultat de la fonction readdir */ - - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - char *pch2,*pch3; /* pointeurs sur chaine de caracteres */ - char car; /* variable de travail */ - int nb_ima; /* nombre d'images bsq identifiees */ - int i; /* indice de boucle */ - long int diff,Long; - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - dirp=opendir(repert); - - if(dirp!=NULL) - { - - -/*...................................... - - premiere passe pour comptabiliser les images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE BSQ_CNES - (EXTENSION =.hd) - ..........................................*/ - while((dp=readdir(dirp))!=NULL) - { - pch3=dp->d_name; - Long=(long int)strlen(dp->d_name); - - car='.'; - pch0=strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='h'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='d'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - diff=(long int)(pch2-pch3+1); - if(Long==diff) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - nb_ima=nb_ima+1; - } - } - } -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - else - { - car='H'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='D'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - diff=(long int)(pch2-pch3+1); - if(Long==diff) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - nb_ima=nb_ima+1; - } - } - } - } - } - } - (void)closedir(dirp); - -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT BSQ - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE BSQ_CNES - (EXTENSION =.hd) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - while((dp=readdir(dirp))!=NULL) - { - pch3=dp->d_name; - Long=(long int)strlen(dp->d_name); - - car='.'; - pch0=strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='h'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='d'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - diff=(long int)(pch2-pch3+1); - if(Long==diff) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - } -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - else - { - car='H'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='D'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - diff=(long int)(pch2-pch3+1); - if(Long==diff) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - } - } - - } - } - - (void)closedir(dirp); - - - } - else - { - /* repertoire inexistant */ - nb_ima=-1; - } - return(nb_ima); - -} - -/* Fin de l'operation cai_liste_ima_bsq -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_bsq */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format bsq */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_bsq (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_bsq (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_lecture_bsq(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) -{ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - long int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - char label[80]; /* contient un enregistrement du fichier */ - int nbplan; /* nombre de canaux dans le fichier en-tete */ - int nbbit; /* nb de bits par pixel du fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines*/ - char *deb,*deb1,*pch0; /* pointeurs sur chaine de caracteres */ - char car[4]; /* indice du canal traite */ - int i,num,IndExtens; /* indice */ - char Extens[25]; /* Extension possible du fichier */ - char COD_PIX[5]; /* contient le type de codage du pixel */ - char *type_machine; /* ordre rangement octets machine de travail*/ - struct stat buf_stat; /* structure decrivant status de fichier */ - int cmp; /* retour de comparaison de chaine */ - int reconnaissance_type; - char CAN[2]; - FILE *fic_in; /* pointeur sur descripteur de fichier */ - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - IndExtens = 0; - pch0=NULL; - reconnaissance_type = -1; - - /*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - type_machine = cai_test_pFpf(); - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*****************************************************************************/ -/* MOD : VERSION : 4.1 : FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_lecture"); - } - else - { -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - - pch0 = strstr(nom_image,"."); - if (pch0 != NULL) - { - *pch0 = '\0'; - pch0=pch0 + 1; - sprintf(Extens,"%s",pch0); - if (strcmp(Extens,"hd")!=0) - IndExtens=1; - } - nom_fic[0]='\0'; - if ((long int)strlen(repert)!= 0) - { - sprintf(nom_fic,"%s/%s.hd",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.hd",nom_image); - } - sprintf(image1->NOM_IMAGE,"%s/%s",repert,nom_image); -/*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=NULL; - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - nom_fic[0]='\0'; - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.HD",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.HD",nom_image); - } - sprintf(image1->NOM_IMAGE,"%s/%s",repert,nom_image); - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete BSQ-CNES"); - } - } - if (iret !=0) - { -/*.................................... - Decodage des informations TYPE - ............................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"TYPE",4); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne TYPE dans %s", - nom_fic); - iret=0; - } - else - { - fscanf(fic_in,"%s\n",COD_PIX); - pch0=cai_En_majuscule( COD_PIX ); - -/* Verification si type de codage reconnu */ - reconnaissance_type = cai_istyp_connu(pch0); - -/*.................................. - Decodage du label - ......................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"LABEL",5); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne LABEL dans %s", - nom_fic); - - iret=0; - } - else - { - fgets(image1->COMMENT,80,fic_in); - image1->COMMENT[strlen(image1->COMMENT)-1]='\0'; - - /*........................................ - Decodage du nombre de canaux - .........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"CHANNELS",8); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne CHANNELS dans %s", - nom_fic); - - iret=0; - } - else - { - fscanf(fic_in,"%d\n",&nbplan); - -/*....................................... - Decodage du nombre de lignes - ........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"LINES",5); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne LINES dans %s", - nom_fic); - - iret=0; - } - else - { - fscanf(fic_in,"%d\n",nb_lig); - - -/*....................................... - Decodage du nombre de colonnes - ........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"COLUMNS",7); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne COLUMNS dans %s", - nom_fic); - - iret=0; - } - else - { - - fscanf(fic_in,"%d\n",nb_col); - -/*....................................... - Decodage du nombre de bits par pixel - ........................................*/ - fgets(label,80,fic_in); - retour=strncmp(label,"BITS PER PIXEL",14); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne BITS dans %s", - nom_fic); - - iret=0; - } - else - { - fscanf(fic_in,"%d\n",&nbbit); - image1->NB_BITS_PIX = nbbit; - -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte de l'information INTEL ou IEEE*/ -/* en lecture et ecriture dans l'entete .hd */ -/*****************************************************************************/ -/*.................................. - Decodage du sens de codage si présent - ......................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"SENSCODAGE",10); - if (retour!=0) - { -/* Si absent, pas d'inversion */ - image1->INV_OCTETS =0; - sprintf(image1->SENS_COD,type_machine); - } - else - { - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"IEEE",4); - if (retour==0) - sprintf(image1->SENS_COD,"BE"); - else - sprintf(image1->SENS_COD,"LE"); - cmp = strncmp(type_machine,image1->SENS_COD,2); - if (cmp!=0) - { - image1->INV_OCTETS =1; - } - else - { - image1->INV_OCTETS =0; - } - } - } - } - } - } - } - - } -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in!=NULL) - { - fclose(fic_in); - fic_in=NULL; - } - } - - if (iret !=0) - { -/*.................................. - Initialisation du nombre d'octets par pixel - ........................................................*/ - if ((nbbit%8)==0) - *nboct_pix=(int)(nbbit/8); - else - *nboct_pix=(int)((nbbit/8)+1); - - if (reconnaissance_type != -1) - { - sprintf(image1->COD_PIX,"%s",COD_PIX); - } - else - { - sprintf(image1->COD_PIX,"UND"); - - if (*nboct_pix==1) - sprintf(image1->COD_PIX,"OCT"); - else if (*nboct_pix==2) - sprintf(image1->COD_PIX,"I2"); - else if (*nboct_pix==4) - { - retour=strncmp(COD_PIX,"I4",2); - if (retour==0) - sprintf(image1->COD_PIX,"I4"); - else - { - retour=strncmp(COD_PIX,"R4",2); - if (retour==0) - sprintf(image1->COD_PIX,"R4"); - } - } - else if (*nboct_pix==8) - { - sprintf(image1->COD_PIX,"R8"); - } - } -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - if ((nbplan==1)&&(IndExtens==1)) - { -/* Verification de l'existence du fichier demande et ouverture */ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!= 0) - sprintf(nom_fic,"%s/%s.%s",repert,nom_image,Extens); - else - sprintf(nom_fic,"%s.%s",nom_image,Extens); - nom_fic_canal[0]='\0'; - sscanf(nom_fic,"%s",nom_fic_canal); - num=open(nom_fic_canal,O_RDONLY|O_BINARY,0); - if (num!= -1) - { - sprintf(deb,"%s.%s",nom_image,Extens); - deb=deb+100; - sprintf(deb1,"%s.%s",nom_image,Extens); - deb1=deb1+100; - } - image1->ACCES_CANAL_INT[*nb_can]=num; - image1->POS_OCTET[*nb_can]=0; - - *nb_can=*nb_can+1; - } - else - { -/*................................................... - recherche du nombre de canaux de l'image si pas d'extension donnee - ..........................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!= 0) - { - sprintf(nom_fic,"%s/%s.c",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.c",nom_image); - } - /*****************************************************************************/ -/* MOD : VERSION : 4.4 : FA : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - sprintf(nom_fic_canal,"%s1",nom_fic); - retour = stat ( nom_fic_canal , &buf_stat ); - if ( retour != 0 ) - { - sprintf(CAN,"C"); - if ((long int)strlen(repert)!= 0) - { - sprintf(nom_fic,"%s/%s.C",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.C",nom_image); - } - - } - else - sprintf(CAN,"c"); - for (i=1;i<CAI_NB_MAX_CAN;i=i+1) - { - nom_fic_canal[0]='\0'; - sprintf(nom_fic_canal,"%s%d",nom_fic,i); - num=open(nom_fic_canal,O_RDONLY|O_BINARY,0); - if (num!= -1) - { - if (*nb_can<CAI_NB_MAX_CAN) - { - sscanf(nom_image,"%s",deb); - strcat(deb,CAN); - sprintf(car,"%d",(*nb_can)+1); - strcat(deb,car); - deb=deb+100; - sscanf(nom_image,"%s",deb1); - strcat(deb1,CAN); - strcat(deb1,car); - deb1=deb1+100; - } - image1->ACCES_CANAL_INT[*nb_can]=num; - image1->POS_OCTET[*nb_can]=0; - - *nb_can=*nb_can+1; - } - } - if (*nb_can!=nbplan) - { - sprintf(CAI_ERREUR, - "incoherence au niveau du nombre de fichiers canaux dans %s", - nom_fic); - - iret=0; - } - } - } - } - if (iret == 0) - return (NULL); - else - return(image1); -} - -/* - Fin de l'operation cai_ouvre_lecture_bsq -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_bsq */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format bsq et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_bsq (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_bsq (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_creation_bsq(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig, - char *label) - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - int retour; /* retour de fonction */ - char car[4]; /* indice du canal traite */ - int i,num; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - char *type_machine; /* ordre rangement octets machine de travail*/ - int reconnaissance_type; - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1 : FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } - -/*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - type_machine = cai_test_pFpf(); - -/*................................................. - Constitution du nom du fichier entete et verification qu'il - n'existe pas deja - .................................................*/ - - nom_fic[0]='\0'; - if ((long int)strlen(repert)!= 0) - { - sprintf(nom_fic,"%s/%s.hd",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.hd",nom_image); - } - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s BSQ existe \n" , nom_image ); - goto ERREUR; - } - sprintf(image1->NOM_IMAGE,"%s/%s",repert,nom_image); -/*............................................................... - Pour chaque canal de l'image,constitution du nom de fichier correspondant - Verification qu'il n'existe pas deja - Ouverture du fichier en ecriture - .................................................................*/ - - for (i=0;i<*nb_can;i=i+1) - { - nom_fic_canal[0]='\0'; - sprintf(car,"%d",i+1); - if (i+1<10) - car[1]='\0'; - else - { - if (i+1<100) - car[2]='\0'; - else - car[3]='\0'; - } - - if ((long int)strlen(repert)!= 0) - { - sprintf(nom_fic_canal,"%s/%s.c%s",repert,nom_image,car); - } - else - { - sprintf(nom_fic_canal,"%s.c%s",nom_image,car); - } - - retour = stat ( nom_fic_canal , &buf_stat ); - - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s BSQ existe \n" , nom_image ); - goto ERREUR; - } - num = open(nom_fic_canal,O_RDWR|O_CREAT|O_BINARY,PERMS); - if (num == -1) - { - - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic_canal); - goto ERREUR; - } - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=0; - } - -/*...................................................... - Ouverture du fichier entete en ecriture - Ecriture du contenu - ..........................................................*/ - fic = fopen(nom_fic,"w"); - if (fic == NULL) - { - sprintf(CAI_ERREUR,"Erreur: Creation fichier %s impossible\n",nom_fic); - goto ERREUR; - } - - retour=fprintf ( fic , "TYPE\n"); - if (retour == 0) - { - sprintf(CAI_ERREUR,"Erreur: Ecriture %s impossible\n",nom_fic); - goto ERREUR; - } -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : Maj du tag TYPE lorsque l'utilisateur le */ -/* precise dans le param "label" */ -/*****************************************************************************/ -/* Verification si type de codage reconnu dans le label */ - reconnaissance_type = cai_istyp_connu(label); - if (reconnaissance_type == -1) - { - if (*nboct_pix==1) - sprintf ( image1->COD_PIX , "OCT" ); - else if (*nboct_pix==2) - sprintf ( image1->COD_PIX , "I2" ); - else if (*nboct_pix==4) - { -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : DM : Maj du tag TYPE lorsque l'image est codée */ -/* en reel et que l'utilisateur le precise dans le param "label" */ -/*****************************************************************************/ - if ((strcasecmp(label,"R4") == 0)|| - (strcasecmp(label,"FLOAT")== 0)|| - (strcasecmp(label,"REEL") == 0)) - sprintf ( image1->COD_PIX , "R4" ); - else - sprintf ( image1->COD_PIX , "I4" ); - } - else - sprintf ( image1->COD_PIX , "UND" ); - fprintf ( fic , "%s\n",image1->COD_PIX ); - } - else - { - sprintf ( image1->COD_PIX , "%s" ,label); - fprintf ( fic , "%s\n", label ); - } - fprintf ( fic , "LABEL\n" ); - fprintf ( fic , "%s\n" , label ); - fprintf ( fic , "CHANNELS\n" ); - fprintf ( fic , "%3d\n" , *nb_can ); - fprintf ( fic , "LINES\n" ); - fprintf ( fic , "%5d\n" , *nb_lig ); - fprintf ( fic , "COLUMNS\n" ); - fprintf ( fic , "%5d\n" , *nb_col ); - fprintf ( fic , "BITS PER PIXEL\n" ); - fprintf ( fic , "%2d\n" , (*nboct_pix)*8 ); - fprintf ( fic , "SENSCODAGE\n" ); - retour=strncmp(type_machine,"BE",2); - sprintf(image1->SENS_COD,"%s",type_machine); - if (retour == 0) - fprintf ( fic , "IEEE\n" ); - else - fprintf ( fic , "INTEL\n" ); - -/*************************************************/ -/* Fermeture du fichier */ -/*************************************************/ - - fclose ( fic ); - return (image1); - -ERREUR : - return(NULL); -} - -/* - Fin de l'operation cai_ouvre_creation_bsq -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_bsq */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image bsq */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_bsq(image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (lint): numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_bsq (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -CAI_OK_KO cai_lecture_canal_bsq(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) - -{ - - int num,i,j,k; /* variables de travail */ - long int pt_oct; /* position courante dans le fichier image */ - long int no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - long int lig; /* indice de boucle sur les lignes */ - long int oct_pix; /* nb octets par pixels */ - long int nb_oct; /* nb oct =1er octet a lire - position courante */ - long int oct_lig; /* nb oct. par ligne en considerant taille pixel */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - unsigned char *data_image2;/* pointeur donnees image pour inversion octets */ - int taille_image,Nb; /* taille en octets de l'image */ - long int n; -/*........................... - Initialisations diverses - ..........................*/ - - iret=CAI_OK; - num=(int)image1->ACCES_CANAL_INT[(*canal)-1]; - oct_pix=image1->NBOCT_PIX; - oct_lig=oct_pix*(image1->NB_COL); - -/*.......................................*/ -/* verification si lecture image entiere */ -/*.......................................*/ - if ((*nombre_lignes_lire==image1->NB_LIG)&&(*nombre_colonnes_lire==image1->NB_COL) - &&(*pas_ligne==1)&&(*pas_colonne==1)) - { - oct_lig=oct_pix*(image1->NB_COL)*(image1->NB_LIG); - - /* positionnement en debut de fichier */ - pt_oct=lseek(num,0L,0); - - /* lecture du canal complet */ - n=read(num,data_image,oct_lig); - if (n<=0) - { - iret=CAI_KO; - sprintf(CAI_ERREUR,"Erreur lecture donnee image BSQ dans %s", - image1->NOM_IMAGE); - - } - else - iret=CAI_OK; - } - else - { -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - buf_lec = (unsigned char *) malloc(oct_lig); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - } - else - { -/*.................... - Initialisation - ......................*/ - lig=*premiere_ligne; - i=1; - pch=data_image; - /*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i <= (*nombre_lignes_lire))&&(iret==CAI_OK)) - { - -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - no_oct=image1->POS_OCTET[(*canal)-1]+((lig-1)*oct_lig); - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture d'une ligne image - ................................................*/ - n=read(num,buf_lec,oct_lig); - if (n<=0) - { - iret=CAI_KO; - sprintf(CAI_ERREUR,"Erreur lecture donnee image BSQ %s", - image1->NOM_IMAGE); - - } - else - { -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - deb=buf_lec+((*premiere_colonne)-1)*oct_pix; - j=1; - while (j <= (*nombre_colonnes_lire)) - { - - for (k=0;k<oct_pix;k=k+1) - { - *(pch+k)=*(deb+k); - } - pch=pch+oct_pix; - j=j+1; - deb=deb+((*pas_colonne)*oct_pix); - } - - } - i=i+1; - lig=lig+(*pas_ligne); - - } - - free(buf_lec); - } - } -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte de l'information INTEL ou IEEE*/ -/* en lecture et ecriture dans l'entete .hd */ -/*****************************************************************************/ - - if ( (iret!= CAI_KO) && (image1->INV_OCTETS==1) && (oct_pix!=1) ) - { - taille_image = (*nombre_lignes_lire)*oct_pix*(*nombre_colonnes_lire); - data_image2 = NULL; - data_image2 = (unsigned char *) calloc(taille_image, - sizeof(unsigned char)); - if (data_image2 == NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoire cai_lecture_canal"); - iret=CAI_KO; - } - else - { - /*modification ordre selon nb octets par pixel*/ - swab( (void*)(data_image), (void*)(data_image2), taille_image); - - if (oct_pix!=2) - { - Nb = taille_image/2; - cai_inverser_tableau(data_image, data_image2,Nb); - } - else - for (i=0; i<taille_image;i++) - { - /*stockage dans data_image*/ - data_image[i] = data_image2[i]; - } - - if (data_image2!= NULL) free(data_image2); - } - } - - return(iret); - } -/* - Fin de l'operation cai_lecture_canal_bsq -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_bsq */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image bsq */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_bsq(image1, canal, */ -/* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (long int) : numero du canal a ecrire */ -/* premiere_ligne (E) (long int) : 1ere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (long int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (long int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_bsq (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ecriture_canal_bsq (CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) - -{ - - long int position_first_lig; /* position de la 1ere ligne a ecrire */ - long int position_courante; /* position courante dans le fichier */ - long int deplacement; /* deplacement a effectuer */ - int i_ligne; /* compteur de lignes */ - unsigned char *buff_lig; /* tableau contenant une ligne a ecrire */ - long int cr_write; /* code retour de write */ - int num; /* descripteur de fichier */ - int nboct_pix; /* nombre d'octets par pixel */ - int tot_pix; /* nb de pixels total a ecrire */ - -/* initialisations */ - -i_ligne = 0; -num = image1->ACCES_CANAL_INT[*canal-1]; -nboct_pix = image1->NBOCT_PIX; - -/*.......................................*/ -/* verification si ecriture image entiere */ -/*.......................................*/ - if ((*nombre_lignes_ecrire==image1->NB_LIG)&& - (*nombre_colonnes_ecrire==image1->NB_COL)) - { - tot_pix=nboct_pix*(image1->NB_COL)*(image1->NB_LIG); - - /* positionnement en debut de fichier */ - position_first_lig=lseek(num,0L,0); - - /* ecriture du canal complet */ - cr_write = write ( num , data_image,tot_pix); - if (cr_write != tot_pix) - { - sprintf(CAI_ERREUR,"Erreur ecriture donnee image BSQ %s", - image1->NOM_IMAGE); - - goto ERREUR; - } - } - else - { - -/********************************************************/ -/* Calcul de la position de la premiere ligne a ecrire */ -/********************************************************/ - -position_first_lig =(long int) ( image1->POS_OCTET[*canal-1]+ - (( *premiere_ligne - 1) * (*nombre_colonnes_ecrire) - * nboct_pix)); - - -/********************************************************/ -/* Recuperation de la position courante */ -/********************************************************/ - -position_courante = lseek ( num , 0L , 1 ); - - -/********************************************************/ -/* Deplacement jusqu'a la premiere ligne a ecrire */ -/********************************************************/ - -deplacement = position_first_lig - position_courante; -lseek ( num , deplacement , 1 ); - -/********************************************************/ -/* TANT QUE il y a des lignes a ecrire */ -/********************************************************/ -while (i_ligne < (*nombre_lignes_ecrire)) -{ - -/********************************************************/ -/* extraction de la ligne du tableau */ -/********************************************************/ - - buff_lig = data_image + (*nombre_colonnes_ecrire) * nboct_pix * i_ligne; - -/********************************************************/ -/* ecriture de la ligne */ -/********************************************************/ - - cr_write = write ( num , buff_lig , - (*nombre_colonnes_ecrire) * nboct_pix ); - if ( cr_write != (*nombre_colonnes_ecrire)*nboct_pix ) - { - sprintf( CAI_ERREUR , "Erreur ecriture canal image bsq_cnes %s", - image1->NOM_IMAGE); - - goto ERREUR; - } - -/********************************************************/ -/* incrementation du nombre de lignes */ -/********************************************************/ - - i_ligne++; -/********************************************************/ -/* FIN TANT QUE */ -/********************************************************/ - } -} - - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} - -/* - Fin de l'operation cai_ecriture_canal_bsq -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_bsq */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format bsq et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_bsq(image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_bsq (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_bsq (CAI_IMAGE *image1) - -{ - int iret; /* code retour de l'operation */ - int i_can; /* indice du canal a fermer */ - int num; /* descripteur du fichier a fermer */ - - iret=CAI_OK; -/*............................................. - Fermeture de tous les canaux - .............................................*/ - for (i_can=0;i_can<image1->NB_CANAUX;i_can=i_can+1) - { - - num=image1->ACCES_CANAL_INT[i_can]; - if (num>0) close(num); - } - - return (iret); -} - -/* - Fin de l'operation cai_ferme_bsq -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_bsq */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en bsq et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_bsq(repertoire,nom_ima) */ /* ------------------ */ -/* repertoire (E) (char *) : repertoire de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_bsq (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_dest_ima_bsq ( char *repertoire , - char *nom_ima ) - -{ -int i_can; /* compteur de canaux */ -long int iret; /* code retour fonction fermetrue lecture */ -char str_num_canal[3]; /* suffixe numero du canal */ -char nom_fic_entete[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ -char nom_fic_canal[1024]; /* nom du fichier canal a detruire */ - -long int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ - -CAI_IMAGE *image1; /* structure ouverture image */ -int nb_can; /* nombre de canaux de l'image */ -int nboct_pix; /* nombre d'octets par pixel image */ -int nb_col; /* nombre de colonnes de l'image */ -int nb_lig; /* nombre de lignes de l'image */ - -/************************************************/ -/* Constitution du nom du fichier d'entete */ -/************************************************/ -if ((long int)strlen(repertoire)!= 0) -{ - sprintf(nom_ima_complet,"%s/%s",repertoire,nom_ima); -} -else -{ - sprintf(nom_ima_complet,"%s",nom_ima); -} - sprintf(nom_fic_entete ,"%s.hd", nom_ima_complet); -/************************************************/ -/* Extraction des caracteristiques de l'image */ -/* du fichier entete par l'appel a la fonction */ -/* cai_ouvre_lecture_bsq */ -/************************************************/ - - image1 = cai_ouvre_lecture_bsq ( repertoire,nom_ima, &nb_can ,&nboct_pix , - &nb_col , &nb_lig ); - if ( image1 == NULL) goto ERREUR; - - image1->NB_CANAUX=nb_can; - image1->NB_COL=nb_col; - image1->NB_LIG=nb_lig; - image1->NBOCT_PIX=nboct_pix; - - iret=cai_ferme_bsq(image1); - -/************************************************/ -/* Destruction du fichier d'entete */ -/************************************************/ - -cr_stat = stat ( nom_fic_entete , &buf_stat ); -if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); - - -/************************************************/ -/* Constitution un a un des noms des fichiers */ -/* canaux et destruction */ -/************************************************/ - -for ( i_can = 0 ; i_can < nb_can ; i_can++ ) -{ - sprintf(nom_fic_canal,"%s.c%d",nom_ima_complet,i_can+1); - cr_stat = stat ( nom_fic_canal , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_canal ); - sprintf(nom_fic_canal,"%s.C%d",nom_ima_complet,i_can+1); - cr_stat = stat ( nom_fic_canal , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_canal ); -} - - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} -/* - Fin de l'operation cai_dest_ima_bsq -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_modif_nbbitspix_bsq */ -/* ---------- */ -/* */ -/* ROLE : permet de modifier le nombre de bits significatifs par pixel */ -/* ----- dans l'entete de fichier (.hd) */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_modif_nbbitspix_bsq(image1,NbBitsPix) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* NbBitsPix (E) (long int) : nb de bits significatifs par pixel */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_modif_nbbitspix_bsq(CAI_IMAGE *image1,int NbBitsPix) - -{ - char fichierE[1024]; /* fichier a traiter */ - FILE *fic; /* pointeur descripteur fichier */ - int retour; - - -/* Ouverture du fichier d'entete */ - - fichierE[0]='\0'; - sprintf(fichierE,"%s.hd",image1->NOM_IMAGE); - fic = fopen(fichierE,"w"); - if (fic == NULL) - { - sprintf(CAI_ERREUR, - "Erreur: Modification fichier %s impossible\n",fichierE); - goto ERREUR; - } - -/* Modification du fichier d'entete */ - rewind(fic); - fprintf ( fic , "TYPE\n"); - fprintf ( fic , "%s\n",image1->COD_PIX ); - fprintf ( fic , "LABEL\n" ); - fprintf ( fic , "%s\n" ,image1->COMMENT); - fprintf ( fic , "CHANNELS\n" ); - fprintf ( fic , "%3d\n" , image1->NB_CANAUX); - fprintf ( fic , "LINES\n" ); - fprintf ( fic , "%5d\n" , image1->NB_LIG); - fprintf ( fic , "COLUMNS\n" ); - fprintf ( fic , "%5d\n" , image1->NB_COL ); - fprintf ( fic , "BITS PER PIXEL\n" ); - fprintf ( fic , "%2d\n" , NbBitsPix ); - fprintf ( fic, "SENSCODAGE\n"); - retour=strncmp(image1->SENS_COD,"BE",2); - if (retour == 0) - fprintf ( fic , "IEEE\n" ); - else - fprintf ( fic , "INTEL\n" ); - - fclose ( fic ); - - return(CAI_OK); - -ERREUR : - return(CAI_KO); -} -/* - Fin de l'operation cai_modif_nbbitspix_bsq -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_bsq */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture-ecriture d'une image au format */ -/* ----- bsq et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_bsq (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_bsq (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_modifie_bsq(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - - -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - char label[80]; /* contient un enregistrement du fichier */ - int nbplan; /* nombre de canaux dans le fichier en-tete */ - int nbbit; /* nb de bits par pixel du fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines*/ - char *deb,*deb1,*pch0; /* pointeurs sur chaine de caracteres */ - char car[4]; /* indice du canal traite */ - int i,num,IndExtens; /* indice */ - char Extens[25]; /* Extension possible du fichier */ - struct stat buf_stat; /* structure decrivant status de fichier */ - char *type_machine; /* ordre rangement octets machine de travail*/ - int cmp; /* retour de comparaison de chaine */ - int reconnaissance_type; - char CAN[2]; - char COD_PIX[5]; - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - IndExtens = 0; - pch0=NULL; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - - - /*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - type_machine = cai_test_pFpf(); - -/*****************************************************************************/ -/* MOD : VERSION : 4.1 : FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_modifie"); - } - else - { -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - pch0 = strstr(nom_image,"."); - if (pch0 != NULL) - { - *pch0 = '\0'; - pch0=pch0 + 1; - sprintf(Extens,"%s",pch0); - if (strcmp(Extens,"hd")!=0) - IndExtens=1; - } - nom_fic[0]='\0'; - if ((long int)strlen(repert)!= 0) - { - sprintf(nom_fic,"%s/%s.hd",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.hd",nom_image); - } - sprintf(image1->NOM_IMAGE,"%s/%s",repert,nom_image); -/*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=NULL; - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { - iret=0; - sprintf(CAI_ERREUR,"Erreur ouverture fichier entete BSQ-CNES %s", - nom_fic); - } - else - { -/*.................................... - Decodage des informations TYPE - ............................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"TYPE",4); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne TYPE dans %s", - nom_fic); - iret=0; - } - else - { - fscanf(fic_in,"%s\n",COD_PIX); - pch0=cai_En_majuscule( COD_PIX ); - -/* Verification si type de codage reconnu */ - reconnaissance_type = cai_istyp_connu(pch0); - -/*.................................. - Decodage du label - ......................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"LABEL",5); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne LABEL dans %s", - nom_fic); - iret=0; - } - else - { - fgets(image1->COMMENT,80,fic_in); - image1->COMMENT[strlen(image1->COMMENT)-1]='\0'; - - /*........................................ - Decodage du nombre de canaux - .........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"CHANNELS",8); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne CHANNELS dans %s", - nom_fic); - - iret=0; - } - else - { - fscanf(fic_in,"%d\n",&nbplan); - -/*....................................... - Decodage du nombre de lignes - ........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"LINES",5); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne LINES dans %s", - nom_fic); - iret=0; - } - else - { - fscanf(fic_in,"%d\n",nb_lig); - - -/*....................................... - Decodage du nombre de colonnes - ........................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"COLUMNS",7); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne COLUMNS dans %s", - nom_fic); - iret=0; - } - else - { - - fscanf(fic_in,"%d\n",nb_col); - -/*....................................... - Decodage du nombre de bits par pixel - ........................................*/ - fgets(label,80,fic_in); - retour=strncmp(label,"BITS PER PIXEL",14); - if (retour!=0) - { - sprintf(CAI_ERREUR, - "Informations incoherentes ligne BITS dans %s", - nom_fic); - iret=0; - } - else -{ - fscanf(fic_in,"%d\n",&nbbit); - image1->NB_BITS_PIX = nbbit; - -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte de l'information INTEL ou IEEE*/ -/* en lecture et ecriture dans l'entete .hd */ -/*****************************************************************************/ -/*.................................. - Decodage du sens de codage si présent - ......................................*/ - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"SENSCODAGE",10); - if (retour!=0) - { -/* Si absent, pas d'inversion */ - image1->INV_OCTETS =0; - sprintf(image1->SENS_COD,type_machine); - } - else - { - fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"IEEE",4); - if (retour==0) - sprintf(image1->SENS_COD,"BE"); - else - sprintf(image1->SENS_COD,"LE"); - cmp = strncmp(type_machine,image1->SENS_COD,2); - if (cmp!=0) - { - image1->INV_OCTETS =1; - } - else - { - image1->INV_OCTETS =0; - } - } - } - } - } - } - } - - } -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in !=NULL) - { - fclose(fic_in); - fic_in=NULL; - } - } - - if (iret !=0) - { -/*.................................. - Initialisation du nombre d'octets par pixel - ........................................................*/ - if ((nbbit%8)==0) - *nboct_pix=(int)(nbbit/8); - else - *nboct_pix=(int)((nbbit/8)+1); - - if (reconnaissance_type != -1) - sprintf(image1->COD_PIX,"%s",COD_PIX); - else - { - sprintf(image1->COD_PIX,"UND"); - - if (*nboct_pix==1) - sprintf(image1->COD_PIX,"OCT"); - else if (*nboct_pix==2) - sprintf(image1->COD_PIX,"I2"); - else if (*nboct_pix==4) - { - retour=strncmp(COD_PIX,"I4",2); - if (retour==0) - sprintf(image1->COD_PIX,"I4"); - else - { - retour=strncmp(COD_PIX,"R4",2); - if (retour==0) - sprintf(image1->COD_PIX,"R4"); - } - - } - else if (*nboct_pix==8) - sprintf(image1->COD_PIX,"R8"); - } - -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - if ((nbplan==1)&&(IndExtens==1)) - { -/* Verification de l'existence du fichier demande et ouverture */ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!= 0) - sprintf(nom_fic,"%s/%s.%s",repert,nom_image,Extens); - else - sprintf(nom_fic,"%s.%s",nom_image,Extens); - nom_fic_canal[0]='\0'; - sscanf(nom_fic,"%s",nom_fic_canal); - num=open(nom_fic_canal,O_RDWR|O_BINARY,0); - if (num!= -1) - { - sprintf(deb,"%s.%s",nom_image,Extens); - deb=deb+100; - sprintf(deb1,"%s.%s",nom_image,Extens); - deb1=deb1+100; - } - image1->ACCES_CANAL_INT[*nb_can]=num; - image1->POS_OCTET[*nb_can]=0; - *nb_can = *nb_can + 1; - } - else - { -/*................................................... - recherche du nombre de canaux de l'image si pas d'extension donnee - ..........................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!= 0) - { - sprintf(nom_fic,"%s/%s.c",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.c",nom_image); - } - sprintf(nom_fic_canal,"%s1",nom_fic); - retour = stat ( nom_fic_canal , &buf_stat ); - if ( retour != 0 ) - { - sprintf(CAN,"C"); - if ((long int)strlen(repert)!= 0) - { - sprintf(nom_fic,"%s/%s.C",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.C",nom_image); - } - - } - else - sprintf(CAN,"c"); - - for (i=1;i<CAI_NB_MAX_CAN;i=i+1) - { - nom_fic_canal[0]='\0'; - sprintf(nom_fic_canal,"%s%d",nom_fic,i); - num=open(nom_fic_canal,O_RDWR|O_BINARY,0); - if (num!= -1) - { - if (*nb_can<CAI_NB_MAX_CAN) - { - sscanf(nom_image,"%s",deb); - strcat(deb,CAN); - sprintf(car,"%d",(*nb_can)+1); - strcat(deb,car); - deb=deb+100; - sscanf(nom_image,"%s",deb1); - strcat(deb1,CAN); - strcat(deb1,car); - deb1=deb1+100; - } - image1->ACCES_CANAL_INT[*nb_can]=num; - image1->POS_OCTET[*nb_can]=0; - - *nb_can=*nb_can+1; - } - } - if (*nb_can!=nbplan) - { - sprintf(CAI_ERREUR, - "incoherence au niveau du nombre de fichiers canaux dans %s", - nom_fic); - - iret=0; - } - } - } - } - if (iret == 0) - { - return (NULL); - } - else - { - return(image1); - } - -} - -/* - Fin de l'operation cai_ouvre_modifie_bsq -*/ diff --git a/Utilities/CAI/cai_dll/src/cai_fonctions.c b/Utilities/CAI/cai_dll/src/cai_fonctions.c deleted file mode 100755 index 3acec11676..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_fonctions.c +++ /dev/null @@ -1,2499 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_fonctions.c */ -/* ------- */ -/* */ -/* ROLE : contient l'interface entre l'utilisateur et la Couche Acces */ -/* ------- Image, avec les fonctionnalites de premier niveau */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : fevrier 1995 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 2 : DM : optimisation */ -/*****************************************************************************/ -/* MOD : VERSION : 4.0 : DM : integration du format GESSIMU (sept 1999) */ -/* MOD : VERSION : 4.0 : DM : integration du format GRILLES (sept 1999) */ -/*****************************************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : FA : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : integration des formats SPOT1A4 et SPOT5 */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modification lecture des repertoires pour PC */ -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : suppression du format multiscope, modif SPOT5 */ -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : DM : integration du format RADAR_CNES */ -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : FA : avertissement des formats non disponibles */ -/* en modification */ -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : DM: Sous Cygwin separateur='/' ou '\' */ -/*****************************************************************************/ -/* MOD : VERSION : 5.3 : DM : prise en compte du format bandeau */ -/*****************************************************************************/ - - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ -#include <stdio.h> -#include <sys/types.h> -#include <string.h> -#include <dirent.h> -#include <stdlib.h> - -#define _CAI_IMAGE -#define IN_CAI_FONC - -#include "cai_image.h" - - char IND_GRILLES; /* indicateur si image ou grille */ - char IND_SPOT; /* indicateur si SPOT1A4 (1),SPOT5BIL (B),SPOT5TIF(T) */ -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_fonctions.c,v 1.13 01/02/15 14:24:58 cmf Exp $"; - - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_format */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des formats reconnus par la Couche Image */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_format(tab_format,tab_suffixe) */ -/* ----------------- */ -/* */ -/* tab_format[] (S) (char **) : pointeur sur tableau des formats connus*/ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* tab_suffixe[] (S) (char **) : pointeur sur le tableau des suffixes */ -/* des formats reconnus : 1 pour 1 canal */ -/* 2 pour plusieurs canaux */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_format(S) (long int) : nombre de formats reconnus par CAI */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -long int cai_liste_format(char ***tab_format,char **(tab_suffixe[2])) - -{ -long int nb; /* code retour de la fonction cai_liste_format */ -long int i,j; - -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES FORMATS DISPONIBLES - ET LA LISTE DES SUFFIXES CORRESPONDANT - ......................................*/ - nb=CAI_NB_FORMAT; - *tab_format = (char **) calloc(nb,sizeof(char *)); - tab_suffixe[0] = (char **) calloc(nb,sizeof(char *)); - tab_suffixe[1] = (char **) calloc(nb,sizeof(char *)); - - - - - for (i=0;i<nb;i++) - { - (*tab_format)[i]=(char *)calloc(1,20); - strcpy((*tab_format)[i],CAI_NOM_FORMAT[i]); - for (j=0;j<2;j++) - { - tab_suffixe[j][i]=(char *)calloc(1,8); - strcpy(tab_suffixe[j][i],CAI_SUF_FORMAT[j][i]); - } - - } -return(nb); - -} -/* Fin de l'operation cai_liste_format -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_image */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images d'un format donne */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_image(repert,type_image,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* type_image (E) (char *) : format des images a lister */ -/* tab_ima[] (S) (char **) : pointeur sur tableau des images listees*/ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_image(S) (long int) : =-1 repertoire inexistant */ -/* =-2 format non pris en compte */ -/* =>0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -long int cai_liste_image(char *repert, - char *type_image, - char ***tab_ima) - - -{ - long int nb; /* code retour de la fonction cai_liste_image */ - long int (*comp) ( ); /* pointeur sur fonction */ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - -/*.................... - Initialisations - ..................*/ - nb=0; - CAI_ERREUR[0]='\0'; - IND_GRILLES = '\0'; - IND_SPOT = '\0'; -/*.............................................. - Verification existence repertoire demande - ...............................................*/ - dirp=opendir(repert); - if (dirp ==0) - { - /* repertoire demande inexistant */ - nb=-1; - sprintf(CAI_ERREUR,"repertoire %s inexistant \n",repert); - - } - else - { -/*.............................................. - Initialisation d'un pointeur sur fonction dependant du format des images - ................................................ */ - - if (strcasecmp(type_image,"INRIA") == 0) - { - comp = (cai_liste_ima_inria) ; - } - - else if (strcasecmp(type_image,"ONERA") == 0) - { - comp = (cai_liste_ima_onera) ; - } - - else if (strcasecmp(type_image,"BSQ") == 0) - { - comp = (cai_liste_ima_bsq) ; - } - - else if (strcasecmp(type_image,"BIP") == 0) - { - comp = (cai_liste_ima_bip) ; - } -#ifdef _HDF16 - else if (strncasecmp(type_image,"HDF",3) == 0) - { - comp = (cai_liste_ima_hdf16) ; - } -#endif - - else if (strcasecmp(type_image,"BIL") == 0) - { - comp = (cai_liste_ima_bil) ; - } - - else if (strcasecmp(type_image,"LUM") == 0) - { - comp = (cai_liste_ima_lum) ; - } - - else if (strcasecmp(type_image,"GESSIMU") == 0) - { - comp = (cai_liste_ima_gessimu) ; - } - - else if (strcasecmp(type_image,"GDB") == 0) - { - IND_GRILLES = 'B'; - comp = (cai_liste_ima_grilles) ; - } - - else if (strcasecmp(type_image,"GDR") == 0) - { - IND_GRILLES = 'R'; - comp = (cai_liste_ima_grilles) ; - } - - else if (strcasecmp(type_image,"TIFF") == 0) - { - comp = (cai_liste_ima_tiff) ; - } - - else if (strcasecmp(type_image,"RASTERFILE") == 0) - { - comp = (cai_liste_ima_sun_raster) ; - } - else if (strcasecmp(type_image,"JPEG") == 0) - { - comp = (cai_liste_ima_jpeg) ; - } - else if (strcasecmp(type_image,"SPOT1A4") == 0) - { - IND_SPOT = '1'; - comp = (cai_liste_ima_spot) ; - } - else if (strcasecmp(type_image,"SPOT5TIF") == 0) - { - IND_SPOT = 'T'; - comp = (cai_liste_ima_spot) ; - } - else if (strcasecmp(type_image,"SPOT5BIL") == 0) - { - IND_SPOT = 'B'; - comp = (cai_liste_ima_spot) ; - } - else if (strcasecmp(type_image,"RADAR") == 0) - { - comp = (cai_liste_ima_radar) ; - } - else if (strcasecmp(type_image,"BANDEAU") == 0) - { - comp = (cai_liste_ima_bandeau) ; - } - - else - { - - /* format non connu de la Couche Acces Image */ - nb = -2; - sprintf(CAI_ERREUR,"format %s non reconnu \n",type_image); - - } - - /*........................................... - Appel de la fonction pointee par comp avec la liste des parametres - suivants : - repertoire de stockage des images - pointeur sur tableau contenant la liste des images a lister - ......................................................................*/ - closedir(dirp); - if ( nb == 0 ) - { - if (IND_GRILLES == '\0') - { - if (IND_SPOT == '\0') - nb = (*comp)(repert,tab_ima); - else - nb = (*comp)(IND_SPOT,repert,tab_ima); - } - else - nb = (*comp)(IND_GRILLES,repert,tab_ima); - } - } - IND_GRILLES = '\0'; - IND_SPOT = '\0'; - return (nb); - -} -/* Fin de l'operation cai_liste_image -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_image */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image d'un format donne */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_image (nom_image, */ -/* ---------------- type_image, */ -/* nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* type_image (E) (char *) : format de l'image a ouvrir */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_image (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V3 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_lecture_image (char *nom_image, - char *type_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ - - int nb; /* indicateur d'erreurs rencontres */ - CAI_IMAGE *image1; /* descripteur de fichier retour fonction */ - CAI_IMAGE *(*comp) ( ); /* pointeur sur fonction */ - char repert[1024]; /* repertoire de stockage de l'image */ - char image[1024]; /* nom de l'image a ouvrir en lecture */ - char format[20]; /* format de stockage de l'image a lire */ - long int i,ind; /* variables de travail */ - char *pch,*deb; /* pointeurs de travail */ - long int nb1,nb2; /* indice de longueur significative */ - char car; /* variable de travail */ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - CAI_OK_KO icr; /* Compte-rendu des fonctions DA */ - -/*...................... - Initialisations - .......................*/ - nb=1; - strcpy(format,type_image); - CAI_ERREUR[0]='\0'; - IND_GRILLES = '\0'; - IND_SPOT = '\0'; - -/*................................................... - Recherche du type de fichier si reconnaissance automatique demande - ...................................................*/ - if (strcasecmp(format,"AUTO")== 0) - { - for( i = 0 ; i< CAI_NB_EXTENSIONS ; i++) - { - if(strstr(nom_image,CAI_SUFFIXES[i]) != NULL ) - { - ind=CAI_NUMEROS[i]; - strcpy(format,CAI_NOM_FORMAT[ind]); - } - } - } - - -/*.............................................. - Initialisation d'un pointeur sur fonction dependant du format des images - ................................................ */ - - if (strcasecmp(format,"INRIA") == 0) - { - comp = (cai_ouvre_lecture_inria) ; - } - - else if (strcasecmp(format,"ONERA") == 0) - { - comp = (cai_ouvre_lecture_onera) ; - } - - else if (strcasecmp(format,"BSQ") == 0) - { - comp = (cai_ouvre_lecture_bsq) ; - } - - else if (strcasecmp(format,"BIP") == 0) - { - comp = (cai_ouvre_lecture_bip) ; - } -#ifdef _HDF16 - else if (strncasecmp(format,"HDF",3) == 0) - { - comp = (cai_ouvre_lecture_hdf16) ; - } -#endif - - else if (strcasecmp(format,"BIL") == 0) - { - comp = (cai_ouvre_lecture_bil) ; - } - - else if (strcasecmp(format,"LUM") == 0) - { - comp = (cai_ouvre_lecture_lum) ; - } - - else if (strcasecmp(format,"GESSIMU") == 0) - { - comp = (cai_ouvre_lecture_gessimu) ; - } - - else if (strcasecmp(format,"GDB") == 0) - { - IND_GRILLES = 'B'; - comp = (cai_ouvre_lecture_grilles) ; - } - - else if (strcasecmp(format,"GDR") == 0) - { - IND_GRILLES = 'R'; - comp = (cai_ouvre_lecture_grilles) ; - } - - else if (strcasecmp(format,"TIFF") == 0) - { - comp = (cai_ouvre_lecture_tiff) ; - } - - else if (strcasecmp(format,"RASTERFILE") == 0) - { - comp = (cai_ouvre_lecture_sun_raster) ; - } - else if (strcasecmp(format,"JPEG") == 0) - { - comp = (cai_ouvre_lecture_jpeg) ; - } - - else if (strcasecmp(type_image,"SPOT1A4") == 0) - { - IND_SPOT = '1'; - comp = (cai_ouvre_lecture_spot) ; - } - else if (strcasecmp(type_image,"SPOT5TIF") == 0) - { - IND_SPOT = 'T'; - comp = (cai_ouvre_lecture_spot) ; - } - else if (strcasecmp(type_image,"SPOT5BIL") == 0) - { - IND_SPOT = 'B'; - comp = (cai_ouvre_lecture_spot) ; - } - else if (strcasecmp(format,"RADAR") == 0) - { - comp = (cai_ouvre_lecture_radar) ; - } - else if (strcasecmp(format,"BANDEAU") == 0) - { - comp = (cai_ouvre_lecture_bandeau) ; - } - - else - { - - /* format non connu de la Couche Acces Image */ - nb = 0; - sprintf(CAI_ERREUR,"format %s non reconnu \n",format); - - } - /*............................................................... - Separation du repertoire de stockage de l'image et du nom propre - .................................................................*/ - if (nb == 1) - { - repert[0]='\0'; - image[0]='\0'; - car='/'; - -#ifdef _WIN - car='\\'; -#endif - pch=(char *)strrchr(nom_image,car); - if (pch == NULL) - { - /* le repertoire est celui courant */ - strcpy(repert,"./"); -#ifdef _WIN - strcpy(repert,".\\"); -#endif - sscanf(nom_image,"%s",image); -/*----------------------------------------------------------*/ -/* Modification septembre 98 demandee par H.Vadon */ -/* Afin de permettre d'utiliser une image monocanale en BSQ */ -/* avec l'extension libre sans .c1 forcement */ -/*----------------------------------------------------------*/ - if (strcasecmp(format,"BSQ") != 0) - { - car='.'; - pch=(char *)strrchr(image,car); - if (pch != NULL) - *pch='\0'; - } - } - else - { - - nb1=( long int)(pch)-( long int)(nom_image); - strncpy(repert,nom_image,nb1); - repert[nb1]='\0'; - deb=nom_image+nb1+1; - nb2=strlen(nom_image)-(nb1+1); - strncpy(image,deb,nb2); - image[nb2]='\0'; - -/*----------------------------------------------------------*/ -/* Modification septembre 98 demandee par H.Vadon */ -/* Afin de permettre d'utiliser une image monocanale en BSQ */ -/* avec l'extension libre sans .c1 forcement */ -/*----------------------------------------------------------*/ - if (strcasecmp(format,"BSQ") != 0) - { - car='.'; - pch=(char *)strrchr(image,car); - if (pch != NULL) - *pch='\0'; - } - - } - - } -/*.............................................. - Verification existence repertoire demande - ...............................................*/ - if ( nb == 1 ) - { - dirp=opendir(repert); - if (dirp ==(DIR *)NULL) - { - /* repertoire demande inexistant */ - nb=0; - sprintf(CAI_ERREUR,"repertoire %s inexistant \n",repert); - } - else - closedir(dirp); - - } - - /*........................................... - Appel de la fonction pointee par comp avec la liste des parametres - suivants : - repertoire de stockage de l'image - nom de l'image - nombre de canaux - nombre d'octets par pixels - nombre de colonnes - nombre de lignes - ......................................................................*/ - if ( nb == 1 ) - { - if (IND_GRILLES == '\0') - { - if (IND_SPOT == '\0') - image1 = (*comp)(repert,image,nb_can,nboct_pix,nb_col,nb_lig); - else - image1 = (*comp)(IND_SPOT,repert,image,nb_can,nboct_pix,nb_col, - nb_lig); - } - else - image1 = (*comp)(IND_GRILLES,repert,image,nb_can,nboct_pix,nb_col, - nb_lig); - IND_GRILLES = '\0'; - IND_SPOT = '\0'; - if (image1 != NULL) - { - strcpy(image1->TYPE_IMAGE,format); - strcpy(image1->NOM_IMAGE,nom_image); - image1->NB_CANAUX=*nb_can; - image1->NB_COL=*nb_col; - image1->NB_LIG=*nb_lig; - image1->NBOCT_PIX=*nboct_pix; - image1->MODE=CAI_LECTURE; - -/*** Traitement de la Colormap si format autre que TIFF et RASTERFILE ***/ - - if ((strcasecmp(format,"RASTERFILE") != 0)&&(strcasecmp(format,"TIFF") != 0)) - { - - icr = cai_lecture_colormap(image1); - - if ( icr == CAI_KO) - return (NULL); - else - return (image1); - } - else - { - return (image1); - } - } - else - return(NULL); - } - else - { - return (NULL); - } -} -/* - Fin de l'operation cai_ouvre_lecture_image.c -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_image */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- dans un format donne et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_image (nom_image, */ -/* ---------------- type_image, */ -/* nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* type_image (E) (char *) : format de l'image a ouvrir */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_image (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V3 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_creation_image ( char *nom_image, - char *type_image, - int nb_can, - int nboct_pix, - int nb_col, - int nb_lig, - char *label) - -{ - - int nb; /* indicateur d'erreurs rencontres */ - CAI_IMAGE *image1; /* descripteur de fichier retour fonction */ - CAI_IMAGE *(*comp) ( ); /* pointeur sur fonction */ - char repert[1024]; /* repertoire de stockage de l'image */ - char image[1024]; /* nom de l'image a ouvrir en ecriture */ - char *pch,*deb; /* pointeurs de travail */ - long int nb1,nb2; /* indice de longueur significative */ - char car; /* variable de travail */ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - - -/*...................... - Initialisations - .......................*/ - - nb=1; - CAI_ERREUR[0]='\0'; - IND_GRILLES = '\0'; - IND_SPOT = '\0'; -/*................................................................ - Verification de la coherence des donnees en entree - .............................................................*/ - if (nb_can<=0) - { - sprintf(CAI_ERREUR,"Nombre du canal a ecrire incorrect"); - nb=0; - } - - if (nb_lig<=0) - { - sprintf(CAI_ERREUR,"Nombre de lignes a ecrire incorrect"); - nb=0; - - } - - if (nb_col<=0) - { - sprintf(CAI_ERREUR,"Nombre de colonnes a ecrire incorrect"); - nb=0; - } - - -/*.............................................. - Initialisation d'un pointeur sur fonction dependant du format des images - ................................................ */ - if (strcasecmp(type_image,"INRIA") == 0) - { - comp = (cai_ouvre_creation_inria) ; - } - - else if (strcasecmp(type_image,"ONERA") == 0) - { - comp = (cai_ouvre_creation_onera) ; - } - - else if (strcasecmp(type_image,"BSQ") == 0) - { - comp = (cai_ouvre_creation_bsq) ; - } - - else if (strcasecmp(type_image,"BIP") == 0) - { - comp = (cai_ouvre_creation_bip) ; - } - -#ifdef _HDF16 - - else if (strncasecmp(type_image,"HDF",3) == 0) - { - comp = (cai_ouvre_creation_hdf16) ; - } -#endif - - else if (strcasecmp(type_image,"BIL") == 0) - { - comp = (cai_ouvre_creation_bil) ; - } - - else if (strcasecmp(type_image,"LUM") == 0) - { - comp = (cai_ouvre_creation_lum) ; - } - - else if (strcasecmp(type_image,"GESSIMU") == 0) - { - comp = (cai_ouvre_creation_gessimu) ; - } - - else if (strcasecmp(type_image,"GDB") == 0) - { - IND_GRILLES = 'B'; - comp = (cai_ouvre_creation_grilles) ; - } - - else if (strcasecmp(type_image,"GDR") == 0) - { - IND_GRILLES = 'R'; - comp = (cai_ouvre_creation_grilles) ; - } - - else if (strcasecmp(type_image,"TIFF") == 0) - { - comp = (cai_ouvre_creation_tiff) ; - } - - else if (strcasecmp(type_image,"RASTERFILE") == 0) - { - comp = (cai_ouvre_creation_sun_raster) ; - } - else if (strcasecmp(type_image,"JPEG") == 0) - { - comp = (cai_ouvre_creation_jpeg) ; - } - else if (strcasecmp(type_image,"SPOT1A4") == 0) - { - IND_SPOT = '1'; - comp = (cai_ouvre_creation_spot) ; - } - else if (strcasecmp(type_image,"SPOT5TIF") == 0) - { - IND_SPOT = 'T'; - comp = (cai_ouvre_creation_spot) ; - } - else if (strcasecmp(type_image,"SPOT5BIL") == 0) - { - IND_SPOT = 'B'; - comp = (cai_ouvre_creation_spot) ; - } - else if (strcasecmp(type_image,"RADAR") == 0) - { - comp = (cai_ouvre_creation_radar) ; - } - else if (strcasecmp(type_image,"BANDEAU") == 0) - { - nb = 0; - sprintf(CAI_ERREUR,"Ecriture au format BANDEAU non prévue dans CAI \n"); - } - else - { - - /* format non connu de la Couche Acces Image */ - nb = 0; - sprintf(CAI_ERREUR,"format %s non reconnu \n",type_image); - - } - /*............................................................... - Separation du repertoire de stockage de l'image et du nom propre - .................................................................*/ - if (nb == 1) - { - repert[0]='\0'; - image[0]='\0'; - car = '/'; -#ifdef _WIN - car='\\'; -#endif - pch=(char *)strrchr(nom_image,car); - if (pch == NULL) - { - /* le repertoire est celui courant */ - strcpy(repert,"./"); -#ifdef _WIN - strcpy(repert,".\\"); -#endif - sscanf(nom_image,"%s",image); - } - else - { - - nb1=( long int)(pch)-(long int)(nom_image); - strncpy(repert,nom_image,nb1); - repert[nb1]='\0'; - deb=nom_image+nb1+1; - nb2=strlen(nom_image)-(nb1+1); - strncpy(image,deb,nb2); - image[nb2]='\0'; - car='.'; - pch=(char *)strrchr(image,car); - if (pch != NULL) - *pch='\0'; - } - - } -/*.............................................. - Verification existence repertoire demande - ...............................................*/ - if ( nb == 1 ) - { - dirp=opendir(repert); - if (dirp ==0) - { - /* repertoire demande inexistant */ - nb=0; - sprintf(CAI_ERREUR,"repertoire %s inexistant \n",repert); - } - else - { - closedir(dirp); - } - - - } - /*........................................... - Appel de la fonction pointee par comp avec la liste des parametres - suivants : - repertoire de stockage de l'image - nom de l'image - nombre de canaux - nombre d'octets par pixels - nombre de colonnes - nombre de lignes - label lie a l'image - ......................................................................*/ - if ( nb == 1 ) - { - if ((long int)strlen(label)==0) - strcpy(label,image); - if (IND_GRILLES == '\0') - { - if (IND_SPOT == '\0') - image1 = (*comp)(repert,image,&nb_can,&nboct_pix,&nb_col,&nb_lig,label); - else - image1 = (*comp)(IND_SPOT,repert,image,&nb_can,&nboct_pix, - &nb_col,&nb_lig,label); - } - else - image1 = (*comp)(IND_GRILLES,repert,image,&nb_can,&nboct_pix, - &nb_col,&nb_lig,label); - IND_GRILLES = '\0'; - IND_SPOT = '\0'; - if (image1 != NULL) - { - strcpy(image1->COMMENT,label); - strcpy(image1->TYPE_IMAGE,type_image); - strcpy(image1->NOM_IMAGE,nom_image); - image1->NB_CANAUX=nb_can; - image1->NB_COL=nb_col; - image1->NB_LIG=nb_lig; - image1->NBOCT_PIX=nboct_pix; - image1->MODE=CAI_ECRITURE; - - return (image1); - - } - else - return(NULL); - } - else - return (NULL); - -} -/* - Fin de l'operation cai_ouvre_creation_image.c -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image dans un format donne */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_lecture_canal(image1, canal, premiere_ligne, */ /* ------------------ premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* premiere_ligne (E) ( int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) ( int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) ( int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) ( int) : nombre de colonnes a lire */ -/* canal (E) ( int) : numero du canal a lire */ -/* pas_ligne (E) ( int) : pas en ligne */ -/* pas_colonne (E) ( int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal (S) (CAI_OK_KO) : = CAI_OK si correct */ -/* = CAI_KO si PB */ -/* */ -/* VERSION : V3 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_lecture_canal(CAI_IMAGE *image1 , - int canal , - int premiere_ligne , - int premiere_colonne, - int nombre_lignes_lire , - int nombre_colonnes_lire, - int pas_ligne , - int pas_colonne, - unsigned char *data_image ) - -{ - long int (*comp) ( ); /* pointeur sur fonction */ - char type_image[20]; /* format de stockage de l'image a lire */ - long int retour; /* indicateur d'erreur de l'operation */ - -/*...................... - Initialisations - .......................*/ - retour=CAI_OK; - strcpy( type_image,image1->TYPE_IMAGE); - CAI_ERREUR[0]='\0'; - IND_GRILLES = '\0'; - IND_SPOT = '\0'; -/*............................................................. - Verification de la coherence des donnees en entree - .............................................................*/ - if ((premiere_ligne<=0)||(premiere_ligne> image1->NB_LIG)) - { - sprintf(CAI_ERREUR,"Premiere ligne a lire incorrecte"); - retour=CAI_KO; - - } - - else if ((premiere_colonne<=0)||(premiere_colonne> image1->NB_COL)) - { - sprintf(CAI_ERREUR,"Premiere colonne a lire incorrecte"); - retour=CAI_KO; - } - - - else if ((canal<=0)||(canal> image1->NB_CANAUX)) - { - sprintf(CAI_ERREUR,"Numero du canal a lire incorrect"); - retour=CAI_KO; - } - - else if ((nombre_lignes_lire<=0)|| - ((nombre_lignes_lire + premiere_ligne -1) > image1->NB_LIG)) - { - sprintf(CAI_ERREUR,"Nombre de lignes a lire incorrect"); - retour=CAI_KO; - } - - else if ((nombre_colonnes_lire<=0)|| - ((nombre_colonnes_lire + premiere_colonne -1) > image1->NB_COL)) - { - sprintf(CAI_ERREUR,"Nombre de colonnes a lire incorrect"); - retour=CAI_KO; - } - if (retour == CAI_OK) - { - -/*.............................................. - Initialisation d'un pointeur sur fonction dependant du format des images - ................................................ */ - if (strcasecmp(type_image,"INRIA") == 0) - { - comp = (cai_lecture_canal_inria) ; - } - - else if (strcasecmp(type_image,"ONERA") == 0) - { - comp = (cai_lecture_canal_onera) ; - } - - else if (strcasecmp(type_image,"BSQ") == 0) - { - comp = (cai_lecture_canal_bsq) ; - } - - else if (strcasecmp(type_image,"BIP") == 0) - { - comp = (cai_lecture_canal_bip) ; - } - -#ifdef _HDF16 - else if (strncasecmp(type_image,"HDF",3) == 0) - { - comp = (cai_lecture_canal_hdf16) ; - } -#endif - - else if (strcasecmp(type_image,"BIL") == 0) - { - comp = (cai_lecture_canal_bil) ; - } - - else if (strcasecmp(type_image,"LUM") == 0) - { - comp = (cai_lecture_canal_lum) ; - } - - else if (strcasecmp(type_image,"GESSIMU") == 0) - { - comp = (cai_lecture_canal_gessimu) ; - } - - else if (strcasecmp(type_image,"GDB") == 0) - { - comp = (cai_lecture_canal_grilles) ; - } - - else if (strcasecmp(type_image,"GDR") == 0) - { - comp = (cai_lecture_canal_grilles) ; - } - - else if (strcasecmp(type_image,"TIFF") == 0) - { - comp = (cai_lecture_canal_tiff) ; - } - - else if (strcasecmp(type_image,"RASTERFILE") == 0) - { - comp = (cai_lecture_canal_sun_raster) ; - } - else if (strcasecmp(type_image,"JPEG") == 0) - { - comp = (cai_lecture_canal_jpeg) ; - } - else if (strcasecmp(type_image,"SPOT1A4") == 0) - { - comp = (cai_lecture_canal_spot) ; - } - else if (strcasecmp(type_image,"SPOT5TIF") == 0) - { - comp = (cai_lecture_canal_spot) ; - } - else if (strcasecmp(type_image,"SPOT5BIL") == 0) - { - comp = (cai_lecture_canal_spot) ; - } - else if (strcasecmp(type_image,"RADAR") == 0) - { - comp = (cai_lecture_canal_radar) ; - } - else if (strcasecmp(type_image,"BANDEAU") == 0) - { - comp = (cai_lecture_canal_bandeau) ; - } - else - { - - /* format non connu de la Couche Acces Image */ - retour = CAI_KO; - sprintf(CAI_ERREUR,"format %s non reconnu \n",type_image); - - - } - } - - /*........................................... - Appel de la fonction pointee par comp avec la liste des parametres - suivants : - - pointeur sur descripteur des fichiers - numero du canal a lire - premiere ligne a lire dans l'image - premiere colonne a lire dans l'image - nombre de lignes a lire - nombre de colonnes a lire - pas en ligne - pas en colonne - tableau des pixels lus - ......................................................................*/ - if ( retour == CAI_OK) - { - retour=(*comp)(image1 , - &canal , - &premiere_ligne , - &premiere_colonne , - &nombre_lignes_lire , - &nombre_colonnes_lire, - &pas_ligne , - &pas_colonne, - data_image) ; - return(retour); - } - else - { - return (CAI_KO); - } - -} -/* - Fin de l'operation cai_lecture_canal.c -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image dans un format donne */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_ecriture_canal(image1, canal, premiere_ligne, */ /* ------------------ nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) ( int) : numero du canal a ecrire */ -/* premiere_ligne (E) ( int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) ( int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) ( int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels a ecrire alloue */ -/* et libere par l'appelant */ -/* */ -/* cai_ecriture_canal (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V3 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_ecriture_canal (CAI_IMAGE *image1 , - int canal , - int premiere_ligne, - int nombre_lignes_ecrire , - int nombre_colonnes_ecrire, - unsigned char *data_image ) - - -{ - long int (*comp) ( ); /* pointeur sur fonction */ - char type_image[20]; /* format de stockage de l'image a ecrire */ - long int retour; /* indicateur d'erreur de l'operation */ - - -/*...................... - Initialisations - .......................*/ - - retour=CAI_OK; - type_image[0]='\0'; - strcpy( type_image,image1->TYPE_IMAGE); - CAI_ERREUR[0]='\0'; - - /*................................................................ - Verification de la coherence des donnees en entree - .............................................................*/ -/* sur la premiere ligne a ecrire */ - - if ((premiere_ligne<=0)||(premiere_ligne> image1->NB_LIG)) - { - sprintf(CAI_ERREUR,"Premiere ligne a ecrire incorrecte"); - retour=CAI_KO; - } - -/* sur le numero du canal a ecrire */ - - if ((canal<=0)||(canal> image1->NB_CANAUX)) - { - sprintf(CAI_ERREUR,"Numero du canal a ecrire incorrect"); - retour=CAI_KO; - - } - -/* sur le nombre de lignes a ecrire */ - if ((nombre_lignes_ecrire<=0)|| - ((nombre_lignes_ecrire + premiere_ligne-1) > image1->NB_LIG)) - { - sprintf(CAI_ERREUR,"Nombre de lignes a ecrire incorrect"); - retour=CAI_KO; - } - -/* sur le nombre de colonnes a ecrire */ - - - if ((nombre_colonnes_ecrire<=0)|| - (nombre_colonnes_ecrire > image1->NB_COL)) - { - sprintf(CAI_ERREUR,"Nombre de colonnes a ecrire incorrect"); - retour=CAI_KO; - } - - if (retour == CAI_OK) - { -/*.............................................. - Initialisation d'un pointeur sur fonction dependant du format des images - ................................................ */ - - if (strcasecmp(type_image,"INRIA") == 0) - { - comp = (cai_ecriture_canal_inria) ; - } - - else if (strcasecmp(type_image,"ONERA") == 0) - { - comp = (cai_ecriture_canal_onera) ; - } - - else if (strcasecmp(type_image,"BSQ") == 0) - { - comp = (cai_ecriture_canal_bsq) ; - } - - else if (strcasecmp(type_image,"BIP") == 0) - { - comp = (cai_ecriture_canal_bip) ; - } - -#ifdef _HDF16 - - else if (strncasecmp(type_image,"HDF",3) == 0) - { - comp = (cai_ecriture_canal_hdf16) ; - } -#endif - - else if (strcasecmp(type_image,"BIL") == 0) - { - comp = (cai_ecriture_canal_bil) ; - } - - else if (strcasecmp(type_image,"LUM") == 0) - { - comp = (cai_ecriture_canal_lum) ; - } - - else if (strcasecmp(type_image,"GESSIMU") == 0) - { - comp = (cai_ecriture_canal_gessimu) ; - } - - else if (strcasecmp(type_image,"GDB") == 0) - { - comp = (cai_ecriture_canal_grilles) ; - } - - else if (strcasecmp(type_image,"GDR") == 0) - { - comp = (cai_ecriture_canal_grilles) ; - } - - else if (strcasecmp(type_image,"TIFF") == 0) - { - comp = (cai_ecriture_canal_tiff) ; - } - - else if (strcasecmp(type_image,"RASTERFILE") == 0) - { - comp = (cai_ecriture_canal_sun_raster) ; - } - else if (strcasecmp(type_image,"JPEG") == 0) - { - comp = (cai_ecriture_canal_jpeg) ; - } - - else if (strcasecmp(type_image,"SPOT1A4") == 0) - { - comp = (cai_ecriture_canal_spot) ; - } - else if (strcasecmp(type_image,"SPOT5TIF") == 0) - { - comp = (cai_ecriture_canal_spot) ; - } - else if (strcasecmp(type_image,"SPOT5BIL") == 0) - { - comp = (cai_ecriture_canal_spot) ; - } - else if (strcasecmp(type_image,"RADAR") == 0) - { - comp = (cai_ecriture_canal_radar) ; - } - else if (strcasecmp(type_image,"BANDEAU") == 0) - { - retour = CAI_KO; - sprintf(CAI_ERREUR,"Ecriture au format BANDEAU non prévue dans CAI \n"); - } - else - { - - /* format non connu de la Couche Acces Image */ - retour = CAI_KO; - sprintf(CAI_ERREUR,"format %s non reconnu \n",type_image); - - - } - } - /*........................................... - Appel de la fonction pointee par comp avec la liste des parametres - suivants : - - pointeur sur descripteur des fichiers - numero du canal a ecrire - premiere ligne a ecrire dans l'image - nombre de lignes a ecrire - nombre de colonnes a ecrire - tableau des pixels a ecrire - ......................................................................*/ - if ( retour == CAI_OK) - { - retour=(*comp)(image1 , - &canal , - &premiere_ligne , - &nombre_lignes_ecrire , - &nombre_colonnes_ecrire, - data_image) ; - } - - return (retour); - -} -/* - Fin de l'operation cai_ecriture_canal.c -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_image */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image dans un format donne et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_ferme_image(image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_image (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V3 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_ferme_image (CAI_IMAGE *image1) - -{ - long int iret; /* indicateur retour fonction */ - long int (*comp)(); /* pointeur sur fonction */ - -/*...................... - Initialisations - .......................*/ - - iret=CAI_OK; - CAI_ERREUR[0]='\0'; - IND_GRILLES = '\0'; - IND_SPOT = '\0'; -/*.............................................. - Initialisation d'un pointeur sur fonction dependant du format des images - ................................................ */ - - if (strcasecmp(image1->TYPE_IMAGE,"INRIA") == 0) - { - comp = (cai_ferme_inria) ; - } - - else if (strcasecmp(image1->TYPE_IMAGE,"ONERA") == 0) - { - comp = (cai_ferme_onera) ; - } - else if (strcasecmp(image1->TYPE_IMAGE,"BSQ") == 0) - { - comp = (cai_ferme_bsq) ; - } - - else if (strcasecmp(image1->TYPE_IMAGE,"BIP") == 0) - { - comp = (cai_ferme_bip) ; - } - -#ifdef _HDF16 - - else if (strncasecmp(image1->TYPE_IMAGE,"HDF",3) == 0) - { - comp = (cai_ferme_hdf16) ; - } -#endif - - else if (strcasecmp(image1->TYPE_IMAGE,"BIL") == 0) - { - - comp = (cai_ferme_bil) ; - } - - else if (strcasecmp(image1->TYPE_IMAGE,"LUM") == 0) - { - - comp = (cai_ferme_lum) ; - } - - else if (strcasecmp(image1->TYPE_IMAGE,"GESSIMU") == 0) - { - comp = (cai_ferme_gessimu) ; - } - - else if (strcasecmp(image1->TYPE_IMAGE,"GDB") == 0) - { - IND_GRILLES = 'B'; - comp = (cai_ferme_grilles) ; - } - - else if (strcasecmp(image1->TYPE_IMAGE,"GDR") == 0) - { - IND_GRILLES = 'R'; - comp = (cai_ferme_grilles) ; - } - - - else if (strcasecmp(image1->TYPE_IMAGE,"TIFF") == 0) - { - comp = (cai_ferme_tiff) ; - } - - else if (strcasecmp(image1->TYPE_IMAGE,"RASTERFILE") == 0) - { - comp = (cai_ferme_sun_raster) ; - } - else if (strcasecmp(image1->TYPE_IMAGE,"JPEG") == 0) - { - comp = (cai_ferme_jpeg) ; - } - - else if (strcasecmp(image1->TYPE_IMAGE,"SPOT1A4") == 0) - { - IND_SPOT = '1'; - comp = (cai_ferme_spot) ; - } - else if (strcasecmp(image1->TYPE_IMAGE,"SPOT5TIF") == 0) - { - IND_SPOT = 'T'; - comp = (cai_ferme_spot) ; - } - else if (strcasecmp(image1->TYPE_IMAGE,"SPOT5BIL") == 0) - { - IND_SPOT = 'B'; - comp = (cai_ferme_spot) ; - } - - else if (strcasecmp(image1->TYPE_IMAGE,"RADAR") == 0) - { - - comp = (cai_ferme_radar) ; - } - - else if (strcasecmp(image1->TYPE_IMAGE,"BANDEAU") == 0) - { - - comp = (cai_ferme_bandeau) ; - } - - else - { - - /* format non connu de la Couche Acces Image */ - iret = CAI_KO; - sprintf(CAI_ERREUR,"format %s non reconnu \n",image1->TYPE_IMAGE); - - - } - - - /*........................................... - Appel de la fonction pointee par comp avec la liste des parametres - suivants : - pointeur sur descripteur des fichiers de l'image - ......................................................................*/ - - if (( iret == CAI_OK ) && (image1 != NULL)) - { -/*** Traitement de la Colormap ***/ - if ((image1->COLORMAP !=0)&& ( image1->MODE == CAI_ECRITURE)) - { - iret = cai_ecriture_colormap(image1); - } - - if (image1->COLORMAP !=0) - { - free(image1->TABCOLOR); - } - if (IND_GRILLES == '\0') - { - if (IND_SPOT == '\0') - iret = (*comp)(image1); - else - iret = (*comp)(IND_SPOT,image1); - } - else - iret = (*comp)(IND_GRILLES,image1); - } - free(image1); - - image1 = (CAI_IMAGE *)NULL; - - return (iret); -} -/* - Fin de l'operation cai_ferme_image.c -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_destruction_image */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image dans un format donne et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_destruction_image(format,nom_ima) */ -/* ------------------ */ -/* format (E) (char *) : format de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_destruction_image (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V3 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_destruction_image (char *format , - char *nom_ima ) - - -{ - -long int (*ptr_dest_ima)(); /* ptr sur fctn de destruction d'une image */ -long int cr_cai; /* code retour de fonction appellee */ -long int i,ind; /* variables de travail */ -char repert[1024]; /* repertoire de stockage de l'image */ -char image[1024]; /* nom de l'image a detruire sans repert */ -char form[20]; /* format de l'image a detruire */ -char *pch,*deb; /* variables de travail */ -long int nb1,nb2; /* variables de travail */ -char car; /* variables de travail */ -/*................. - Initialisations - ................*/ - -cr_cai = CAI_OK; -strcpy(form,format); -CAI_ERREUR[0]='\0'; -IND_GRILLES = '\0'; -IND_SPOT = '\0'; -/*................................................... - Recherche du type de fichier si reconnaissance automatique demande - ...................................................*/ - - if (strcasecmp(form,"AUTO")== 0) - { - for( i = 0 ; i< CAI_NB_EXTENSIONS ; i++) - { - if(strstr(nom_ima,CAI_SUFFIXES[i]) != NULL ) - { - ind=CAI_NUMEROS[i]; - strcpy(form,CAI_NOM_FORMAT[ind]); - } - } - } - -/*.............................................. - Initialisation d'un pointeur sur fonction dependant du format des images - ................................................ */ - - if (strcasecmp(form,"INRIA") == 0) - { - ptr_dest_ima = (cai_dest_ima_inria) ; - } - - else if (strcasecmp(form,"ONERA") == 0) - { - ptr_dest_ima = (cai_dest_ima_onera) ; - } - - else if (strcasecmp(form,"BSQ") == 0) - { - ptr_dest_ima = (cai_dest_ima_bsq) ; - } - - else if (strcasecmp(form,"BIP") == 0) - { - ptr_dest_ima = (cai_dest_ima_bip) ; - } - -#ifdef _HDF16 - - else if (strncasecmp(form,"HDF",3) == 0) - { - ptr_dest_ima = (cai_dest_ima_hdf16) ; - } -#endif - - else if (strcasecmp(form,"BIL") == 0) - { - ptr_dest_ima = (cai_dest_ima_bil) ; - } - - else if (strcasecmp(form,"LUM") == 0) - { - ptr_dest_ima = (cai_dest_ima_lum) ; - } - - else if (strcasecmp(form,"GESSIMU") == 0) - { - ptr_dest_ima = (cai_dest_ima_gessimu) ; - } - - else if (strcasecmp(form,"GDB") == 0) - { - IND_GRILLES = 'B'; - ptr_dest_ima = (cai_dest_ima_grilles) ; - } - - else if (strcasecmp(form,"GDR") == 0) - { - IND_GRILLES = 'R'; - ptr_dest_ima = (cai_dest_ima_grilles) ; - } - - else if (strcasecmp(form,"TIFF") == 0) - { - ptr_dest_ima = (cai_dest_ima_tiff) ; - } - - else if (strcasecmp(form,"RASTERFILE") == 0) - { - ptr_dest_ima = (cai_dest_ima_sun_raster) ; - } - else if (strcasecmp(form,"JPEG") == 0) - { - ptr_dest_ima = (cai_dest_ima_jpeg) ; - } - else if (strcasecmp(form,"SPOT1A4") == 0) - { - IND_SPOT = '1'; - ptr_dest_ima = (cai_dest_ima_spot) ; - } - else if (strcasecmp(form,"SPOT5TIF") == 0) - { - IND_SPOT = 'T'; - ptr_dest_ima = (cai_dest_ima_spot) ; - } - else if (strcasecmp(form,"SPOT5BIL") == 0) - { - IND_SPOT = 'B'; - ptr_dest_ima = (cai_dest_ima_spot) ; - } - else if (strcasecmp(form,"RADAR") == 0) - { - ptr_dest_ima = (cai_dest_ima_radar) ; - } - else if (strcasecmp(form,"BANDEAU") == 0) - { - ptr_dest_ima = (cai_dest_ima_bandeau) ; - } - else - { - - /* format non connu de la Couche Acces Image */ - cr_cai = CAI_KO; - sprintf(CAI_ERREUR,"format %s non reconnu \n",form); - - } - /*............................................................... - Separation du repertoire de stockage de l'image et du nom propre - .................................................................*/ - if (cr_cai ==CAI_OK) - { - repert[0]='\0'; - image[0]='\0'; - car='/'; -#ifdef _WIN - car='\\'; -#endif - pch=(char *)strrchr(nom_ima,car); - if (pch == NULL) - { - /* le repertoire est celui courant */ - strcpy(repert,"./"); -#ifdef _WIN - strcpy(repert,".\\"); -#endif - sscanf(nom_ima,"%s",image); - car='.'; - pch=(char *)strrchr(image,car); - if (pch != NULL) - *pch='\0'; - - } - else - { - - nb1=(long int)(pch)-(long int)(nom_ima); - strncpy(repert,nom_ima,nb1); - repert[nb1]='\0'; - deb=nom_ima+nb1+1; - nb2=strlen(nom_ima)-(nb1+1); - strncpy(image,deb,nb2); - image[nb2]='\0'; - car='.'; - pch=(char *)strrchr(image,car); - if (pch != NULL) - *pch='\0'; - - } - - } - - -/****************************************************/ -/* appel de la fonction pointee par ptr_dest_ima */ -/* avec les parametres suivants : */ -/* - repertoire de stockage de l'image */ -/* - nom de l'image */ -/****************************************************/ - - if (cr_cai==CAI_OK) - { - if (IND_GRILLES == '\0') - { - if (IND_SPOT == '\0') - cr_cai = (*ptr_dest_ima)(repert, image); - else - cr_cai = (*ptr_dest_ima)(IND_SPOT,repert, image); - } - else - cr_cai = (*ptr_dest_ima)(IND_GRILLES,repert, image); - - } - return (cr_cai); -} -/* - Fin de l'operation cai_destruction_image.c -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_modif_nbbitspix */ -/* ---------- */ -/* */ -/* ROLE : fonction permetant de modifier le nombre de bits significatifs */ -/* ----- par pixel (uniquement pour les formats BSQ ,BIP,BIL et HDF) */ -/* */ -/* Remarque !! L'image doit deja etre ouverte */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_modif_nbbitspix(format,image1,NbBitsPix) */ /* ------------------ */ -/* format (E) (char *) : format de l'image a modifier */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* NbBitsPix (E) (long int) : nb de bits significatifs par pixel */ -/* */ -/* cai_modif_nbbitspix (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* = CAI_IMPOS si format autre que BSQ ou HDF16 */ -/* */ -/* VERSION : V3 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_modif_nbbitspix ( char *format , - CAI_IMAGE *image1,int NbBitsPix) - -{ - -long int cr_cai; /* code retour de fonction appellee */ -char form[20]; /* format de l'image a modifier */ -CAI_EXTENS *TabExtens; -/*................. - Initialisations - ................*/ - -TabExtens = NULL; -cr_cai = CAI_OK; -strcpy(form,format); -CAI_ERREUR[0]='\0'; - -/*.............................................. - Lancement de la fonction dependant du format des images - ................................................ */ - - if (strcasecmp(form,"BSQ") == 0) - { - cr_cai = cai_modif_nbbitspix_bsq(image1,NbBitsPix) ; - } - - -#ifdef _HDF16 - - else if (strncasecmp(form,"HDF",3) == 0) - { - image1->NB_BITS_PIX = NbBitsPix; - cr_cai = cai_rename_fichiers_hdf16(image1,TabExtens) ; - } -#endif - else if (strcasecmp(form,"BIP") == 0) - { - cr_cai = cai_modif_nbbitspix_bip(image1,NbBitsPix) ; - } - else if (strcasecmp(form,"BIL") == 0) - { - cr_cai = cai_modif_nbbitspix_bil(image1,NbBitsPix) ; - } - - else - { - - /* Fonction non prevue pour un autre format */ - cr_cai = CAI_IMPOS; - sprintf(CAI_ERREUR,"format %s : modification non prevue \n",form); - - } - - return (cr_cai); -} -/* Fin de l'operation cai_modif_nbbitspix -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_image */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture-ecriture d'une image d'un format*/ -/* ----- donne et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_image (nom_image, */ -/* ---------------- type_image, */ -/* nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* type_image (E) (char *) : format de l'image a ouvrir */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_image (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V3 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_modifie_image (char *nom_image, - char *type_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) -{ - - int nb; /* indicateur d'erreurs rencontres */ - CAI_IMAGE *image1; /* descripteur de fichier retour fonction */ - CAI_IMAGE *(*comp) ( ); /* pointeur sur fonction */ - char repert[1024]; /* repertoire de stockage de l'image */ - char image[1024]; /* nom de l'image a ouvrir en lecture */ - char format[20]; /* format de stockage de l'image a lire */ - long int i,ind; /* variables de travail */ - char *pch,*deb; /* pointeurs de travail */ - long int nb1,nb2; /* indice de longueur significative */ - char car; /* variable de travail */ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - CAI_OK_KO icr; /* Compte-rendu des fonctions DA */ - - -/*...................... - Initialisations - .......................*/ - nb=1; - strcpy(format,type_image); - - CAI_ERREUR[0]='\0'; - IND_GRILLES = '\0'; - IND_SPOT = '\0'; - -/*................................................... - Recherche du type de fichier si reconnaissance automatique demande - ...................................................*/ - if (strcasecmp(format,"AUTO")== 0) - { - for( i = 0 ; i< CAI_NB_EXTENSIONS ; i++) - { - if(strstr(nom_image,CAI_SUFFIXES[i]) != NULL ) - { - ind=CAI_NUMEROS[i]; - strcpy(format,CAI_NOM_FORMAT[ind]); - } - } - } - -/*.............................................. - Initialisation d'un pointeur sur fonction dependant du format des images - ................................................ */ - - if (strcasecmp(format,"INRIA") == 0) - { - comp = (cai_ouvre_modifie_inria) ; - } - - else if (strcasecmp(format,"ONERA") == 0) - { - comp = (cai_ouvre_modifie_onera) ; - } - - else if (strcasecmp(format,"BSQ") == 0) - { - comp = (cai_ouvre_modifie_bsq) ; - } - - else if (strcasecmp(format,"BIP") == 0) - { - comp = (cai_ouvre_modifie_bip) ; - } -#ifdef _HDF16 - else if (strncasecmp(format,"HDF",3) == 0) - { - comp = (cai_ouvre_modifie_hdf16) ; - } -#endif - - else if (strcasecmp(format,"BIL") == 0) - { - comp = (cai_ouvre_modifie_bil) ; - } - - else if (strcasecmp(format,"LUM") == 0) - { - comp = (cai_ouvre_modifie_lum) ; - } - - else if (strcasecmp(format,"GESSIMU") == 0) - { - comp = (cai_ouvre_modifie_gessimu) ; - } - - else if (strcasecmp(format,"GDB") == 0) - { - IND_GRILLES = 'B'; - comp = (cai_ouvre_modifie_grilles) ; - } - - else if (strcasecmp(format,"GDR") == 0) - { - IND_GRILLES = 'R'; - comp = (cai_ouvre_modifie_grilles) ; - } - - else if (strcasecmp(format,"TIFF") == 0) - { -/* comp = (cai_ouvre_modifie_tiff) ; */ - nb = 0; - sprintf(CAI_ERREUR, - "fonction de modification non disponible pour TIFF"); - } - - else if (strcasecmp(format,"RASTERFILE") == 0) - { - comp = (cai_ouvre_modifie_sun_raster) ; - } - else if (strcasecmp(format,"JPEG") == 0) - { - nb = 0; - sprintf(CAI_ERREUR,"fonction de modification non disponible pour JPEG"); - } - else if (strcasecmp(type_image,"SPOT1A4") == 0) - { - IND_SPOT = '1'; - comp = (cai_ouvre_modifie_spot) ; - } - else if (strcasecmp(type_image,"SPOT5TIF") == 0) - { - IND_SPOT = 'T'; -/* comp = (cai_ouvre_modifie_spot) ;*/ - nb = 0; - sprintf(CAI_ERREUR, - "fonction de modification non disponible pour SPOT5TIF"); - - } - else if (strcasecmp(type_image,"SPOT5BIL") == 0) - { - IND_SPOT = 'B'; - comp = (cai_ouvre_modifie_spot) ; - } - else if (strcasecmp(format,"RADAR") == 0) - { - comp = (cai_ouvre_modifie_radar) ; - } - - else if (strcasecmp(type_image,"BANDEAU") == 0) - { - nb = 0; - sprintf(CAI_ERREUR, - "fonction de modification non disponible pour BANDEAU \n"); - } - - else - { - - /* format non connu de la Couche Acces Image */ - nb = 0; - sprintf(CAI_ERREUR,"format %s non reconnu \n",format); - - } - /*............................................................... - Separation du repertoire de stockage de l'image et du nom propre - .................................................................*/ - if (nb == 1) - { - repert[0]='\0'; - image[0]='\0'; - car='/'; -#ifdef _WIN - car='\\'; -#endif - pch=(char *)strrchr(nom_image,car); - if (pch == NULL) - { - /* le repertoire est celui courant */ - strcpy(repert,"./"); -#ifdef _WIN - strcpy(repert,".\\"); -#endif - sscanf(nom_image,"%s",image); - car='.'; - pch=(char *)strrchr(image,car); - if (pch != NULL) - *pch='\0'; - } - else - { - - nb1=(long int)(pch)-(long int)(nom_image); - strncpy(repert,nom_image,nb1); - repert[nb1]='\0'; - deb=nom_image+nb1+1; - nb2=strlen(nom_image)-(nb1+1); - strncpy(image,deb,nb2); - image[nb2]='\0'; - car='.'; - pch=(char *)strrchr(image,car); - if (pch != NULL) - *pch='\0'; - - } - - } -/*.............................................. - Verification existence repertoire demande - ...............................................*/ - if ( nb == 1 ) - { - dirp=opendir(repert); - if (dirp ==(DIR *)NULL) - { - /* repertoire demande inexistant */ - nb=0; - sprintf(CAI_ERREUR,"repertoire %s inexistant \n",repert); - } - else - closedir(dirp); - - } - - /*........................................... - Appel de la fonction pointee par comp avec la liste des parametres - suivants : - repertoire de stockage de l'image - nom de l'image - nombre de canaux - nombre d'octets par pixels - nombre de colonnes - nombre de lignes - ......................................................................*/ - if ( nb == 1 ) - { - if (IND_GRILLES == '\0') - { - if (IND_SPOT == '\0') - image1 = (*comp)(repert,image,nb_can,nboct_pix,nb_col,nb_lig); - else - image1 = (*comp)(IND_SPOT,repert,image,nb_can,nboct_pix,nb_col, - nb_lig); - } - else - image1 = (*comp)(IND_GRILLES,repert,image,nb_can,nboct_pix,nb_col, - nb_lig); - - if (image1 != NULL) - { - strcpy(image1->TYPE_IMAGE,format); - strcpy(image1->NOM_IMAGE,nom_image); - image1->NB_CANAUX=*nb_can; - image1->NB_COL=*nb_col; - image1->NB_LIG=*nb_lig; - image1->NBOCT_PIX=*nboct_pix; - image1->MODE=CAI_ECRITURE; - -/*** Traitement de la Colormap si format autre que TIFF et RASTERFILE ***/ - - if ((strcasecmp(format,"RASTERFILE") != 0)&&(strcasecmp(format,"TIFF") != 0)) - { - - icr = cai_lecture_colormap(image1); - - if ( icr == CAI_KO) - return (NULL); - else - return (image1); - } - else - { - return (image1); - } - } - else - return(NULL); - } - else - { - return (NULL); - } -} -/* Fin de l'operation cai_ouvre_modifie_image -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_test_pFpf */ -/* ---------- */ -/* */ -/* ROLE : fonction de test qui determine ordre des poids forts et faible */ -/* ----- pour lire correctement entete et image */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : char *cai_test_pFpf() */ -/* ---------------- */ -/* */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - char *cai_test_pFpf () - { - -/*variable contenant 3 caracteres*/ -/*-------------------------------*/ - -static char type_code[3]; - -/*codage sur 2 octets*/ -/*de la valeur 1*/ -/*-------------------*/ - -unsigned short a=1; - -/*test sur la valeur -/*de l'octet de gauche*/ -/*--------------------*/ - -if (*(char *) &a == 0) - { - strcpy(type_code, "BE"); /*affectation d'une chaine de caracteres*/ - } -if (*(char *) &a == 1) - { - strcpy(type_code, "LE"); /*affectation d'une chaine de caracteres*/ - } - -/*retourne le contenu de la variable*/ -/*comme il s'agit de tableau pas besoin du &*/ -/*------------------------------------------*/ -return(type_code); - -} -/* - Fin de l'operation cai_test_pFpf -*/ - - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_inverser_tableau */ -/* ---------- */ -/* */ -/* ROLE : fonction d'inversion des poids forts et faible */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : cai_inverser_tableau(sortie, entree,nb) */ -/* ---------------- */ -/* */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -void cai_inverser_tableau(short *BufL,short *BufE,int Nb) -{ - int pix; - for (pix=0;pix<Nb;pix=pix+2) - { - BufL[pix]=BufE[pix+1]; - BufL[pix+1]=BufE[pix]; - } -} -/* - Fin de l'operation cai_inverser_tableau -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_En_majuscule */ -/* ---------- */ -/* */ -/* ROLE : Cette fonction transforme la chaine de caracteres donnee en */ -/* ROLE : parametre en majuscule et renvoie le resultat */ -/* */ -/* CONTEXTE D'APPEL : */ -/* */ -/* RETOUR : chaine en majuscule */ -/* */ -/*****************************************************************************/ - -char* cai_En_majuscule( char *mot ) - -{ - char *retour; - int i = 0; - - /* allocation des pointeurs */ - - retour = (char*) NULL; - retour = (char*) calloc ( strlen ( mot ) + 1 , sizeof (char) ); - - if ( retour == NULL ) - { - return (char*)NULL; - } - /* Parcourir la chaine */ - - while ( mot[i] != '\0' ) - { - /* transformer en majuscule la lettre lue */ - retour[i] = toupper ( mot[i] ); - i++; - } - /* retourner le resultat */ - return retour; -} -/* - Fin de l'operation cai_En_majuscule -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_inverser_tableau_complet */ -/* ---------- */ -/* */ -/* ROLE : fonction d'inversion des poids forts et faible */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : cai_inverser_tableau_complet(tableau,nbpix,tailpix) */ -/* ---------------- */ -/* */ -/* tableau (E) (* uchar) : tableau à inverser */ -/* nbpix (E) (int) : nb de pixels du tableau */ -/* tailpix (E) (int) : nb d'octets d'un pixel */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -void cai_inverser_tableau_complet(unsigned char *tableau,int nbpix,int tailpix) -{ - int pix,ind,oct; - unsigned char *temp; - - - temp = (unsigned char *) calloc(tailpix,sizeof(unsigned char)); - - for (pix=0;pix<nbpix;pix=pix+1) - { - ind = pix*tailpix; - for (oct=0;oct<tailpix;oct++) - { - temp[oct] = tableau[ind + tailpix - oct -1 ]; - } - for (oct=0;oct<tailpix;oct++) - { - tableau[ind + oct ] = temp[oct]; - } - } -} -/* - Fin de l'operation cai_inverser_tableau_complet -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_En_minuscule */ -/* ---------- */ -/* */ -/* ROLE : Cette fonction transforme la chaine de caracteres donnee en */ -/* ROLE : parametre en minuscule et renvoie le resultat */ -/* */ -/* CONTEXTE D'APPEL : */ -/* */ -/* RETOUR : chaine en majuscule */ -/* */ -/*****************************************************************************/ - -char* cai_En_minuscule( char *mot ) -{ - char *retour; - int i = 0; - - /* allocation des pointeurs */ - - retour = (char*) NULL; - retour = (char*) calloc ( strlen ( mot ) + 1 , sizeof (char) ); - - if ( retour == NULL ) - { - return (char*)NULL; - } - /* Parcourir la chaine */ - - while ( mot[i] != '\0' ) - { - /* transformer en minuscule la lettre lue */ - retour[i] = tolower ( mot[i] ); - i++; - } - /* retourner le resultat */ - return retour; - } -/* - Fin de l'operation cai_En_minuscule -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_istyp_connu */ -/* ---------- */ -/* */ -/* ROLE : fonction de verification si pixels de type connu ou non */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : retour = cai_istyp_connu(type_code) */ -/* ---------------- */ -/* */ -/* type_code (E) (char *) : type de codage a verifier */ -/* retour (S) (int) : 1 si OK reconnu */ -/* -1 si non reconnu */ -/* */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -int cai_istyp_connu(char *type_code) -{ - int ind; /* indice de boucle sur les types reconnus */ - int trouve,icr; /* indice pour la recherche */ - -/* Initialisations diverses */ - trouve = -1; - ind = 0; - while ((trouve==-1)&&(ind< CAI_NB_TYPE)) - { - icr=strncmp(type_code,CAI_TYPE_CONNU[ind],strlen(type_code)); - if (icr==0) - trouve=ind; - else - ind=ind+1; - } - - -/* sortie normale */ - return(trouve); -} -/* - Fin de l'operation cai_istyp_connu -*/ diff --git a/Utilities/CAI/cai_dll/src/cai_gessimu.c b/Utilities/CAI/cai_dll/src/cai_gessimu.c deleted file mode 100755 index 834a40b3a1..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_gessimu.c +++ /dev/null @@ -1,1233 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_gessimu.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format gessimu (format Alcatel monocanal) */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : Septembre 1999 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 4.1 : FA : Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : FA : verification que l'image est codee sur un seul */ -/*octet par pixel (contrainte du format) */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : modifications open binaire pour PC/NT */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : test sur fclose pour PC/LINUX */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <unistd.h> -# include <stdlib.h> -# include <sys/types.h> -#include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> - -#define _CAI_IMAGE -#define IN_CAI_GESSIMU - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_gessimu.c,v 1.6 01/05/31 10:47:35 cmf Exp $"; - - -extern char *getenv(); - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_gessimu */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format gessimu */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_gessimu(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_gessimu (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -long int cai_liste_ima_gessimu (char *repert, - char ***tab_ima) - -{ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - struct dirent *dp; /* structure resultat de la fonction readdir */ - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - char car; /* variable de travail */ - int nb_ima; /* nombre d'images gessimu identifiees */ - long int i; /* indice de boucle */ - long int ll,dif; /* variables de travail */ - char blanc; /* caractere blanc */ - - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - blanc=' '; - dirp=opendir(repert); - - if(dirp!=NULL) - { -/*...................................... - - premiere passe pour comptabiliser les images du format donne - - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE GESSIMU - (EXTENSION =.pfe) - ..........................................*/ - - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,".pfe"); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - nb_ima=nb_ima+1; - - } - - } - - (void)closedir(dirp); -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT GESSIMU - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE GESSIMU - (EXTENSION =.pfe) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,".pfe"); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - { - *pch0='\0'; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - - } - } - - closedir(dirp); - - } - else - { - /* Erreur : Repertoire inexistant */ - nb_ima=-1; - } - - return(nb_ima); - -} -/* Fin de l'operation cai_liste_ima_gessimu -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_gessimu */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format gessimu */ -/* ----- */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_gessimu(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_gessimu (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_lecture_gessimu(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - int nbbit; /* nb de bits par pixel du fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines*/ - int i,num; /* indice */ - char type_cod[5]; /* type de codage du pixel */ - int detec1,detecF; /* 1er et dernier detecteur dans l'entete */ - int Tail_lig; /* taille d'une ligne sur disque (multi 4) */ - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1 : FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_lecture"); - } - else - { -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.pfe",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.pfe",nom_image); - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ - fic_in=NULL; - fic_in=fopen(nom_fic,"rb"); - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete GESSIMU"); - } - else - { -/*.................................... - positionnement sur le nombre de colonnes - .............................................*/ - fseek(fic_in,16,0); - -/*.................................. - recuperation du numero du premier detecteur - ...........................................*/ - fread(&detec1,4,1,fic_in); -/*.................................. - recuperation du dernier detecteur - ......................................*/ - fread(&detecF,4,1,fic_in); -/*.................................. - recuperation du nombre de lignes - ......................................*/ - fseek(fic_in,12,1); - fread(nb_lig,4,1,fic_in); -/*.................................. - calcul du nombre de colonne - ......................................*/ - *nb_col = detecF - detec1 ; -/*.................................. - initialisation du type de codage des pixels - ......................................*/ - image1->NB_BITS_PIX=8; - image1->NBOCT_PIX=1; - sprintf(image1->COD_PIX,"OCT"); - *nboct_pix = image1->NBOCT_PIX; - -/*.................................. - initialisation du nb de canaux (toujours monocanal) - ......................................................*/ - *nb_can = 1; - -/*.................................. - Calcul de la taille d'une ligne sur disque - ......................................................*/ - Tail_lig = (((*nb_col-1)/4)+1)*4; - - } -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in!=NULL) fclose(fic_in); - - if (iret !=0) - { -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.pfe",repert,nom_image); - } - else - { - sprintf(nom_fic_canal,"%s.pfe",nom_image); - } - - num=open(nom_fic_canal,O_RDONLY|O_BINARY,0); - if (num!= -1) - { - - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_image,"%s",image1->NOM_FIC_CAN); - sscanf(nom_image,"%s",image1->NOM_UTIL_CAN); - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=Tail_lig; - } - } - else - iret=0; - } - } - if (iret == 0) - { - return (NULL); - } - else - { - return(image1); - } - -} -/* - Fin de l'operation cai_ouvre_lecture_gessimu -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_gessimu */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format gessimu et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_gessimu(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_gessimu (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_creation_gessimu(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig, - char *label) - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - long retour; /* retour de fonction */ - int i,num; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - unsigned char *Header; /* entete du fichier gessimu */ - int taille_entete; /* taille de l'entete */ - int detec1,detecF; /* numero du 1er et dernier detecteur */ - double h_moyen; - -/*********************************************/ -/* Verification qu'un seul canal est demande */ -/*********************************************/ - if (*nb_can != 1) - { - image1 = NULL; - sprintf ( CAI_ERREUR , - "Une image GESSIMU ne peut contenir qu'un seul canal"); - goto ERREUR; - } -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : FA : verification que l'image est codee sur un seul */ -/*octet par pixel (contrainte du format) */ -/*****************************************************************************/ - if (*nboct_pix != 1) - { - image1 = NULL; - sprintf ( CAI_ERREUR , - "Une image GESSIMU ne peutetre codee que sur un seul octet par pixel"); - goto ERREUR; - } - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1 : FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } - -/*................................................. - Constitution du nom du fichier entete et verification qu'il - n'existe pas deja - .................................................*/ - - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.pfe",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.pfe",nom_image); - } - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s GESSIMU existe \n" , nom_image ); - goto ERREUR; - } - -/*...................................................... - Ouverture du fichier entete en ecriture - Ecriture du contenu - ..........................................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ - - fic = fopen(nom_fic,"wb"); - if (fic == NULL) - { - sprintf(CAI_ERREUR,"Erreur: Creation fichier %s impossible\n",nom_fic); - goto ERREUR; - } - taille_entete = (((*nb_col-1)/4)+1)*4; - Header = (unsigned char *) calloc(taille_entete,sizeof( unsigned char)); - if (Header == NULL) - { - sprintf(CAI_ERREUR,"Erreur alloc: Creation fichier %s impossible\n", - nom_fic); - goto ERREUR; - } - -/*******************************************/ -/* ecriture du 1ER detecteur de l'image */ -/*******************************************/ - detec1 = 1; - memcpy(&Header[16],&detec1 , 4 ); - -/************************************************/ -/* ecriture du dernier detecteur de l'image */ -/************************************************/ - detecF = *nb_col; - memcpy(&Header[20],&detecF , 4 ); - -/*********************************************/ -/* ecriture du nombre de colonnes de l'image */ -/*********************************************/ - memcpy(&Header[24],nb_col , 4 ); - -/*********************************************/ -/* ecriture du nombre de lignes de l'image */ -/*********************************************/ - memcpy(&Header[36],nb_lig , 4 ); - -/***************************************************/ -/* ecriture de la taille d'une ligne multiple de 4 */ -/***************************************************/ - memcpy(&Header[40],&taille_entete , 4 ); - -/************************************************/ -/* ecriture du h_moyen (double 0) */ -/************************************************/ - h_moyen = 0.; - memcpy(&Header[44],&h_moyen , 8 ); - - retour = fwrite ( Header , taille_entete , 1 , fic ); - free(Header); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , - "Erreur : ecriture entete impossible dans fichier %s\n", - nom_fic ); - goto ERREUR; - } - -/*************************************************/ -/* Fermeture du fichier */ -/*************************************************/ - - fclose ( fic ); - - num = open(nom_fic,O_RDWR|O_BINARY,PERMS); - if (num == -1) - { - - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic); - goto ERREUR; - } - - for (i=0;i<*nb_can;i=i+1) - { - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=taille_entete; - } - - return (image1); - -ERREUR : - return(NULL); -} - -/* - Fin de l'operation cai_ouvre_creation_gessimu -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_gessimu */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image GESSIMU */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_gessimu(image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_gessimu (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_lecture_canal_gessimu(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) -{ - - int num,i,j,k,kk; /* variables de travail */ - long pt_oct,n; /* position courante dans le fichier image */ - int no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - int lig; /* indice de boucle sur les lignes */ - int oct_pix; /* nb octets par pixels */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - int Tail_lig; /* Taille physique d'une ligne sur disque */ - -/*********************************************/ -/* Verification qu'un seul canal est demande */ -/*********************************************/ - if (*canal != 1) - { - image1 = NULL; - sprintf ( CAI_ERREUR , - "Une image GESSIMU ne contient qu'un seul canal"); - iret=CAI_KO; - } - else - { -/*........................... - Initialisations diverses - ..........................*/ - iret=CAI_OK; - num=image1->ACCES_CANAL_INT[*canal-1]; - oct_pix=image1->NBOCT_PIX; - Tail_lig = (((image1->NB_COL-1)/4)+1)*4; - -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - - buf_lec = (unsigned char *) calloc(Tail_lig,sizeof(unsigned char)); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - } - else - { -/*.................... - Initialisation - ......................*/ - lig=*premiere_ligne; - i=1; - pch=data_image; - -/*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i <= *nombre_lignes_lire)&&(iret==CAI_OK)) - { -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - - no_oct=image1->POS_OCTET[*canal-1]+(lig-1)*Tail_lig; - - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture d'une ligne image - ................................................*/ - n=read(num,buf_lec,Tail_lig); - - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image GESSIMU"); - } - else - { -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - deb=buf_lec+(*premiere_colonne-1)*oct_pix; - j=1; - while (j <= *nombre_colonnes_lire) - { - *pch=*deb; - j=j+1; - pch=pch+1; - deb=deb+(*pas_colonne); - } - - } - i=i+1; - lig=lig+(*pas_ligne); - } - - free(buf_lec); - } - } - return(iret); -} -/* - Fin de l'operation cai_lecture_canal_gessimu -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_gessimu */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image gessimu */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_gessimu(image1, canal, */ /* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de colonnes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_gessimu (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_ecriture_canal_gessimu (CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) -{ -long position_first_lig; /* position de la 1ere ligne a ecrire */ -long position_courante; /* position courante dans le fichier */ -long deplacement; /* deplacement a effectuer */ -unsigned char *buff_lig; /* pointeur de travail bandeau a ecrire */ -long cr_write; /* code retour de write */ -int num; /* descripteur de fichier */ -int nboct_pix; /* nombre d'octets par pixel */ -int nb_canaux; /* nombre de canaux de l'image totale */ -int nboct_ecrire; /* nb d'octets du bandeau a ecrire */ -int Tail_lig; /* taille en octet d'une ligne (mult 4) */ -int ind,i; /* variables de travail */ - -/*********************************************/ -/* Verification qu'un seul canal est demande */ -/*********************************************/ - if (*canal != 1) - { - image1 = NULL; - sprintf ( CAI_ERREUR , - "Une image GESSIMU ne contient qu'un seul canal"); - goto ERREUR; - } - -/* ................ - Initialisations - .................*/ - - num = image1->ACCES_CANAL_INT[*canal-1]; - nboct_pix = image1->NBOCT_PIX; - nb_canaux = 1; - position_first_lig = 0; - position_courante = 0; - deplacement = 0; - nboct_ecrire = 0; - Tail_lig = (((image1->NB_COL-1)/4)+1)*4; - buff_lig = NULL; - buff_lig = (unsigned char *) calloc(Tail_lig,sizeof(unsigned char)); - if (buff_lig == NULL) - { - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - goto ERREUR; - } - /********************************************************/ -/* Calcul de la position de la premiere ligne a ecrire */ -/********************************************************/ - - position_first_lig = (long) ( image1->POS_OCTET[*canal-1] + - + (*premiere_ligne - 1) * Tail_lig); - -/********************************************************/ -/* Recuperation de la position courante */ -/********************************************************/ - - position_courante = lseek ( num , 0L , 1 ); - -/********************************************************/ -/* Calcul du deplacement jusqu'a la 1ere ligne a ecrire */ -/********************************************************/ - - deplacement = position_first_lig - position_courante; - -/*******************************************************/ -/* deplacement jusqu'a la premiere ligne a ecrire */ -/*******************************************************/ - - lseek ( num , deplacement , 1 ); - -/***********************************************/ -/* ecriture des lignes */ -/***********************************************/ - nboct_ecrire = *nombre_colonnes_ecrire; - ind = 0; - i = 0; - -/*..................... - Pour chaque ligne a lire - .............................*/ - while (i < *nombre_lignes_ecrire) - { - memcpy(buff_lig,&data_image[ind] , nboct_ecrire ); - - - cr_write = write ( num , buff_lig,Tail_lig); - - if ( cr_write != Tail_lig) - { - strcpy ( CAI_ERREUR , - "Erreur ecriture canal image gessimu\n" ); - goto ERREUR; - } - ind = ind + nboct_ecrire; - i = i + 1; - } -if (buff_lig != NULL) free(buff_lig); - -return (CAI_OK); - -ERREUR : - -if (buff_lig != NULL) free(buff_lig); -return (CAI_KO); - - -} -/* - Fin de l'operation cai_ecriture_canal_gessimu -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_gessimu */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format gessimu et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_gessimu(image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_gessimu (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_gessimu (CAI_IMAGE *image1) - -{ - - int iret; /* code retour de l'operation */ - int i_can; /* indice du canal a fermer */ - int num; /* descripteur du fichier a fermer */ - - iret=CAI_OK; -/*............................................. - Fermeture du fichier qui contient tous les canaux - .............................................*/ - num=image1->ACCES_CANAL_INT[0]; - if (num>0) close(num); - - - return (iret); -} - -/* - Fin de l'operation cai_ferme_gessimu -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_gessimu */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en gessimu et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_gessimu(repertoire,nom_ima) */ /* ------------------ */ -/* repertoire (E) (char *) : repertoire de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_gessimu (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_dest_ima_gessimu ( char *repertoire , - char *nom_ima ) - -{ -int i_can; /* compteur de canaux */ -int iret; /* code retour fonction fermetrue lecture */ -char str_num_canal[3]; /* suffixe numero du canal */ -char nom_fic_entete[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ -char nom_fic_canal[1024]; /* nom du fichier canal a detruire */ - -int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ - -CAI_IMAGE *image1; /* structure ouverture image */ -int nb_can; /* nombre de canaux de l'image */ -int nboct_pix; /* nombre d'octets par pixel image */ -int nb_col; /* nombre de colonnes de l'image */ -int nb_lig; /* nombre de lignes de l'image */ - -/************************************************/ -/* Constitution du nom du fichier d'entete */ -/************************************************/ - -if ((long)strlen(repertoire)!= 0) -{ - sprintf( nom_ima_complet, "%s/%s" ,repertoire,nom_ima); -} -else -{ - strcpy ( nom_ima_complet , nom_ima); -} - sprintf(nom_fic_entete ,"%s.pfe", nom_ima_complet); - -/************************************************/ -/* Destruction du fichier d'entete */ -/************************************************/ - -cr_stat = stat ( nom_fic_entete , &buf_stat ); -if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); - - -return (CAI_OK); - -} -/* - Fin de l'operation cai_dest_ima_gessimu -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_gessimu */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture-ecriture d'une image au format */ -/* ----- gessimu et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_gessimu(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_gessimu (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_modifie_gessimu(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - int nbbit; /* nb de bits par pixel du fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines*/ - int i,num; /* indice */ - char type_cod[5]; /* type de codage du pixel */ - int detec1,detecF; /* 1er et dernier detecteur dans l'entete */ - int Tail_lig; /* taille d'une ligne sur disque (multi 4) */ - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1 : FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_modifie"); - } - else - { -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.pfe",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.pfe",nom_image); - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ - - fic_in=fopen(nom_fic,"rb"); - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete GESSIMU"); - } - else - { -/*.................................... - positionnement sur le nombre de colonnes - .............................................*/ - fseek(fic_in,16,0); -/*.................................. - recuperation du numero du premier detecteur - ...........................................*/ - fread(&detec1,4,1,fic_in); -/*.................................. - recuperation du dernier detecteur - ......................................*/ - fread(&detecF,4,1,fic_in); -/*.................................. - recuperation du nombre de lignes - ......................................*/ - fseek(fic_in,12,1); - fread(nb_lig,4,1,fic_in); -/*.................................. - calcul du nombre de colonne - ......................................*/ - *nb_col = detecF - detec1 ; -/*.................................. - initialisation du type de codage des pixels - ......................................*/ - image1->NB_BITS_PIX=8; - image1->NBOCT_PIX=1; - sprintf(image1->COD_PIX,"OCT"); - *nboct_pix = image1->NBOCT_PIX; - -/*.................................. - initialisation du nb de canaux (toujours monocanal) - ......................................................*/ - *nb_can = 1; - -/*.................................. - Calcul de la taille d'une ligne sur disque - ......................................................*/ - Tail_lig = (((*nb_col-1)/4)+1)*4; - - } -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in!=NULL) fclose(fic_in); - - if (iret !=0) - { -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.pfe",repert,nom_image); - } - else - { - sprintf(nom_fic_canal,"%s.pfe",nom_image); - } - - num=open(nom_fic_canal,O_RDWR|O_BINARY,0); - if (num!= -1) - { - - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_image,"%s",image1->NOM_FIC_CAN); - sscanf(nom_image,"%s",image1->NOM_UTIL_CAN); - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=Tail_lig; - } - } - else - iret=0; - } - } - if (iret == 0) - { - return (NULL); - } - else - { - return(image1); - } - -} -/* - Fin de l'operation cai_ouvre_modifie_gessimu -*/ - diff --git a/Utilities/CAI/cai_dll/src/cai_grilles.c b/Utilities/CAI/cai_dll/src/cai_grilles.c deleted file mode 100755 index 676b925c7b..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_grilles.c +++ /dev/null @@ -1,1916 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_grilles.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format gdb (Grille de Decalages Bruts) et au */ -/* format gdr (Grille de Decalages Restitues) */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : Septembre 99 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM :fonctions de test machine et inversions */ -/* deviennent generiques */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : modifications open binaire pour PC/NT */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : test sur fclose pour PC/LINUX */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <stdlib.h> -# include <unistd.h> -# include <sys/types.h> -# include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> -# include <malloc.h> -# include <math.h> -# include <unistd.h> - -#define _CAI_IMAGE -#define IN_CAI_GRIL - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_grilles.c,v 1.6 01/05/31 10:47:38 cmf Exp $"; - - -extern char *getenv(); - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_grilles */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format gdb */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_grilles(typ_grille,repert,tab_ima) */ -/* ----------------- */ -/* */ -/* typ_grille (E) (char) : type de grille B=Brute, R=rectifiee */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_grilles (S) (int) : = -1 repertoire inexistant */ -/* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -long int cai_liste_ima_grilles (char typ_grille,char *repert,char ***tab_ima) - -{ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - struct dirent *dp; /* structure resultat de la fonction readdir */ - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - char car; /* variable de travail */ - int nb_ima; /* nombre d'images gdb identifiees */ - long int i; /* indice de boucle */ - long int ll,dif; /* variables de travail */ - char blanc; /* caractere blanc */ - char extens[5]; /* extension recherchee */ - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - extens[0]='\0'; - if (typ_grille=='B') - strcpy(extens,".gdb"); - else - strcpy(extens,".gdr"); - nb_ima=0; - blanc=' '; - dirp=opendir(repert); - - if(dirp!=NULL) - { -/*...................................... - - premiere passe pour comptabiliser les images du format donne - - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE GDB ou GDR - (EXTENSION =.gdb pour Brute ou .gdr pour Rectifiee) - ......................................................*/ - - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,extens); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - nb_ima=nb_ima+1; - - } - - } - - closedir(dirp); -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT GDB ou GDR - .......................................................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE GDB ou GDR - (EXTENSION =.gdb ou .gdr) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,extens); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - { - *pch0='\0'; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - - } - } - - closedir(dirp); - - } - else - { - /* Erreur : Repertoire inexistant */ - nb_ima=-1; - } - - return(nb_ima); - -} -/* Fin de l'operation cai_liste_ima_grilles -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_grilles */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image format gdb ou gdr */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_grilles(typ_grille, */ -/* ---------------- nom_image, */ -/* nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* typ_grille (E) (char) : type de grille B=Brute, R=rectifiee */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_grilles (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_lecture_grilles(char typ_grille, - char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence */ - int nbbit; /* nb de bits par pixel du fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines */ - int i,num; /* indice */ - char type_cod[5]; /* type de codage du pixel */ - int temp; /* zone temporaire de lecture */ - char extens[5]; /* extension recherchee */ - char type_image[3]; /* type code+ordre rangement octets dans entete*/ - char *type_machine; /* ordre rangement octets machine travail */ - char buf[59]; /* buffer contenant entete image */ - int v; /* comparaison type machine-type image */ - char *v1; /* comparaison type image avec chaine vide */ - int nb_col2, nb_lig2; /* variables intermediaires inversion octets */ - int temp2,nb; /* zone temporaire de lecture */ - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - - type_machine = (char *) calloc(3,sizeof(char)); - - if (type_machine == NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_lecture"); - } - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_lecture"); - } - else - { - - extens[0]='\0'; - if (typ_grille =='B') - strcpy(extens,".gdb"); - else - strcpy(extens,".gdr"); - -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long)strlen(repert)!= 0) - { - sprintf(nom_fic,"%s/%s%s",repert,nom_image,extens); - } - else - { - sprintf(nom_fic,"%s%s",nom_image,extens); - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ - fic_in=NULL; - fic_in=fopen(nom_fic,"rb"); - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete grille"); - } - else - { - - -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ - -/*.................................. - recuperation infos completes format.gdb - ......................................*/ - - if (typ_grille =='B') - fread(buf,36,1,fic_in); - -/*.................................. - recuperation infos completes format.gdr - ......................................*/ - else fread(buf,56,1,fic_in); - -/*.................................. - recuperation du type de codage des pixels - ......................................*/ - memcpy(type_cod,&buf[8],4); - - if (strncmp(type_cod,"FLOA",4) ==0) - { - image1->NB_BITS_PIX=32; - image1->NBOCT_PIX=4; - sprintf(image1->COD_PIX,"R4"); - strcpy(type_image,"BE"); - sprintf(image1->TYPE_COD,"FLOA"); - } - - else if (strncmp(type_cod,"FLOL",4) ==0) - { - image1->NB_BITS_PIX=32; - image1->NBOCT_PIX=4; - sprintf(image1->COD_PIX,"R4"); - strcpy(type_image,"LE"); - sprintf(image1->TYPE_COD,"FLOL"); - } - - else - { - iret=0; - sprintf(CAI_ERREUR,"Type de codage GRILLE non reconnu : %s",type_cod); - } - - *nboct_pix = image1->NBOCT_PIX; - -/*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - - type_machine = cai_test_pFpf(); - - /*.................................. - determination des autres infos - en fonction inversion - ......................................*/ - - v = strncmp(type_machine,type_image,2); - v1 = strrchr(type_image,'E'); - -/*.................................. - recuperation du nombre de colonne - ......................................*/ - memcpy(nb_col,&buf[0],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - nb=2; - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)nb_col, (void*)&nb_col2,4 ); - cai_inverser_tableau((short *)nb_col, (short *)&nb_col2,nb); - } - -/*.................................. - recuperation du nombre de lignes - ......................................*/ - memcpy(nb_lig,&buf[4],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)nb_lig, (void*)&nb_lig2,4 ); - cai_inverser_tableau((short *)nb_lig, (short *)&nb_lig2, nb); - } - -/*..................................................................... - recuperation du numero de ligne du 1er point de la matrice - .....................................................................*/ - - memcpy(&temp,&buf[12],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)&temp, (void*)&temp2,4 ); - cai_inverser_tableau((short *)&temp, (short *)&temp2,nb); - } - - image1->NUM_LIG_DEB = temp; - -/*..................................................................... - recuperation du numero de colonne du 1er point de la matrice - .....................................................................*/ - - memcpy(&temp,&buf[16],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)&temp, (void*)&temp2,4 ); - cai_inverser_tableau((short *)&temp, (short *)&temp2, nb); - } - - image1->NUM_COL_DEB = temp; - -/*..................................................................... - recuperation du pas de la grille le long des lignes - .....................................................................*/ - - memcpy(&temp,&buf[20],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)&temp, (void*)&temp2,4 ); - cai_inverser_tableau((short *)&temp, (short *)&temp2,nb); - } - - image1->PAS_GRIL_LIG = temp; - -/*..................................................................... - recuperation du pas de la grille le long des colonnes - .....................................................................*/ - - memcpy(&temp,&buf[24],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)&temp, (void*)&temp2,4 ); - cai_inverser_tableau((short *)&temp, (short *)&temp2,nb); - } - - image1->PAS_GRIL_COL = temp; - -/*..................................................................... - recuperation du decalage initial le long des lignes - .....................................................................*/ - - memcpy(&temp,&buf[28],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)&temp, (void*)&temp2,4 ); - cai_inverser_tableau((short *)&temp, (short *)&temp2,nb); - } - - image1->DECAL_LIG = temp; - -/*..................................................................... - recuperation du decalage initial le long des colonnes - .....................................................................*/ - - memcpy(&temp,&buf[32],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)&temp, (void*)&temp2,4 ); - cai_inverser_tableau((short *)&temp,(short *) &temp2,nb); - } - - image1->DECAL_COL = temp; - -/*..................................................................... - recuperation de la caracteristique de la grille si .gdr -.....................................................................*/ - if (typ_grille == 'R') - { - memcpy(image1->CAR_GRIL,&buf[36],20); - *nb_can = 2; - } - else - *nb_can = 3; - } - -/**************************/ -/* fin modifications */ -/**************************/ - -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in != NULL) fclose(fic_in); - - if (iret !=0) - { -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - - nom_fic_canal[0]='\0'; - - if ((long)strlen(repert)!= 0) - { - sprintf(nom_fic_canal,"%s/%s%s",repert,nom_image,extens); - } - else - { - sprintf(nom_fic_canal,"%s%s",nom_image,extens); - } - - num=open(nom_fic_canal,O_RDONLY|O_BINARY,0); - if (num!= -1) - { - - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_image,"%s",image1->NOM_FIC_CAN); - sscanf(nom_image,"%s",image1->NOM_UTIL_CAN); - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=((i*(*nb_lig))+1)*(*nb_col)*image1->NBOCT_PIX; - } - - -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ - - if ( (v!=0) && (v1!=NULL) ) - { - image1->INV_OCTETS =1; - } - else - { - image1->INV_OCTETS =0; - } - -/**************************/ -/* fin modifications */ -/**************************/ - - } - else - iret=0; - } - - } - if (iret == 0) - { - return (NULL); - } - else - { - return(image1); - } - -} -/* - Fin de l'operation cai_ouvre_lecture_grilles -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_grilles */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format gdb ou gdr (grilles brutes ou restituees) */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_grilles(typ_grille, */ -/* ---------------- nom_image, */ -/* nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* typ_grille (E) (char) : type de grille B=Brute, R=rectifiee */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_grilles (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_creation_grilles(char typ_grille,char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig, - char *label) - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - long retour; /* retour de fonction */ - int i,num; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - unsigned char *Header; /* entete du fichier gdb */ - int taille_entete; /* taille de l'entete */ - int temp; /* zone temporaire pour ecriture */ - char extens[5]; /* extension recherchee */ - int Min_nbcol; /* nombre de colonnes minimums */ - char *type_image; /* type code+ordre rangement des octets ds entete */ - - extens[0]='\0'; - if (typ_grille == 'B') - { - Min_nbcol = 9; - strcpy(extens,".gdb"); - -/******************************************************************/ -/* Verification que les trois plans sont demandes */ -/* -> plan1 : grille pour les decalages le long des lignes */ -/* -> plan2 : grille pour les decalages le long des colonnes */ -/* -> plan3 : grille pour les indices de confiance */ -/******************************************************************/ - if (*nb_can != 3) - { - image1 = NULL; - sprintf ( CAI_ERREUR , - "Une image GDB doit contenir trois plans"); - goto ERREUR; - } - } - else - { -/******************************************************************/ -/* Verification que les deux plans sont demandes */ -/* -> plan1 : grille pour les decalages le long des lignes */ -/* -> plan2 : grille pour les decalages le long des colonnes */ -/******************************************************************/ - if (*nb_can != 2) - { - image1 = NULL; - sprintf ( CAI_ERREUR , - "Une image GDR doit contenir deux plans"); - goto ERREUR; - } - strcpy(extens,".gdr"); - Min_nbcol = 14; - - } - -/**************************************************************/ -/* Verification que le nombre minimum de colonnes est demande */ -/**************************************************************/ - if ((*nb_col)< Min_nbcol) - { - image1 = NULL; - sprintf ( CAI_ERREUR , - "Une image doit contenir au moins %d colonnes",Min_nbcol); - goto ERREUR; - - } - taille_entete = (*nb_col)*(*nboct_pix); - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } - -/*................................................. - Constitution du nom du fichier entete et verification qu'il - n'existe pas deja - .................................................*/ - - nom_fic[0]='\0'; - if ((long)strlen(repert)!= 0) - { - sprintf(nom_fic,"%s/%s%s",repert,nom_image,extens); - } - else - { - sprintf(nom_fic,"%s%s",nom_image,extens); - } - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s GRILLE existe \n" , nom_image ); - goto ERREUR; - } - -/*...................................................... - Ouverture du fichier entete en ecriture - Ecriture du contenu - ..........................................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ - fic = fopen(nom_fic,"wb"); - if (fic == NULL) - { - sprintf(CAI_ERREUR,"Erreur: Creation fichier %s impossible\n",nom_fic); - goto ERREUR; - } - Header = (unsigned char *) calloc(taille_entete,sizeof( unsigned char)); - if (Header == NULL) - { - sprintf(CAI_ERREUR,"Erreur alloc: Creation fichier %s impossible\n", - nom_fic); - goto ERREUR; - } - -/*********************************************/ -/* ecriture du nombre de colonnes de l'image */ -/*********************************************/ - memcpy(Header,nb_col , 4 ); - -/*******************************************/ -/* ecriture du nombre de lignes de l'image */ -/*******************************************/ - memcpy(&Header[4],nb_lig , 4 ); - -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ - -/*****************************************/ -/* ecriture type de l'image dans la zone */ -/* reservee au type de codage */ -/*****************************************/ - - /*.................................... - test sur la machine de travail pour - typer image en LE ou BE - .....................................*/ - - type_image = cai_test_pFpf(); - - - -/**************************************/ -/* ecriture type de codage de l'image */ -/**************************************/ - if (*nboct_pix != 4) - { - sprintf ( CAI_ERREUR , - "Erreur : La grille foit etre codee en FLOAT\n"); - goto ERREUR; - } - - else if ( (*nboct_pix == 4) && (strncmp(type_image,"BE",2)==0) ) - { - memcpy(&Header[8],"FLOA" , 4 ); - image1->NBOCT_PIX=4; - sprintf(image1->TYPE_COD,"FLOA"); - } - - else if ( (*nboct_pix == 4) && (strncmp(type_image,"LE",2)==0) ) - { - memcpy(&Header[8],"FLOL" , 4 ); - image1->NBOCT_PIX=4; - sprintf(image1->TYPE_COD,"FLOL"); - } - - -/***********************/ -/* fin modifications */ -/***********************/ - - -/***************************************************************/ -/* ecriture de l'entete ainsi constituee dans le fichier */ -/***************************************************************/ - retour = fwrite ( Header , taille_entete , 1 , fic ); - free(Header); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , - "Erreur : ecriture entete impossible dans fichier %s\n", - nom_fic ); - goto ERREUR; - } - -/*************************************************/ -/* Fermeture du fichier */ -/*************************************************/ - - fclose ( fic ); - - num = open(nom_fic,O_RDWR|O_BINARY,PERMS); - if (num == -1) - { - - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic); - goto ERREUR; - } - - for (i=0;i<*nb_can;i=i+1) - { - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=((i*(*nb_lig))+1)*(*nb_col)*image1->NBOCT_PIX; - } - return (image1); - -ERREUR : - return(NULL); -} - -/* - Fin de l'operation cai_ouvre_creation_grilles -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_grilles */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image GDB ou GDR */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_grilles(image1, */ -/* ------------------ canal,premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_grilles (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_lecture_canal_grilles(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) - -{ - - int num,i,j,k,kk; /* variables de travail */ - long pt_oct,n; /* position courante dans le fichier image */ - int no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - int lig; /* indice de boucle sur les lignes */ - int oct_pix; /* nb octets par pixels */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - long oct_lig; /* nb oct. par ligne en considerant taille pixel */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - unsigned char *data_image2;/* pointeur donnees image pour inversion octets */ - int taille_image; /* taille en octets de l'image */ - int Nb; - - -/*........................... - Initialisations diverses - ..........................*/ - iret=CAI_OK; - num=image1->ACCES_CANAL_INT[*canal-1]; - oct_pix=image1->NBOCT_PIX; - taille_image = (*nombre_lignes_lire)*oct_pix*(*nombre_colonnes_lire); - data_image2 = NULL; - data_image2 = (unsigned char *) calloc(taille_image,sizeof(unsigned char)); - - if (data_image2 == NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_lecture_canal"); - iret=CAI_KO; - goto FIN; - } - -/*.............................................................*/ -/* verification si lecture non sous-echantillonnee par bandeau */ -/*.............................................................*/ - if ((*nombre_colonnes_lire==image1->NB_COL)&&(*premiere_colonne==1)&& - (*pas_ligne==1)&&(*pas_colonne==1)) - { - oct_lig=(*nombre_lignes_lire)*oct_pix*(image1->NB_COL); - pch=data_image; - -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - lig=*premiere_ligne; - no_oct=image1->POS_OCTET[*canal-1]+ - (lig-1)*image1->NB_COL*oct_pix; - - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture des lignes completes - ................................................*/ - n=read(num,pch,oct_lig); - - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image grille"); - goto FIN; - - } - - } - else - { - oct_lig=oct_pix*image1->NB_COL; - -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - buf_lec=NULL; - buf_lec = (unsigned char *) calloc(oct_lig,sizeof(unsigned char)); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - } - else - { -/*.................... - Initialisation - ......................*/ - lig=*premiere_ligne; - i=1; - pch=data_image; - -/*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i <= *nombre_lignes_lire)&&(iret==CAI_OK)) - { -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - - no_oct=image1->POS_OCTET[*canal-1]+ - (lig-1)*image1->NB_COL*oct_pix; - - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture d'une ligne image - ................................................*/ - n=read(num,buf_lec,oct_lig); - - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image GRILLE"); - } - else - { -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - deb=buf_lec+(*premiere_colonne-1)*oct_pix; - j=1; - while (j <= *nombre_colonnes_lire) - { - for (k=0;k<oct_pix;k=k+1) - { - *(pch+k)=*(deb+k); - } - j=j+1; - pch=pch+oct_pix; - deb=deb+(*pas_colonne*oct_pix); - } - - } - i=i+1; - lig=lig+(*pas_ligne); - } - - free(buf_lec); - buf_lec=NULL; - } - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ - - Nb = taille_image/2; - - if ( (iret!= CAI_KO) && (image1->INV_OCTETS==1) ) - { - - /*modification ordre des 4 octets par pixel*/ - swab( (void*)(data_image), (void*)(data_image2), taille_image); - cai_inverser_tableau(data_image, data_image2,Nb); - } - -/*************************/ -/* fin modifications */ -/*************************/ - FIN: - if (data_image2!= NULL) free(data_image2); - return(iret); -} -/* - Fin de l'operation cai_lecture_canal_grilles -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_grilles */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image gdb */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_grilles(image1, canal, */ -/* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de colonnes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_grilles (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_ecriture_canal_grilles (CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) - -{ -long position_first_lig; /* position de la 1ere ligne a ecrire */ -long position_courante; /* position courante dans le fichier */ -long deplacement; /* deplacement a effectuer */ -unsigned char *buff_lig; /* pointeur de travail bandeau a ecrire */ -long cr_write; /* code retour de write */ -int num; /* descripteur de fichier */ -int nboct_pix; /* nombre d'octets par pixel */ -int nboct_ecrire; /* nb d'octets du bandeau a ecrire */ - - -/* ................ - Initialisations - .................*/ - - num = image1->ACCES_CANAL_INT[*canal-1]; - nboct_pix = image1->NBOCT_PIX; - position_first_lig = 0; - position_courante = 0; - deplacement = 0; - nboct_ecrire = 0; - -/********************************************************/ -/* Calcul de la position de la premiere ligne a ecrire */ -/********************************************************/ - - position_first_lig = (long) ( image1->POS_OCTET[*canal-1] + - + (*premiere_ligne - 1) * - (*nombre_colonnes_ecrire) * nboct_pix ); - - -/********************************************************/ -/* Recuperation de la position courante */ -/********************************************************/ - - position_courante = lseek ( num , 0L , 1 ); - - -/********************************************************/ -/* Calcul du deplacement jusqu'a la 1ere ligne a ecrire */ -/********************************************************/ - - deplacement = position_first_lig - position_courante; - -/*******************************************************/ -/* deplacement jusqu'a la premiere ligne a ecrire*/ -/*******************************************************/ - - lseek ( num , deplacement , 1 ); - -/***********************************************/ -/* poistion en debut de bandeau a ecrire */ -/***********************************************/ - - buff_lig = data_image; - -/********************************************************/ -/* ecriture des lignes */ -/********************************************************/ - nboct_ecrire = (*nombre_colonnes_ecrire)*nboct_pix* - (*nombre_lignes_ecrire); - - cr_write = write ( num , buff_lig,nboct_ecrire); - - if ( cr_write != nboct_ecrire) - { - strcpy ( CAI_ERREUR , "Erreur ecriture canal image grille\n" ); - goto ERREUR; - } - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} -/* - Fin de l'operation cai_ecriture_canal_grilles -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_grilles */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format gdb ou gdr */ -/* ----- */ -/* Mise a Jour de l'entete si image ouverte en creation */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_grilles(typ_grille,image1) */ -/* ------------------ */ -/* */ -/* typ_grille (E) (char) : type de grille B=Brute, R=rectifiee */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_grilles (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_grilles (char typ_grille,CAI_IMAGE *image1) - -{ - - int iret; /* code retour de l'operation */ - int i_can; /* indice du canal a fermer */ - int num; /* descripteur du fichier a fermer */ - unsigned char *Header; /* entete du fichier gdb */ - int taille_entete; /* taille de l'entete a mettre a jour */ - long pt_oct,tempi; /* position courante ds fichier image */ - int temp,i; /* variable temporaire */ - char *type_image; /* ordre rangement octets dans entete */ - - -/****************************/ -/* Initialisations diverses */ -/****************************/ -iret=CAI_OK; -num=image1->ACCES_CANAL_INT[0]; - -/*--------------------------------------------------*/ -/* Mise a jour de l'entete si ouverture en creation */ -/*--------------------------------------------------*/ - -if (image1->MODE == CAI_ECRITURE) -{ - taille_entete = 46; - Header = (unsigned char *) calloc(taille_entete,sizeof( unsigned char)); - if (Header == NULL) - { - sprintf(CAI_ERREUR, - "Erreur alloc: Mise a jour entete grille impossible\n"); - goto ERREUR; - } - - pt_oct=lseek(num,0L,0); - -/*******************************************************/ -/* ecriture nombre de colonnes */ -/*******************************************************/ - temp = image1->NB_COL; - memcpy(Header,&temp , 4 ); - -/*******************************************************/ -/* ecriture nombre de ligne */ -/*******************************************************/ - temp = image1->NB_LIG; - memcpy(&Header[4],&temp , 4 ); - -/*****************************************************************/ -/* ecriture du type de codage en fonctions de la taille du pixel */ -/* et du codage des Poids Forts, poids faibles */ -/*****************************************************************/ - memcpy(&Header[8],image1->TYPE_COD , 4 ); - - tempi = write ( num,Header , 12 ); - if ( tempi == 0 ) - { - sprintf ( CAI_ERREUR , - "Erreur : MAJ entete a la fermeture impossible ds fichier grille\n"); - goto ERREUR; - } -/***************************************************************/ -/* ecriture du numero de ligne du 1er point de la matrice */ -/***************************************************************/ - temp = image1->NUM_LIG_DEB; - memcpy(Header,&temp , 4 ); - - -/***************************************************************/ -/* ecriture du numero de ligne du 1er point de la matrice */ -/***************************************************************/ - temp = image1->NUM_COL_DEB; - memcpy(&Header[4],&temp , 4 ); - - -/***************************************************************/ -/* ecriture du pas de la grille le long des lignes */ -/***************************************************************/ - temp = image1->PAS_GRIL_LIG; - memcpy(&Header[8],&temp , 4 ); - - -/***************************************************************/ -/* ecriture du pas de la grille le long des colonnes */ -/***************************************************************/ - temp = image1->PAS_GRIL_COL; - memcpy(&Header[12],&temp , 4 ); - - -/***************************************************************/ -/* ecriture du decalage initial le long des lignes */ -/***************************************************************/ - temp = image1->DECAL_LIG; - memcpy(&Header[16],&temp , 4 ); - - -/***************************************************************/ -/* ecriture du decalage initial le long des colonnes */ -/***************************************************************/ - temp = image1->DECAL_COL; - memcpy(&Header[20],&temp , 4 ); - - -/******************************************************************/ -/* ecriture de la caracteristique de la grille si gdr (restituee) */ -/******************************************************************/ - - if (typ_grille == 'R') - { - memcpy(&Header[24],image1->CAR_GRIL, 20 ); - - } - -/***************************************************************/ -/* mise a jour de l'entete ainsi constituee dans le fichier */ -/***************************************************************/ - tempi = write ( num, Header , taille_entete ); - free(Header); - if ( tempi == 0 ) - { - sprintf ( CAI_ERREUR , - "Erreur : MAJ entete a la fermeture impossible ds fichier grille\n"); - goto ERREUR; - } - } -/*............................................. - Fermeture du fichier qui contient tous les canaux - .............................................*/ - if (num>0) close(num); - - return (iret); - -ERREUR: - return(CAI_KO); -} - -/* - Fin de l'operation cai_ferme_grilles -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_grilles */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en gdb ou gdr */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_grilles(typ_grille,repertoire, */ -/* ------------------ nom_ima) */ -/* */ -/* typ_grille (E) (char) : type de grille B=Brute, R=rectifiee */ -/* repertoire (E) (char *) : repertoire de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_grilles (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_dest_ima_grilles ( char typ_grille,char *repertoire , - char *nom_ima ) -{ -int i_can; /* compteur de canaux */ -int iret; /* code retour fonction fermetrue lecture */ -char str_num_canal[3]; /* suffixe numero du canal */ -char nom_fic_entete[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ -char nom_fic_canal[1024]; /* nom du fichier canal a detruire */ - -int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ - -CAI_IMAGE *image1; /* structure ouverture image */ -int nb_can; /* nombre de canaux de l'image */ -int nboct_pix; /* nombre d'octets par pixel image */ -int nb_col; /* nombre de colonnes de l'image */ -int nb_lig; /* nombre de lignes de l'image */ -char extens[5]; /* extension recherchee */ - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - extens[0]='\0'; - if (typ_grille=='B') - strcpy(extens,".gdb"); - else - strcpy(extens,".gdr"); - -/************************************************/ -/* Constitution du nom du fichier d'entete */ -/************************************************/ - -if ((long)strlen(repertoire)!=0) -{ - sprintf( nom_ima_complet, "%s/%s" ,repertoire,nom_ima); -} -else -{ - strcpy ( nom_ima_complet , nom_ima); -} - sprintf(nom_fic_entete ,"%s%s", nom_ima_complet,extens); - -/************************************************/ -/* Destruction du fichier d'entete */ -/************************************************/ - -cr_stat = stat ( nom_fic_entete , &buf_stat ); -if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); - - -return (CAI_OK); - -} -/* - Fin de l'operation cai_dest_ima_grilles -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_grilles */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture-ecriture d'une image au format */ -/* ----- gdb et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_grilles(typ_grille, */ -/* ---------------- nom_image, */ -/* nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* typ_grille (E) (char) : type de grille B=Brute, R=restituee */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_grilles (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_modifie_grilles(char typ_grille,char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence */ - int nbbit; /* nb de bits par pixel du fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines */ - int i,num; /* indice */ - char type_cod[5]; /* type de codage du pixel */ - int temp; /* zone temporaire de lecture */ - char extens[5]; - char type_image[3]; /* type code+ordre rangement octets dans entete*/ - char *type_machine; /* ordre rangement octets machine de travail */ - char buf[59]; /* buffer contenant entete image */ - int v; /* comparaison type machine-type image */ - char *v1; /* comparaison type image avec chaine vide */ - int nb_col2, nb_lig2; /* variables intermediaires inversion octets */ - int temp2,nb; /* zone temporaire de lecture */ - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - nb=2; - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - - - type_machine = (char *) calloc(3,sizeof(char)); - - if (type_machine == NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_modifie"); - } - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_modifie"); - } - else - { - extens[0]='\0'; - if (typ_grille == 'B') - strcpy(extens,".gdb"); - else - strcpy(extens,".gdr"); - -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long)strlen(repert)!= 0) - { - sprintf(nom_fic,"%s/%s%s",repert,nom_image,extens); - } - else - { - sprintf(nom_fic,"%s%s",nom_image,extens); - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ - fic_in=fopen(nom_fic,"rb"); - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete GRILLE"); - } - else - { - - -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ - - /*.................................. - recuperation infos completes format.gdb - ......................................*/ - - if (typ_grille =='B') - fread(buf,36,1,fic_in); - -/*.................................. - recuperation infos completes format.gdr - ......................................*/ - else fread(buf,56,1,fic_in); - - -/*.................................. - recuperation du type de codage des pixels - ......................................*/ - memcpy(type_cod,&buf[8],4); - - if (strncmp(type_cod,"FLOA",4) ==0) - { - image1->NB_BITS_PIX=32; - image1->NBOCT_PIX=4; - sprintf(image1->COD_PIX,"R4"); - strcpy(type_image,"BE"); - sprintf(image1->TYPE_COD,"FLOA"); - } - - else if (strncmp(type_cod,"FLOL",4) ==0) - { - image1->NB_BITS_PIX=32; - image1->NBOCT_PIX=4; - sprintf(image1->COD_PIX,"R4"); - strcpy(type_image,"LE"); - sprintf(image1->TYPE_COD,"FLOL"); - } - - else - { - iret=0; - sprintf(CAI_ERREUR,"Type de codage GRILLE non reconnu : %s",type_cod); - } - - *nboct_pix = image1->NBOCT_PIX; - -/*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - - type_machine = cai_test_pFpf(); - - /*.................................. - determination des autres infos - en fonction inversion - ......................................*/ - - v = strncmp(type_machine,type_image,2); - v1 = strrchr(type_image,'E'); - -/*.................................. - recuperation du nombre de colonne - ......................................*/ - memcpy(nb_col,&buf[0],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)nb_col, (void*)&nb_col2,4 ); - cai_inverser_tableau((short *)nb_col, (short *)&nb_col2,nb); - } - -/*.................................. - recuperation du nombre de lignes - ......................................*/ - memcpy(nb_lig,&buf[4],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)nb_lig, (void*)&nb_lig2,4 ); - cai_inverser_tableau((short *)nb_lig, (short *)&nb_lig2,nb); - } -/*..................................................................... - recuperation du numero de ligne du 1er point de la matrice - .....................................................................*/ - - memcpy(&temp,&buf[12],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)&temp, (void*)&temp2,4 ); - cai_inverser_tableau((short *)&temp,(short *) &temp2,nb); - } - - image1->NUM_LIG_DEB = temp; -/*..................................................................... - recuperation du numero de colonne du 1er point de la matrice - .....................................................................*/ - - memcpy(&temp,&buf[16],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)&temp, (void*)&temp2,4 ); - cai_inverser_tableau((short *)&temp,(short *) &temp2,nb); - } - - image1->NUM_COL_DEB = temp; - -/*..................................................................... - recuperation du pas de la grille le long des lignes - .....................................................................*/ - - - memcpy(&temp,&buf[20],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)&temp, (void*)&temp2,4 ); - cai_inverser_tableau((short *)&temp, (short *)&temp2,nb); - } - - image1->PAS_GRIL_LIG = temp; - -/*..................................................................... - recuperation du pas de la grille le long des colonnes - .....................................................................*/ - - - memcpy(&temp,&buf[24],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)&temp, (void*)&temp2,4 ); - cai_inverser_tableau((short *)&temp,(short *) &temp2,nb); - } - - image1->PAS_GRIL_COL = temp; - -/*..................................................................... - recuperation du decalage initial le long des lignes - .....................................................................*/ - - - memcpy(&temp,&buf[28],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)&temp, (void*)&temp2,4 ); - cai_inverser_tableau((short *)&temp, (short *)&temp2,nb); - } - - image1->DECAL_LIG = temp; - -/*..................................................................... - recuperation du decalage initial le long des colonnes - .....................................................................*/ - - memcpy(&temp,&buf[32],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)&temp, (void*)&temp2,4 ); - cai_inverser_tableau((short *)&temp, (short *)&temp2,nb); - } - - image1->DECAL_COL = temp; - -/*..................................................................... - recuperation de la caracteristique de la grille si .gdr -.....................................................................*/ - if (typ_grille == 'R') - { - memcpy(image1->CAR_GRIL,&buf[36],20); - *nb_can = 2; - } - else - *nb_can = 3; - } - -/************************/ -/* fin modifications */ -/************************/ - - -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in!=NULL) fclose(fic_in); - - if (iret !=0) - { -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - if ((long)strlen(repert)!= 0) - { - sprintf(nom_fic_canal,"%s/%s%s",repert,nom_image,extens); - } - else - { - sprintf(nom_fic_canal,"%s%s",nom_image,extens); - } - - num=open(nom_fic_canal,O_RDWR|O_BINARY,0); - if (num!= -1) - { - - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_image,"%s",image1->NOM_FIC_CAN); - sscanf(nom_image,"%s",image1->NOM_UTIL_CAN); - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=((i*(*nb_lig))+1)*(*nb_col)*image1->NBOCT_PIX; - } -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ - - if ( (v!=0) && (v1!=NULL) ) - { - image1->INV_OCTETS =1; - } - else - { - image1->INV_OCTETS =0; - } - -/***********************/ -/* fin modifications */ -/***********************/ - } - else - iret=0; - } - } - if (iret == 0) - { - return (NULL); - } - else - { - return(image1); - } - -} -/* - Fin de l'operation cai_ouvre_modifie_grilles -*/ - - - diff --git a/Utilities/CAI/cai_dll/src/cai_hdf.c b/Utilities/CAI/cai_dll/src/cai_hdf.c deleted file mode 100755 index ae8bff03e6..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_hdf.c +++ /dev/null @@ -1,1779 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_hdf16.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format hdf */ -/* Seuls l'acces aux Scientific Data Set est possible, code en */ -/* 8bits non signes ou 16 bits non signes */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : Octobre 1996 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 3.3 : DM : optimisation du sous-echantillonnage */ -/*****************************************************************************/ -/* MOD : VERSION : 4.0 : DM : possibilite de traiter des images en R4 et R8 */ -/* flottant simple et double precision */ -/*****************************************************************************/ -/* MOD : VERSION : 4.1 : FA : Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : test sur fclose pour PC/LINUX */ -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : pb sur le sous-echantillonnage-prise en compte */ -/* du nombre d'octets par pixel pour ssech en lignes */ -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : DM : Identification ds l'entete des SDS par le nom */ -/* ou par le numero indifferemment. */ -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : DM : Prise en compte images codées I4 en lecture */ -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : DM : Remplacer les appels systemes pour renommer un */ -/* fichier par la commande C rename */ -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : DM : Prise en compte en lecture des images codées en*/ -/* 8, 16 et 32 bits signés */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte des I2,I4,UI2,UI4 et R8 */ -/* en lecture et ecriture */ -/*****************************************************************************/ - - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ -# include <stdio.h> -# include <string.h> -# include <unistd.h> -# include <sys/types.h> -# include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> -# include <errno.h> - -#define _CAI_IMAGE -#define IN_CAI_HDF - -# include "cai_image.h" -# include "hdf.h" -/*# include "mfhdf.h"*/ - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_hdf.c,v 1.10 01/05/31 10:47:25 cmf Exp $"; - - -extern char *getenv(); - - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_hdf16 */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format hdf */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_hdf16(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_hdf16 (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -long int cai_liste_ima_hdf16 (char *repert, - char ***tab_ima) - -{ - - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - struct dirent *dp; /* structure resultat de la fonction readdir */ - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - char car; /* variable de travail */ - int nb_ima; /* nombre d'images hdf identifiees */ - long int i; /* indice de boucle */ - long int ll,dif; /* variables de travail */ - char blanc; /* caractere blanc */ - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - dirp=opendir(repert); - blanc = ' '; - - if(dirp!=NULL) - { - - -/*...................................... - - premiere passe pour comptabiliser les images du format donne - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE HDF - (EXTENSION =.hdf) - ..........................................*/ - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,".hdf"); - if (pch0 != NULL) - { - ll = (long int)strlen(dp->d_name); - dif = (long int)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - -/*****************************************************************************/ -/* MOD:VERSION:3.3:DM lecture de toutes les images dont l'extension commence */ -/* par .hdf. Cette modif permet de prendre en compte .hdf16 */ -/*****************************************************************************/ -/*ligne supprimee if (((ll-4)==dif)||((*pch1)==blanc)) */ - nb_ima=nb_ima+1; - - } - } - (void)closedir(dirp); - -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT HDF - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE HDF - (EXTENSION =.hdf) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,".hdf"); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long int)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; -/*****************************************************************************/ -/* MOD:VERSION:3.3:DM lecture de toutes les images dont l'extension commence */ -/* par .hdf. Cette modif permet de prendre en compte .hdf16 */ -/*****************************************************************************/ - -/* ligne supprimee if (((ll-4)==dif)||((*pch1)==blanc)) - {*/ - *pch0='\0'; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; -/* ligne supprimee }*/ - - } - } - - (void)closedir(dirp); - - } - else - { - /* repertoire inexistant */ - nb_ima=-1; - } - return(nb_ima); - -} - -/* Fin de l'operation cai_liste_ima_hdf16 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_hdf16 */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format hdf */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_hdf16 (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_hdf16 (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_lecture_hdf16(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - char label[80]; /* contient un enregistrement du fichier */ - int nbbit; /* nb de bits par pixel du fichier en-tete */ - int retour,icr; /* retour de fonctions */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - int num; /* indice */ - int nbplan; /* nombre de canaux dans le fichier en-tete */ - int plan; /* indice de boucle sur les canaux */ - char nom_plan[100]; /* nom des fichiers plan */ - int Ref,lon,Alpha; - int sds_id,status,attribute,num_type,nb_dim; - char name[MAX_NC_NAME]; - int val_dim[MAX_VAR_DIMS]; - int nbdataset,nfileattribut,retn,nbits; - char refSDS[50], sdsname[50]; - int ind,isds; - int sds_trouve; - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - fic_in = NULL; - - nbplan=0; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1: FA Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_lecture"); - goto ERREUR; - } -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.hdf",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.hdf",nom_image); - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=NULL; - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { -/*****************************************************************************/ -/* MOD:VERSION:3.3:DM on essaie avec .hdf16 comme extension (vieille version)*/ -/* Cette modif permet de prendre en compte .hdf16 du QIV */ -/*****************************************************************************/ - strcat(nom_fic,"16"); - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete HDF"); - goto ERREUR; - } - } -/*................................................ - Pour chaque plan image lecture du nom du fichier correspondant - et de la position du SDS dans le fichier - ..................................................*/ - fgets(label,80,fic_in); - retour=strncmp(label,"PLANES_ID",9); - if (retour!=0) - { - strcpy(CAI_ERREUR, - "Informations incoherentes ligne PLANES_ID "); - goto ERREUR; - } - icr=2; - retour=1; - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - while ((icr==2)&&(retour!=0)) - { - icr = fscanf(fic_in,"%s %s",nom_plan,refSDS); - if (icr==1) - { - Ref=0; - icr=2; - } - retour=strncmp(nom_plan,"NB_BITS_PIX",11); - if ((icr==2)&&(retour!=0)) - { - retour=strncmp(nom_plan,"COMMENT",7); - if ((icr==2)&&(retour!=0)) - { - -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s",repert,nom_plan); - } - else - { - sscanf(nom_plan,"%s",nom_fic_canal); - } -/*....................................... - test sur l'existence du fichier plan - et ouverture du fichier plan - .......................................*/ - num=SDstart(nom_fic_canal,DFACC_RDONLY); - if (num!= -1) - { - sscanf(nom_plan,"%s",deb); - deb=deb+100; - sscanf(nom_plan,"%s",deb1); - deb1=deb1+100; - image1->ACCES_CANAL_INT[nbplan]=num; - -/* Recuperation des informations generales */ -/*.................................................*/ - retn=SDfileinfo(num,&nbdataset,&nfileattribut); -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : DM : Identification ds l'entete des SDS par le nom */ -/* ou par le numero indifferemment. */ -/*****************************************************************************/ -/* Verification si SDS identifie par son nom ou par son numero */ - lon=strlen(refSDS ); - Alpha=0; - for (ind=0;ind<lon;ind++) - { - if (isalpha(refSDS[ind])!=0) Alpha=Alpha+1; - } - if (Alpha !=0) - { -/* Identification par nom de SDS boucle sur les SDS */ -/* pour recuperer le numero de SDS */ - sds_trouve = 0; - isds =0; - while ((isds<nbdataset)&&(sds_trouve==0)) - { - sds_id = SDselect(num,isds); -/* Recuperation des infos du SDS */ - status = SDgetinfo(sds_id,sdsname, - &nb_dim,val_dim, - &num_type,&attribute); - - if ( strcmp ( sdsname, refSDS ) == 0 ) - { - /* recuperer le numero de SD correspondant et repartir sur la version - precedente*/ - Ref=isds; - sds_trouve = 1; - } - else - isds++; - - } - if (sds_trouve == 0) - { - sprintf( CAI_ERREUR ,"Nom de SDS non trouve %s\0",refSDS); - goto ERREUR; - } - } - else - { - Ref=atoi(refSDS); - -/* Selection du Scientific Data Set contenant les donnees */ -/*................................................................*/ - sds_id = SDselect(num,Ref); - status = SDgetinfo(sds_id,sdsname, - &nb_dim,val_dim, - &num_type,&attribute); - } -/*******************************************************/ -/* FIN MOD : VERSION : 5.0 : DM : Identification SDS */ -/*******************************************************/ - image1->POS_OCTET[nbplan]=sds_id; - -/* Verification que tous les plans ont la meme taille */ -/*...........................................................*/ - if (nbplan!=0) - { - if ((*nb_lig!=val_dim[0])||(*nb_col!=val_dim[1])) - { - sprintf( CAI_ERREUR ,"Plans de taille differentes !\0"); - goto ERREUR; - } - } - *nb_lig=val_dim[0]; - *nb_col=val_dim[1]; - nbbit= num_type; - - nbplan=nbplan+1; - - } - else - { - sprintf ( CAI_ERREUR , - "Le fichier plan %s HDF n'existe pas\n" , nom_fic_canal ); - goto ERREUR; - } - } - else - icr=99; - } - } -/*.................................... - Decodage du nombre d'octets par pixel - ......................................*/ - if ((retour==0)&&(icr!=99)) - { - if (icr==2) - image1->NB_BITS_PIX=Ref; - else - image1->NB_BITS_PIX=0; -/*.................................... - Decodage du commentaire - ......................................*/ - icr = fscanf(fic_in,"%s",label); - retour=strncmp(label,"COMMENT",7); - if (retour==0) - icr=99; - } - else - image1->NB_BITS_PIX=0; - - - -/*.................................... - Decodage du commentaire - ......................................*/ - if (icr==99) - icr = fscanf(fic_in,"%s",image1->COMMENT); - else - strcpy(image1->COMMENT,"Pas de commentaire\0"); - -/*...................................*/ -/* Initialisation du nombre de plans */ -/*...................................*/ - *nb_can=nbplan; - -/*.................................. - Initialisation du nombre d'octets par pixel - ........................................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : DM : Prise en compte en lecture des images codées en*/ -/* 8, 16 et 32 bits signes */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte des I2,I4,UI2,UI4 et R8 */ -/* en lecture et ecriture */ -/*****************************************************************************/ - - if (nbbit==DFNT_INT8) - { - *nboct_pix=1; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=8; - sprintf(image1->COD_PIX,"OCT"); - } - else if (nbbit==DFNT_UINT8) - { - *nboct_pix=1; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=8; - sprintf(image1->COD_PIX,"UOCT"); - - } - else if (nbbit==DFNT_INT16) - { - *nboct_pix=2; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=16; - sprintf(image1->COD_PIX,"I2"); - } - else if (nbbit==DFNT_UINT16) - { - *nboct_pix=2; - if (image1->NB_BITS_PIX==0) image1->NB_BITS_PIX=16; - sprintf(image1->COD_PIX,"UI2"); - } - -/* MOD : 5.0 Prise en compte des images codées en I4 non signe*/ - else if (nbbit==DFNT_INT32) - { - *nboct_pix=4; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=32; - sprintf(image1->COD_PIX,"I4"); - } - else if (nbbit==DFNT_UINT32) - { - *nboct_pix=4; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=32; - sprintf(image1->COD_PIX,"UI4"); - } - else if (nbbit==DFNT_FLOAT) - { - *nboct_pix=4; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=32; - sprintf(image1->COD_PIX,"R4"); - - } - else if (nbbit==DFNT_DOUBLE) - { - *nboct_pix=8; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=64; - sprintf(image1->COD_PIX,"R8"); - - } - else - { - sprintf ( CAI_ERREUR , - "Type de donnees non supporte par la Couche Acces Image\n" ); - goto ERREUR; - } -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in!=NULL) fclose(fic_in); - -/*...................... - sortie normale - ....................*/ - return(image1); - -ERREUR: - -/*...................... - sortie degradee - ....................*/ - if (fic_in!=NULL) fclose(fic_in); - for (plan=0;plan<nbplan;plan++) - { - num=image1->ACCES_CANAL_INT[plan]; - if (num!=-1) retn=SDend(num); - } - return (NULL); - -} - -/* - Fin de l'operation cai_ouvre_lecture_hdf16 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_hdf16 */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format hdf et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_hdf16 (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_hdf16 (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_creation_hdf16(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int * nb_lig, - char *label) - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - int retour; /* retour de fonction */ - char car[4]; /* indice du canal traite */ - int num; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - int plan; /* indice de boucle sur les canaux */ - char nom_plan[100]; /* nom des fichiers plan */ - int dims[2],rank,sds_id; - int nbbit,Ref,Coher; - char NomSDS[80]; - int reconnaissance_type; - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1: FA Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } - - NomSDS[0]='\0'; - Ref=0; - -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : Maj du TYPE lorsque l'utilisateur le */ -/* precise dans le param "label" */ -/*****************************************************************************/ -/* Verification si type de codage reconnu dans le label */ - reconnaissance_type = cai_istyp_connu(label); - if (reconnaissance_type == -1) - { - if (*nboct_pix==1) - nbbit=DFNT_UINT8; - else if (*nboct_pix==2) - nbbit=DFNT_UINT16; - else if (*nboct_pix==4) - nbbit=DFNT_FLOAT; - else if (*nboct_pix==8) - nbbit=DFNT_DOUBLE; - } - else - { -/* Verification de coherence entre le nb d'octets par pixel et le type donne */ - Coher=1; - if(*nboct_pix == 1) - { - nbbit=DFNT_INT8; - if (reconnaissance_type > 1) Coher=0; - else if (reconnaissance_type ==1) nbbit=DFNT_UINT8; - } - else if(*nboct_pix == 2) - { - if (reconnaissance_type ==2 ) nbbit=DFNT_INT16; - else if (reconnaissance_type ==3 ) nbbit=DFNT_UINT16; - else Coher=0; - } - else if(*nboct_pix == 4) - { - if (reconnaissance_type ==4 ) nbbit=DFNT_INT32; - else if (reconnaissance_type ==5 ) nbbit=DFNT_UINT32; - else if (reconnaissance_type ==6 ) nbbit=DFNT_FLOAT; - else Coher=0; - } - else if(*nboct_pix == 8) - { - if (reconnaissance_type == 7) nbbit=DFNT_DOUBLE; - else Coher = 0; - } - else - Coher = 0; - if (Coher == 0) - { - sprintf(CAI_ERREUR,"incoherence entre TYPE et Nb bits par pixels\n"); - goto ERREUR; - } - } -/*................................................. - Constitution du nom du fichier entete et verification qu'il - n'existe pas deja - .................................................*/ - - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.hdf",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.hdf",nom_image); - } - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s HDF existe \n" , nom_image ); - goto ERREUR; - } - -/*...................................................... - Ouverture du fichier entete en ecriture - Ecriture du contenu - ..........................................................*/ - fic = fopen(nom_fic,"w"); - if (fic == NULL) - { - sprintf(CAI_ERREUR,"Erreur: Creation fichier %s impossible\n",nom_fic); - goto ERREUR; - } - - fprintf ( fic , "PLANES_ID\n" ); -/*............................................................... - Pour chaque canal de l'image,constitution du nom de fichier correspondant - Verification qu'il n'existe pas deja - Ouverture du fichier en ecriture - .................................................................*/ - - for (plan=0;plan<*nb_can;plan++) - { - nom_plan[0]='\0'; - nom_fic_canal[0]='\0'; - sprintf(nom_plan,"%s.b%d",nom_image,plan); - fprintf ( fic , "%s %d\n" , nom_plan,Ref ); - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s",repert,nom_plan); - - } - else - { - sprintf(nom_fic_canal,"%s",nom_plan); - } - retour = stat ( nom_fic_canal , &buf_stat ); - - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s HDF existe \n" , nom_fic_canal ); - goto ERREUR; - } -/* ouverture du fichier */ - num=SDstart(nom_fic_canal,DFACC_CREATE); - if (num == -1) - { - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic_canal); - goto ERREUR; - } - image1->ACCES_CANAL_INT[plan]=num; - -/* ouverture et creation du SDS */ - rank=2; - dims[0]=*nb_lig; - dims[1]=*nb_col; - - if((long int)strlen(repert)!=0) - strcpy(NomSDS,label); - else - strcpy(NomSDS,"SDS1"); - - sds_id=SDcreate(num,NomSDS,nbbit,rank,dims); - - image1->POS_OCTET[plan]=sds_id; - } - retour=fprintf ( fic , "NB_BITS_PIX\n"); - retour=fprintf ( fic , "%d\n" , (*nboct_pix)*8 ); - - retour=fprintf ( fic , "COMMENT\n"); - retour=fprintf ( fic , "%s\n" , label ); - if (retour == 0) - { - sprintf(CAI_ERREUR,"Erreur: Ecriture %s impossible\n",nom_fic); - goto ERREUR; - } - -/*************************************************/ -/* Fermeture du fichier */ -/*************************************************/ - - fclose ( fic ); - return (image1); - -ERREUR : - return(NULL); -} - -/* - Fin de l'operation cai_ouvre_creation_hdf16 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_hdf16 */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image hdf */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_hdf16(image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_hdf16 (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_lecture_canal_hdf16(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) -{ - - int num,n,ilig,k,j; /* variables de travail */ - int iret; /* indicateur d'erreur */ - int edges[2],strides[2],start[2]; - unsigned char *buf,*deb,*pch; - int nboct; - -/*........................... - Initialisations diverses - ..........................*/ - - iret=CAI_OK; - num=image1->POS_OCTET[(*canal)-1]; - - if ((*pas_ligne==1)&&(*pas_colonne==1)) - { - start[0]=(*premiere_ligne)-1; - start[1]=(*premiere_colonne)-1; - edges[0]=*nombre_lignes_lire; - edges[1]=*nombre_colonnes_lire; - strides[0]=*pas_ligne; - strides[1]=*pas_colonne; - n= SDreaddata(num,start,strides,edges,(VOIDP *)data_image); - if (n<0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image HDF"); - } - } - else - { - nboct = (*nombre_lignes_lire)*(*pas_ligne)* - (image1->NB_COL)*(image1->NBOCT_PIX); - buf = (unsigned char *) calloc(nboct,sizeof(unsigned char)); -/*........................................... - lecture des lignes images - ................................................*/ - - start[0]=(*premiere_ligne)-1; - start[1]=0; - edges[0]=(((*nombre_lignes_lire)-1)*(*pas_ligne))+1; - edges[1]=image1->NB_COL; - strides[0]=1; - strides[1]=1; - n= SDreaddata(num,start,strides,edges,(VOIDP *)buf); - if (n<0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image HDF"); - } - pch=data_image; - -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - for (ilig=0;ilig<*nombre_lignes_lire;ilig++) - { -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : pb sur le sous-echantillonnage-prise en compte */ -/* du nombre d'octets par pixel pour ssech en lignes */ -/*****************************************************************************/ - - deb=buf+((ilig*(image1->NB_COL)*(*pas_ligne))+ - ((*premiere_colonne)-1))*image1->NBOCT_PIX; - j=1; - while (j <= (*nombre_colonnes_lire)) - { - for (k=0;k<image1->NBOCT_PIX;k=k+1) - { - *(pch+k)=*(deb+k); - } - pch=pch+image1->NBOCT_PIX; - j=j+1; - deb=deb+((*pas_colonne)*image1->NBOCT_PIX); - } - } - if (buf!=NULL) free(buf); - } - - return(iret); - } - -/* - Fin de l'operation cai_lecture_canal_hdf16 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_hdf16 */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image hdf */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_hdf16(image1, canal, */ /* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_hdf16 (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ecriture_canal_hdf16 (CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) -{ - -int num,n; /* descripteur de fichier */ -int edges[2],strides[2],start[2]; - - -/* initialisations */ - - num = image1->POS_OCTET[*canal-1]; - start[0]=(*premiere_ligne)-1; - start[1]=0; - edges[0]=*nombre_lignes_ecrire; - edges[1]=*nombre_colonnes_ecrire; - n= SDwritedata(num,start,NULL,edges,(VOIDP *)data_image); - if (n<0) - { - strcpy(CAI_ERREUR,"Erreur lecture donnee image HDF"); - return (CAI_KO); - } - -return (CAI_OK); - -} - -/* - Fin de l'operation cai_ecriture_canal_hdf16 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_hdf16 */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format hdf et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_hdf16(image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_hdf16 (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_hdf16 (CAI_IMAGE *image1) - -{ - int iret; /* code retour de l'operation */ - int i_can; /* indice du canal a fermer */ - int num; /* descripteur du fichier a fermer */ - - iret=CAI_OK; -/*............................................. - Fermeture de tous les canaux - .............................................*/ - for (i_can=0;i_can<image1->NB_CANAUX;i_can=i_can+1) - { - num = image1->POS_OCTET[i_can]; - iret=SDendaccess(num); - num=image1->ACCES_CANAL_INT[i_can]; - iret=SDend(num); - } - return (iret); -} - -/* - Fin de l'operation cai_ferme_hdf16 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_hdf16 */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en hdf et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_hdf16(format,nom_ima) */ /* ------------------ */ -/* format (E) (char *) : format de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_hdf16 (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_dest_ima_hdf16 (char *repertoire , - char *nom_ima ) - -{ -int i_can; /* compteur de canaux */ -long iret; /* code retour fonction fermetrue lecture */ -char str_num_canal[3]; /* suffixe numero du canal */ -char nom_fic_entete[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ -char nom_fic_canal[1024]; /* nom du fichier canal a detruire */ -int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ -CAI_IMAGE *image1; /* structure ouverture image */ -int nb_can; /* nombre de canaux de l'image */ -int nboct_pix; /* nombre d'octets par pixel image */ -int nb_col; /* nombre de colonnes de l'image */ -int nb_lig; /* nombre de lignes de l'image */ -char ptr_nom_fic_can[100*CAI_NB_MAX_CAN]; /* nom fichier canal traite */ -char nom_fichier[1024]; /* nom du fichier entete a detruire */ -char chemin[1024]; /* repertoire + "/" */ -char *ptr,*deb; - -/************************************************/ -/* Constitution du nom du fichier d'entete */ -/************************************************/ -chemin[0]='\0'; -ptr_nom_fic_can[0]='\0'; - -if ((long int)strlen(repertoire)!=0) -{ - sprintf(nom_ima_complet,"%s/%s",repertoire,nom_ima); - sprintf ( chemin ,"%s/", repertoire ); -} -else -{ - strcpy ( nom_ima_complet , nom_ima); - strcpy ( chemin , "./"); -} - strcpy(nom_fic_entete , nom_ima_complet); - strcat ( nom_fic_entete , ".hdf\0" ); - -/************************************************/ -/* Extraction des caracteristiques de l'image */ -/* et noms des fichiers plans */ -/* du fichier entete par l'appel a la fonction */ -/* cai_ouvre_lecture_image */ -/************************************************/ - image1 = cai_ouvre_lecture_image ( nom_ima_complet,"HDF", &nb_can , - &nboct_pix ,&nb_col, &nb_lig ); - - if ( image1 == NULL) goto ERREUR; - - ptr = ptr_nom_fic_can; - deb = image1->NOM_FIC_CAN; - for ( i_can = 0 ; i_can < nb_can ; i_can++ ) - { - sscanf(deb,"%s",ptr); - deb=deb+100; - ptr=ptr+100; - } - - ptr = ptr_nom_fic_can; - - iret=cai_ferme_image(image1); - image1=NULL; -/************************************************/ -/* Destruction des fichiers radiometrie */ -/************************************************/ - - for ( i_can = 0 ; i_can < nb_can ; i_can++ ) - { - strncpy ( nom_fic_canal , ptr , 100 ); - nom_fic_canal[99] = '\0'; - strcpy ( nom_fichier , chemin ); - strcat ( nom_fichier, nom_fic_canal ); - nom_fichier[strlen(chemin)+strlen(nom_fic_canal)+1] = '\0'; - cr_stat = stat ( nom_fichier , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fichier ); - ptr = ptr + 100; - } - - -/************************************************/ -/* Destruction du fichier d'entete */ -/************************************************/ -cr_stat = stat ( nom_fic_entete , &buf_stat ); -if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); -else -{ -/*****************************************************************************/ -/* MOD:VERSION:3.3:DM on essaie avec .hdf16 comme extension (vieille version)*/ -/* Cette modif permet de prendre en compte .hdf16 du QIV */ -/*****************************************************************************/ - strcat(nom_fic_entete,"16"); - cr_stat = stat ( nom_fic_entete , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); -} - -return (CAI_OK); -ERREUR: - return((CAI_OK_KO)NULL); -} -/* - Fin de l'operation cai_dest_ima_hdf16 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_rename_fichiers_hdf16 */ -/* ---------- */ -/* */ -/* ROLE : permet de modifier l'extension des plans d'une image HDF */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_rename_fichiers_hdf16(image1,TabExtens) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* TabExtens (E) (CAI_EXTENS *) : tableau des nouvelles extensions */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_rename_fichiers_hdf16(CAI_IMAGE *image1,CAI_EXTENS *TabExtens) - -{ - int Can; /* indice de boucle sur les canaux */ - char fichierE[1024]; /* fichier a traiter */ - char fichierS[1024]; /* nouveau nom du fichier */ - FILE *fic; /* pointeur descripteur fichier */ - int pt_oct; /* position courante ds le fichier */ - int *Ref; /* Reference du SDS des fichiers */ - char label[80]; /* contient un enregist fichier */ - char repert[1024]; /* repertoire de stockage image */ - char image[1024]; /* nom de l'image a ouvrir */ - char *pch,*deb; /* pointeurs de travail */ - long nb1,nb2; /* indice de longueur significative*/ - char car; /* variable de travail */ - int icr,tempo; /* code retour fonction */ - CAI_CHAINE *NomIma; - -/* Separation du repertoire de stockage de l'image et du nom propre */ - - repert[0]='\0'; - image[0]='\0'; - car='/'; - pch=(char *)strrchr(image1->NOM_IMAGE,car); - if (pch == NULL) - { - /* le repertoire est celui courant */ - sscanf(image1->NOM_IMAGE,"%s",image); - car='.'; - pch=(char *)strrchr(image,car); - if (pch != NULL) - *pch='\0'; - } - else - { - - nb1=(long int)(pch)-(long int)(image1->NOM_IMAGE); - strncpy(repert,image1->NOM_IMAGE,nb1); - repert[nb1]='\0'; - deb=image1->NOM_IMAGE+nb1+1; - nb2=strlen(image1->NOM_IMAGE)-(nb1+1); - strncpy(image,deb,nb2); - image[nb2]='\0'; - car='.'; - pch=(char *)strrchr(image,car); - if (pch != NULL) - *pch='\0'; - - } - -/* Ouverture du fichier d'entete */ - - fichierE[0]='\0'; - sprintf(fichierE,"%s.hdf",image1->NOM_IMAGE); - fic = fopen(fichierE,"r+"); - if (fic == NULL) - { -/*****************************************************************************/ -/* MOD:VERSION:3.3:DM on essaie avec .hdf16 comme extension (vieille version)*/ -/* Cette modif permet de prendre en compte .hdf16 du QIV */ -/*****************************************************************************/ - strcat(fichierE,"16"); - fic = fopen(fichierE,"r+"); - if (fic == NULL) - { - - sprintf(CAI_ERREUR, - "Erreur: Modification fichier %s impossible\n",fichierE); - goto ERREUR; - } - } - -/* Lecture des references de chaque plan */ - - Ref = (int *) calloc(image1->NB_CANAUX,sizeof(int)); - fgets(label,80,fic); - icr=strncmp(label,"PLANES_ID",9); - if (icr!=0) - { - strcpy(CAI_ERREUR, - "Informations incoherentes ligne PLANES_ID "); - goto ERREUR; - } - -/*................................................*/ -/* Rename de chaque bande spectrale si necessaire */ -/*................................................*/ - NomIma = NULL; - NomIma = (CAI_CHAINE *)calloc(image1->NB_CANAUX,sizeof(CAI_CHAINE)); - if (NomIma == NULL) goto ERREUR; - for(Can=0;Can<image1->NB_CANAUX;Can++) - { - icr = fscanf(fic,"%s%d",label,&tempo); - if (icr==1) - Ref[Can]=0; - else - Ref[Can]=tempo; - if (TabExtens != NULL) - { - fichierE[0]='\0'; - fichierS[0]='\0'; - sprintf(fichierE,"%s/%s",repert,label); - sprintf(fichierS,"%s%s",image1->NOM_IMAGE,TabExtens[Can]); -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : DM : Remplacer les appels systemes pour renommer un */ -/* fichier par la commande C rename */ -/*****************************************************************************/ - rename(fichierE,fichierS); - } - else - { - strcpy(NomIma[Can],label); - } - } - -/* Modification du fichier d'entete */ - rewind(fic); - fprintf ( fic , "PLANES_ID\n" ); - for(Can=0;Can<image1->NB_CANAUX;Can++) - { - tempo=Ref[Can]; - if (TabExtens != NULL) - fprintf ( fic , "%s%s %d\n",image,TabExtens[Can],tempo); - else - fprintf ( fic , "%s %d\n",NomIma[Can],tempo); - - - } - fprintf ( fic , "NB_BITS_PIX\n"); - fprintf ( fic , "%d\n" , image1->NB_BITS_PIX ); - - icr=fprintf ( fic , "COMMENT\n"); - icr=fprintf ( fic , "%s\n" , image1->COMMENT ); - - fclose ( fic ); - - if (NomIma != NULL) free(NomIma); - - return(CAI_OK); - -ERREUR : - return(CAI_KO); -} -/* - Fin de l'operation cai_rename_fichiers_hdf16 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_hdf16 */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture-ecriture d'une image au format */ -/* ----- hdf et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_hdf16 (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_hdf16 (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_modifie_hdf16(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - char label[80]; /* contient un enregistrement du fichier */ - int nbbit; /* nb de bits par pixel du fichier en-tete */ - int retour,icr; /* retour de fonctions */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - int num; /* indice */ - int nbplan; /* nombre de canaux dans le fichier en-tete */ - int plan; /* indice de boucle sur les canaux */ - char nom_plan[100]; /* nom des fichiers plan */ - int Ref; - int sds_id,status,attribute,num_type,nb_dim; - char name[MAX_NC_NAME]; - int val_dim[MAX_VAR_DIMS]; - int nbdataset,nfileattribut,retn,nbits; - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - fic_in = NULL; - - nbplan=0; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1: FA Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_modifie"); - goto ERREUR; - } - -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.hdf",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.hdf",nom_image); - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { -/*****************************************************************************/ -/* MOD:VERSION:3.3:DM on essaie avec .hdf16 comme extension (vieille version)*/ -/* Cette modif permet de prendre en compte .hdf16 du QIV */ -/*****************************************************************************/ - strcat(nom_fic,"16"); - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete HDF"); - goto ERREUR; - } - } - -/*................................................ - Pour chaque plan image lecture du nom du fichier correspondant - et de la position du SDS dans le fichier - ..................................................*/ - fgets(label,80,fic_in); - retour=strncmp(label,"PLANES_ID",9); - if (retour!=0) - { - strcpy(CAI_ERREUR, - "Informations incoherentes ligne PLANES_ID "); - goto ERREUR; - } - icr=2; - retour=1; - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - while ((icr==2)&&(retour!=0)) - { - icr = fscanf(fic_in,"%s%d",nom_plan,&Ref); - if (icr==1) - { - Ref=0; - icr=2; - } - retour=strncmp(nom_plan,"NB_BITS_PIX",11); - if ((icr==2)&&(retour!=0)) - { - retour=strncmp(nom_plan,"COMMENT",7); - if ((icr==2)&&(retour!=0)) - { - -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s",repert,nom_plan); - } - else - { - sscanf(nom_plan,"%s",nom_fic_canal); - } -/*....................................... - test sur l'existence du fichier plan - et ouverture du fichier plan - .......................................*/ - num=SDstart(nom_fic_canal,DFACC_RDWR); - if (num!= -1) - { - sscanf(nom_plan,"%s",deb); - deb=deb+100; - sscanf(nom_plan,"%s",deb1); - deb1=deb1+100; - image1->ACCES_CANAL_INT[nbplan]=num; - -/* Recuperation des informations generales */ -/*.................................................*/ - retn=SDfileinfo(num,&nbdataset,&nfileattribut); - -/* Selection du Scientific Data Set contenant les donnees */ -/*................................................................*/ - sds_id = SDselect(num,Ref); - image1->POS_OCTET[nbplan]=sds_id; - -/* Recherche des attributs (taille, nb oct pix) */ -/*......................................................*/ - - status = SDgetinfo(sds_id,name,&nb_dim,val_dim, - &num_type,&attribute); - -/* Verification que tous les plans ont la meme taille */ -/*...........................................................*/ - if (nbplan!=0) - { - if ((*nb_lig!=val_dim[0])||(*nb_col!=val_dim[1])) - { - sprintf( CAI_ERREUR ,"Plans de taille differentes !\0"); - goto ERREUR; - } - } - *nb_lig=val_dim[0]; - *nb_col=val_dim[1]; - nbbit= num_type; - - nbplan=nbplan+1; - - } - else - { - sprintf ( CAI_ERREUR , - "Le fichier plan %s HDF n'existe pas\n" , nom_fic_canal ); - goto ERREUR; - } - } - else - icr=99; - } - } -/*.................................... - Decodage du nombre d'octets par pixel - ......................................*/ - if ((retour==0)&&(icr!=99)) - { - if (icr==2) - image1->NB_BITS_PIX=Ref; - else - image1->NB_BITS_PIX=0; -/*.................................... - Decodage du commentaire - ......................................*/ - icr = fscanf(fic_in,"%s",label); - retour=strncmp(label,"COMMENT",7); - if (retour==0) - icr=99; - } - else - image1->NB_BITS_PIX=0; - - - -/*.................................... - Decodage du commentaire - ......................................*/ - if (icr==99) - icr = fscanf(fic_in,"%s",image1->COMMENT); - else - strcpy(image1->COMMENT,"Pas de commentaire\0"); - -/*...................................*/ -/* Initialisation du nombre de plans */ -/*...................................*/ - *nb_can=nbplan; - -/*.................................. - Initialisation du nombre d'octets par pixel - ........................................................*/ -/* MOD : VERSION : 5.2 : DM : prise en compte des I2,I4,UI2,UI4 et R8 */ -/* en lecture et ecriture */ -/*****************************************************************************/ - - if (nbbit==DFNT_INT8) - { - *nboct_pix=1; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=8; - sprintf(image1->COD_PIX,"OCT"); - } - else if (nbbit==DFNT_UINT8) - { - *nboct_pix=1; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=8; - sprintf(image1->COD_PIX,"UOCT"); - - } - else if (nbbit==DFNT_INT16) - { - *nboct_pix=2; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=16; - sprintf(image1->COD_PIX,"I2"); - } - else if (nbbit==DFNT_UINT16) - { - *nboct_pix=2; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=16; - sprintf(image1->COD_PIX,"UI2"); - } - -/* MOD : 5.0 Prise en compte des images codées en I4 non signe*/ - else if (nbbit==DFNT_INT32) - { - *nboct_pix=4; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=32; - sprintf(image1->COD_PIX,"I4"); - } - else if (nbbit==DFNT_UINT32) - { - *nboct_pix=4; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=32; - sprintf(image1->COD_PIX,"UI4"); - } - else if (nbbit==DFNT_FLOAT) - { - *nboct_pix=4; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=32; - sprintf(image1->COD_PIX,"R4"); - - } - else if (nbbit==DFNT_DOUBLE) - { - *nboct_pix=8; - if (image1->NB_BITS_PIX==0) - image1->NB_BITS_PIX=64; - sprintf(image1->COD_PIX,"R8"); - - } - else - { - sprintf ( CAI_ERREUR , - "Type de donnees non supporte par la Couche Acces Image\n" ); - goto ERREUR; - } - - /*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in!=NULL) fclose(fic_in); - -/*...................... - sortie normale - ....................*/ - return(image1); - -ERREUR: - -/*...................... - sortie degradee - ....................*/ - if (fic_in!=NULL) fclose(fic_in); - for (plan=0;plan<nbplan;plan++) - { - num=image1->ACCES_CANAL_INT[plan]; - if (num!=-1) retn=SDend(num); - } - return (NULL); - -} -/* - Fin de l'operation cai_ouvre_modifie_hdf16 -*/ - diff --git a/Utilities/CAI/cai_dll/src/cai_inria.c b/Utilities/CAI/cai_dll/src/cai_inria.c deleted file mode 100755 index 79e85bd2fc..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_inria.c +++ /dev/null @@ -1,1529 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_inria.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format inria */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : fevrier 1995 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 3.3 : DM:optimisation des acces */ -/*****************************************************************************/ -/* MOD : VERSION : 4.0 : DM: integration du module ouverture en modification*/ -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA: Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : FA : verification que l'image est codee sur un ou 2 */ -/*octets par pixel (contrainte du format) */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : modifications open binaire pour PC/NT */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : test sur fclose pour PC/LINUX */ -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : FA: Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA: Correction "PIXSIZE= %d bits\n" au lieu de */ -/* "PIXSIZE= bits\n" dans ouvre_creation */ -/*****************************************************************************/ - - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <unistd.h> -# include <sys/types.h> -#include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> -# include <malloc.h> - -#define _CAI_IMAGE -#define IN_CAI_INRIA - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_inria.c,v 1.13 01/05/31 10:47:04 cmf Exp $"; - -extern char *getenv(); - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_inria */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format inria */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_inria(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau images listees */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_inria (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -long int cai_liste_ima_inria(char *repert, - char ***tab_ima) - -{ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - -struct dirent *dp; /* structure resultat de la fonction readdir */ - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - char *pch2; /* pointeurs sur chaine de caracteres */ - char car; /* variable de travail */ - int nb_ima; /* nombre d'images inria identifiees */ - int i; /* indice de boucle */ - char nom_prec[100]; /* contient le nom du dernier fichier inria vu */ - char pch3[100]; /* permet le transfert du nom de fichier trouve*/ - -/*........................................ - initialisation et ouverture du repertoire - .........................................*/ - - nb_ima=0; - - dirp=opendir(repert); - - if(dirp!=NULL) - { - - -/*...................................... - premiere passe pour comptabiliser les images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE INRIA - (EXTENSION =.xs) - ..........................................*/ - - strcpy(nom_prec,"11"); - - while((dp=readdir(dirp))!=NULL) - { - car='.'; - pch0=strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='x'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='s'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - pch2=pch2+1; - *pch2=' '; - pch2=pch2+1; - *pch2=' '; - pch2=pch2+1; - *pch2='\0'; - strcpy(pch3,dp->d_name); - i=strcmp(nom_prec,pch3); - if (i!=0) - { - strcpy(nom_prec,pch3); - nb_ima=nb_ima+1; - - } - } - - } - } - } - - (void)closedir(dirp); -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT INRIA - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE INRIA - (EXTENSION =.xs) - SI C'EST LE CAS STOCKAGE DE L'IMAGE DANS LA LISTE DES IMAGES INRIA - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - - strcpy(nom_prec,"11"); - - while((dp=readdir(dirp))!=NULL) - { - car='.'; - pch0=strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='x'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='s'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - pch2=pch2+1; - *pch2=' '; - pch2=pch2+1; - *pch2=' '; - pch2=pch2+1; - *pch2='\0'; - strcpy(pch3,dp->d_name); - i=strcmp(nom_prec,pch3); - if (i!=0) - { - strcpy(nom_prec,pch3); - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - - } - } - - } - } - } - (void)closedir(dirp); - - } - else - { - nb_ima=-1; - } - - return(nb_ima); - -} -/* Fin de l'operation cai_liste_ima_inria -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_inria */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format inria */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_inria (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_inria (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_lecture_inria(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) -{ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - long iret,k,n; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom du fichier canal a ouvrir */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - char car[3]; /* indice du canal traite */ - int i,num; /* indice */ - char *buf_lec ; /* buffer lecture entete inria */ - int nb_bits; /* nombre de bits par pixels */ - char str_no; /* variable de lecture */ - short int n1; /* variable de travail de lecture */ - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - *nb_can=0; - - iret=1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.6: FA Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_lecture"); - } - else - { - -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL et ouverture - de ces fichiers - Recherche du nombre de canaux de l'image - .....................................................*/ - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.xs",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.xs",nom_image); - } - - for (i=0;i<50;i=i+1) - { - nom_fic_canal[0]='\0'; - sscanf(nom_fic,"%s",nom_fic_canal); - sprintf(car,"%d",i); - strcat(nom_fic_canal,car); - num=open(nom_fic_canal,O_RDONLY|O_BINARY,0); - - if (num != -1) - { - - if (*nb_can<CAI_NB_MAX_CAN) - { - sscanf(nom_image,"%s",deb); - strcat(deb,".xs"); - strcat(deb,car); - deb=deb+100; - sscanf(nom_image,"%s",deb1); - strcat(deb1,".xs"); - strcat(deb1,car); - deb1=deb1+100; - image1->ACCES_CANAL_INT[*nb_can]=num; - *nb_can=*nb_can+1; - - - } - - } - } - if ((*nb_can) == 0) - { - iret = 0; - } - else - { -/*................................... - Lecture du fichier entete - ............................................*/ - - buf_lec=(char *) calloc(256,sizeof(char)); - if (buf_lec==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_lecture"); - } - else - { - - num=image1->ACCES_CANAL_INT[0]; - - k=read(num,buf_lec,256); - if (k!=256) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur lecture entete Inria"); - } - else - { -/*................................. - Decodage de l'enregistrement (nouveu format inria) - .........................................*/ - if (buf_lec[10]=='4') - { - - sscanf(&buf_lec[19],"%4d",nb_col); - sscanf(&buf_lec[29],"%4d",nb_lig); - sscanf(&buf_lec[78],"%2d",&nb_bits); - - /* le nombre recupere represente le nombre de */ - /* bits ou le nombre d'octets codant un pixel */ - /* cette information est transmise via le */ - /* parametre nboct_pix inutilise sur SUN */ - if ( (nb_bits==8) || (nb_bits==16) ) - *nboct_pix = nb_bits/8; - else if ( (nb_bits==1) || (nb_bits==2) ) - *nboct_pix = nb_bits; - image1->NB_BITS_PIX= nb_bits; - for (i=0;i<*nb_can;i=i+1) - { - image1->POS_OCTET[i]=1024; - } - } - else - { -/*................................. - Decodage de l'enregistrement (ancien format inria) - .........................................*/ - - lseek(num,0L,0); - n=read(num,(char*)&n1,2); - if (n<=0) - { - iret=0; - strcpy(CAI_ERREUR, - "Erreur lecture entete inria"); - } - *nb_col=(int)n1; - - n=read(num,(char*)&n1,2); - if (n<=0) - { - iret=0; - strcpy(CAI_ERREUR, - "Erreur lecture entete inria"); - } - *nb_lig=(int)n1; - - n=read(num,&str_no,1); - if (n<=0) - { - iret=0; - strcpy(CAI_ERREUR, - "Erreur lecture entete inria"); - } - nb_bits = (int)str_no; - - /* le nombre recupere represente le nombre de */ - /* bits ou le nombre d'octets codant un pixel */ - /* cette information est transmise via le */ - /* parametre nboct_pix inutilise sur SUN */ - if ( (nb_bits==8) || (nb_bits==16) ) - *nboct_pix = nb_bits/8; - else if ( (nb_bits==1) || (nb_bits==2) ) - *nboct_pix = nb_bits; - - for (i=0;i<*nb_can;i=i+1) - { - image1->POS_OCTET[i]=256; - } - } - if (*nboct_pix ==1) - sprintf(image1->COD_PIX,"OCT"); - else - sprintf(image1->COD_PIX,"I2"); - } - free(buf_lec); - } - } - } - if (iret == 0) - { - return (NULL); - } - else - { - return (image1); - } - -} - -/* - Fin de l'operation cai_ouvre_lecture_inria -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_inria */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format inria et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_inria (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_inria (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_IMAGE *cai_ouvre_creation_inria(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig, - char *label) - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - int retour; /* retour de fonction */ - char car[2]; /* indice du canal traite */ - int i,num; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - int i_oct,remplissage; /* variables de travail */ - -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : FA : verification que l'image est codee sur un ou 2 */ -/*octets par pixel (contrainte du format) */ -/*****************************************************************************/ - if ((*nboct_pix != 1)&&(*nboct_pix != 2)) - { - image1 = NULL; - sprintf ( CAI_ERREUR , - "Une image INRIA ne peutetre codee que sur un ou 2 octets par pixel"); - goto ERREUR; - } - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - image1 = NULL; - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1 : FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } - -/*************************************************/ -/* constitution du nom des fichiers a ecrire */ -/* - si un canal : image.xs0 */ -/* - si +sieurs canaux : image.xsi avec i=1->99 */ -/* et insertion dans les tableaux */ -/*************************************************/ - -/*************************************************/ -/* SI l'image est panchromatique */ -/*************************************************/ - if (* nb_can == 1 ) - { -/*************************************************/ -/* constitution du nom du fichier avec */ -/* l'extension .xs0 verif existence */ -/*************************************************/ - - nom_fic_canal[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.xs0",repert,nom_image); - } - else - { - sprintf(nom_fic_canal,"%s.xs0",nom_image); - } - - retour = stat ( nom_fic_canal , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s INRIA existe \n" , nom_image ); - goto ERREUR; - } - -/*************************************************/ -/* ecriture de l'entete dans le fichier */ -/* l'extension .xs0 */ -/*************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ - fic = fopen(nom_fic_canal,"wb"); - if (fic == NULL) - { - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic_canal); - goto ERREUR; - } - retour= fprintf ( fic , "#INRIMAGE-4#{\n" ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "Erreur : ecriture impossible dans fichier %s\n", - nom_fic_canal ); - goto ERREUR; - } - - fprintf ( fic , "XDIM=%-4d\n" , *nb_col); - fprintf ( fic , "YDIM=%-4d\n" , *nb_lig ); - fprintf ( fic , "ZDIM=%-2d\n" , 1 ); - fprintf ( fic , "VDIM=%-2d\n" , 1 ); - fprintf ( fic , "TYPE=unsigned fixed\n" ); -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA: Correction "PIXSIZE= %d bits\n" au lieu de */ -/* "PIXSIZE= bits\n" dans ouvre_creation */ -/*****************************************************************************/ - - fprintf ( fic , "PIXSIZE= %d bits\n" , (*nboct_pix)*8 ); - if (*nboct_pix == 1) - { - fprintf ( fic , "SCALE=1**0\n" ); - remplissage = 916; - } - else - { - fprintf ( fic , "SCALE=2**16\n" ); - remplissage = 915; - } - fprintf ( fic , "CPU=sun\n" ); - for ( i_oct = 0 ; i_oct < remplissage ; i_oct++ ) - { - fprintf ( fic , "\n" ); - } - fprintf ( fic , "##}\n" ); - if (fic!=NULL) fclose(fic); - -/*************************************************/ -/* ouverture pour ecriture radiometrie */ -/*************************************************/ - - num = open(nom_fic_canal,O_RDWR|O_BINARY,0); - if (num == -1) - { - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic_canal); - goto ERREUR; - } - image1->ACCES_CANAL_INT[0]=num; - image1->POS_OCTET[0]=1024; - } - -/*************************************************/ -/* SINON */ -/*************************************************/ - else - { -/*************************************************/ -/* POUR chacun des canaux */ -/*************************************************/ - for ( i= 0 ; i < *nb_can ; i=i+1) - { -/**************************************************/ -/* constitution du nom du fichier extension .xsi */ -/**************************************************/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.xs%d",repert,nom_image,i+1); - } - else - { - sprintf(nom_fic_canal,"%s.xs%d",nom_image,i+1); - } - - retour = stat ( nom_fic_canal , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s INRIA existe \n" , nom_image ); - goto ERREUR; - } - -/*************************************************/ -/* ecriture de l'entete dans le fichier */ -/* l'extension .xsi+1 */ -/*************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ - fic = fopen(nom_fic_canal,"wb"); - if (fic == NULL) - { - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic_canal); - goto ERREUR; - } - retour= fprintf ( fic , "#INRIMAGE-4#{\n" ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "Erreur : ecriture impossible dans fichier %s\n", - nom_fic_canal ); - goto ERREUR; - } - - fprintf ( fic , "XDIM=%-4d\n" , *nb_col); - fprintf ( fic , "YDIM=%-4d\n" , *nb_lig ); - fprintf ( fic , "ZDIM=%-2d\n" , 1 ); - fprintf ( fic , "VDIM=%-2d\n" , 1 ); - fprintf ( fic , "TYPE=unsigned fixed\n" ); - fprintf ( fic , "PIXSIZE=%d bits\n" , (*nboct_pix)*8 ); - if (*nboct_pix == 1) - { - fprintf ( fic , "SCALE=1**0\n" ); - remplissage = 916; - } - else - { - fprintf ( fic , "SCALE=2**16\n" ); - remplissage = 915; - } - fprintf ( fic , "CPU=sun\n" ); - for ( i_oct = 0 ; i_oct < remplissage ; i_oct++ ) - { - fprintf ( fic , "\n" ); - } - fprintf ( fic , "##}\n" ); - fclose(fic); - -/*************************************************/ -/* ouverture pour ecriture radiometrie */ -/*************************************************/ - num = open(nom_fic_canal,O_RDWR|O_BINARY,0); - if (num == -1) - { - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic_canal); - goto ERREUR; - } - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=1024; - } - } - - return (image1); - -ERREUR : - if (image1 !=NULL) free(image1); - return(NULL); -} -/* - Fin de l'operation cai_ouvre_creation_inria -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_inria */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image inria */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_inria(image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_inria (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_lecture_canal_inria(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) -{ - - int num,i,j; /* variables de travail */ - long pt_oct,n; /* position courante dans le fichier image */ - long no_oct; /* numero du premier octet a lire */ - long iret,k; /* indicateur d'erreur */ - int lig; /* indice de boucle sur les lignes */ - int oct_pix; /* nb octets par pixels */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - long oct_lig; /* nb oct. par ligne en considerant taille pixel */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - - -/*........................... - Initialisations diverses - ..........................*/ - - iret=CAI_OK; - num=image1->ACCES_CANAL_INT[*canal-1]; - oct_pix=image1->NBOCT_PIX; - oct_lig=oct_pix*image1->NB_COL; - -/*.......................................*/ -/* verification si lecture image entiere */ -/*.......................................*/ - if ((*nombre_lignes_lire==image1->NB_LIG)&&(*nombre_colonnes_lire==image1->NB_COL) - &&(*pas_ligne==1)&&(*pas_colonne==1)) - { - oct_lig=oct_pix*(image1->NB_COL)*(image1->NB_LIG); - - /* positionnement en debut de fichier */ - pt_oct=(long int)lseek(num,0L,0); - - /* lecture du canal complet */ - n=read(num,data_image,oct_lig); - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image INRIA"); - } - else - iret=CAI_OK; - } - else - { - -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - - buf_lec = (unsigned char *) calloc(oct_lig,sizeof(unsigned char)); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - } - else - { -/*.................... - Initialisation - ......................*/ - lig=*premiere_ligne; - i=1; - pch=data_image; - -/*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i <= *nombre_lignes_lire)&&(iret==CAI_OK)) - { -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - no_oct=image1->POS_OCTET[*canal-1]+((lig-1)*oct_lig); - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture d'une ligne image - ................................................*/ - n=read(num,buf_lec,oct_lig); - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image INRIA"); - } - else - { -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - deb=buf_lec+((*premiere_colonne)-1)*oct_pix; - j=1; - while (j <= *nombre_colonnes_lire) - { - for (k=0;k<oct_pix;k=k+1) - { - *(pch+k)=*(deb+k); - } - j=j+1; - deb=deb+((*pas_colonne)*oct_pix); - pch=pch+oct_pix; - } - - } - i=i+1; - lig=lig+(*pas_ligne); - - } - - free(buf_lec); - } - } - - return(iret); -} - -/* - Fin de l'operation cai_lecture_canal_inria -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_inria */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image inria */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_inria(image1, canal, */ /* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_inria (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_ecriture_canal_inria (CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) -{ -long position_first_lig; /* position de la 1ere ligne a ecrire */ -long position_courante; /* position courante dans le fichier */ -long deplacement; /* deplacement a effectuer */ -int i_ligne; /* compteur de lignes */ -unsigned char *buff_lig; /* tableau contenant une ligne a ecrire */ -long cr_write; /* code retour de write */ -int num; /* descripteur de fichier */ -int nboct_pix; /* nombre d'octets par pixel */ -int tot_pix; /* nb de pixels total a ecrire */ - -/* initialisations */ - -i_ligne = 0; -num = image1->ACCES_CANAL_INT[*canal-1]; -nboct_pix = image1->NBOCT_PIX; - -/*.......................................*/ -/* verification si ecriture image entiere */ -/*.......................................*/ - if ((*nombre_lignes_ecrire==image1->NB_LIG)&& - (*nombre_colonnes_ecrire==image1->NB_COL)) - { - tot_pix=nboct_pix*(image1->NB_COL)*(image1->NB_LIG); - - /* positionnement en debut de fichier */ - position_first_lig=lseek(num,0L,0); - - /* ecriture du canal complet */ - cr_write = write ( num , data_image,tot_pix); - if (cr_write != nboct_pix) - { - strcpy(CAI_ERREUR,"Erreur ecriture donnee image INRIA"); - goto ERREUR; - } - } - else - { - - -/********************************************************/ -/* Calcul de la position de la premiere ligne a ecrire */ -/********************************************************/ - -position_first_lig = - (long) ( image1->POS_OCTET[*canal-1] + - ((*premiere_ligne) - 1) *(*nombre_colonnes_ecrire) * nboct_pix ); - - -/********************************************************/ -/* Recuperation de la position courante */ -/********************************************************/ - -position_courante = lseek ( num , 0L , 1 ); - - -/********************************************************/ -/* Deplacement jusqu'a la premiere ligne a ecrire */ -/********************************************************/ - -deplacement = position_first_lig - position_courante; -lseek ( num , deplacement , 1 ); - - -/********************************************************/ -/* TANT QUE il y a des lignes a ecrire */ -/********************************************************/ -while (i_ligne < (*nombre_lignes_ecrire)) -{ - -/********************************************************/ -/* extraction de la ligne du tableau */ -/********************************************************/ - - buff_lig = data_image +(*nombre_colonnes_ecrire) * nboct_pix * i_ligne; - -/********************************************************/ -/* ecriture de la ligne */ -/********************************************************/ - - cr_write = write ( num , buff_lig ,(*nombre_colonnes_ecrire) * nboct_pix ); - if ( cr_write !=(*nombre_colonnes_ecrire) * nboct_pix ) - { - strcpy ( CAI_ERREUR , "Erreur ecriture canal image inria\n" ); - goto ERREUR; - } - -/********************************************************/ -/* incrementation du nombre de lignes */ -/********************************************************/ - - i_ligne++; - -/********************************************************/ -/* FIN TANT QUE */ -/********************************************************/ - } -} - - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} - -/* - Fin de l'operation cai_ecriture_canal_inria -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_inria */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format inria et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_inria(image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_inria (S) (CAI_OK_KO) : = CA_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_ferme_inria (CAI_IMAGE *image1) - - -{ - int iret; /* code retour de l'operation */ - int i_can; /* indice du canal a fermer */ - int num; /* descripteur du fichier a fermer */ - - - iret=CAI_OK; -/*............................................. - Fermeture des fichiers image - .............................................*/ - for (i_can=0;i_can<image1->NB_CANAUX;i_can=i_can+1) - { - num=image1->ACCES_CANAL_INT[i_can]; - if (num>0) close(num); - } - - return (iret); -} - - -/* - Fin de l'operation cai_ferme_inria -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_inria */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en inria et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_inria(format,nom_ima) */ /* ------------------ */ -/* format (E) (char *) : format de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_inria (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_dest_ima_inria ( char *repertoire , - char *nom_ima ) - -{ -int i_can; /* compteur de canaux */ -long iret; /* code retour fonction fermetrue lecture */ -char str_num_canal[3]; /* suffixe numero du canal */ -char nom_fic[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ -char nom_fic_canal[1024]; /* nom du fichier canal a detruire */ - -int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ - -CAI_IMAGE *image1; /* structure ouverture image */ -int nb_can; /* nombre de canaux de l'image */ -int nboct_pix; /* nombre d'octets par pixel image */ -int nb_col; /* nombre de colonnes de l'image */ -int nb_lig; /* nombre de lignes de l'image */ - -/************************************************/ -/* Constitution du nom du fichier d'entete */ -/************************************************/ -if ((long int)strlen(repertoire)!= 0) -{ - sprintf ( nom_ima_complet, "%s/%s",repertoire,nom_ima ); - -} -else -{ - strcpy ( nom_ima_complet , nom_ima); -} -sprintf(nom_fic ,"%s.xs", nom_ima_complet); - -/************************************************/ -/* Extraction des caracteristiques de l'image */ -/* du fichier entete par l'appel a la fonction */ -/* cai_ouvre_lecture_inria */ -/************************************************/ - image1 = cai_ouvre_lecture_inria ( repertoire,nom_ima, &nb_can ,&nboct_pix , - &nb_col , &nb_lig ); - if ( image1 == NULL) goto ERREUR; - - image1->NB_CANAUX=nb_can; - image1->NB_COL=nb_col; - image1->NB_LIG=nb_lig; - image1->NBOCT_PIX=nboct_pix; - - iret=cai_ferme_inria(image1); - - image1 = NULL; - -/************************************************/ -/* Recherche de tous les fichiers au nom */ -/* de l'image comportant une extension */ -/*.xsi avec i = 0 -> nb_can et destruction */ -/************************************************/ - -for ( i_can = 0 ; i_can < nb_can+1 ; i_can++ ) -{ - nom_fic_canal[0] = '\0'; - sscanf ( nom_fic , "%s" , nom_fic_canal ); - sprintf ( str_num_canal , "%d" , i_can ); - strcat ( nom_fic_canal , str_num_canal ); - nom_fic_canal[strlen(nom_ima_complet)+3+strlen(str_num_canal)]='\0'; - - cr_stat = stat ( nom_fic_canal , &buf_stat ); - if ( cr_stat == 0 ) - { - /* le fichier existe => destruction */ - unlink ( nom_fic_canal ); - } -} - - - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} -/* - Fin de l'operation cai_dest_ima_inria -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_inria */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture-ecriture d'une image au format */ -/* ----- inria et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_inria (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_inria (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_modifie_inria(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) -{ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom du fichier canal a ouvrir */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - char car[3]; /* indice du canal traite */ - int i,num; /* indice */ - char *buf_lec ; /* buffer lecture entete inria */ - int nb_bits; /* nombre de bits par pixels */ - char str_no; /* variable de lecture */ - short int n1; /* variable de travail de lecture */ - long k,n; - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - *nb_can=0; - - iret=1; - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1: FA Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_modifie"); - } - else - { -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL et ouverture - de ces fichiers - Recherche du nombre de canaux de l'image - .....................................................*/ - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.xs",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.xs",nom_image); - } - - for (i=0;i<50;i=i+1) - { - nom_fic_canal[0]='\0'; - sscanf(nom_fic,"%s",nom_fic_canal); - sprintf(car,"%d",i); - strcat(nom_fic_canal,car); - num=open(nom_fic_canal,O_RDWR|O_BINARY,0); - - - if (num != -1) - { - - if (*nb_can<100) - { - sscanf(nom_image,"%s",deb); - strcat(deb,".xs"); - strcat(deb,car); - deb=deb+100; - - - sscanf(nom_image,"%s",deb1); - strcat(deb1,".xs"); - strcat(deb1,car); - deb1=deb1+100; - image1->ACCES_CANAL_INT[*nb_can]=num; - *nb_can=*nb_can+1; - } - - } - } - - if ((*nb_can) == 0) - { - iret = 0; - } - else - { -/*................................... - Lecture du fichier entete - ............................................*/ - - buf_lec=(char *) calloc(256,sizeof(char)); - if (buf_lec==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_modifie"); - } - else - { - - num=image1->ACCES_CANAL_INT[0]; - - k=read(num,buf_lec,256); - if (k!=256) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur lecture entete Inria"); - } - else - { - -/*................................. - Decodage de l'enregistrement (nouveu format inria) - .........................................*/ - if (buf_lec[10]=='4') - { - - sscanf(&buf_lec[19],"%4d",nb_col); - sscanf(&buf_lec[29],"%4d",nb_lig); - sscanf(&buf_lec[78],"%2d",&nb_bits); - - /* le nombre recupere represente le nombre de */ - /* bits ou le nombre d'octets codant un pixel */ - /* cette information est transmise via le */ - /* parametre nboct_pix inutilise sur SUN */ - if ( (nb_bits==8) || (nb_bits==16) ) - *nboct_pix = nb_bits/8; - else if ( (nb_bits==1) || (nb_bits==2) ) - *nboct_pix = nb_bits; - image1->NB_BITS_PIX= nb_bits; - for (i=0;i<*nb_can;i=i+1) - { - image1->POS_OCTET[i]=1024; - } - } - else - { -/*................................. - Decodage de l'enregistrement (ancien format inria) - .........................................*/ - - lseek(num,0L,0); - n=read(num,(char*)&n1,2); - if (n<=0) - { - iret=0; - strcpy(CAI_ERREUR, - "Erreur lecture entete inria"); - } - *nb_col=(int)n1; - - n=read(num,(char*)&n1,2); - if (n<=0) - { - iret=0; - strcpy(CAI_ERREUR, - "Erreur lecture entete inria"); - } - *nb_lig=(int)n1; - - n=read(num,&str_no,1); - if (n<=0) - { - iret=0; - strcpy(CAI_ERREUR, - "Erreur lecture entete inria"); - } - nb_bits = (int)str_no; - - /* le nombre recupere represente le nombre de */ - /* bits ou le nombre d'octets codant un pixel */ - /* cette information est transmise via le */ - /* parametre nboct_pix inutilise sur SUN */ - if ( (nb_bits==8) || (nb_bits==16) ) - *nboct_pix = nb_bits/8; - else if ( (nb_bits==1) || (nb_bits==2) ) - *nboct_pix = nb_bits; - - for (i=0;i<*nb_can;i=i+1) - { - image1->POS_OCTET[i]=256; - } - } - if (*nboct_pix ==1) - sprintf(image1->COD_PIX,"OCT"); - else - sprintf(image1->COD_PIX,"I2"); - } - free(buf_lec); - } - } - } - - if (iret == 0) - { - return (NULL); - } - else - { - return (image1); - } - -} -/* - Fin de l'operation cai_ouvre_modifie_inria -*/ - diff --git a/Utilities/CAI/cai_dll/src/cai_jpeg.c b/Utilities/CAI/cai_dll/src/cai_jpeg.c deleted file mode 100755 index ef2176cbd0..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_jpeg.c +++ /dev/null @@ -1,1008 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_jpeg.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format jpeg */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : Octobre 1998 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V4.0 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION :2 : DM :optimisation */ -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 :FA:Verification que le nombre d'octets par pixel est */ -/* egal a 1 et le nombre de canaux est 1 ou 3. jpeg est un format de */ -/* restitution */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : test sur fclose pour PC/LINUX */ -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : modifiation fermeture avant decompression */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <stdlib.h> -# include <unistd.h> -# include <sys/types.h> -# include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> - -#define _CAI_IMAGE -#define IN_CAI_JPEG - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_jpeg.c,v 1.4 01/05/31 10:47:32 cmf Exp $"; - - -extern char *getenv(); - - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_jpeg */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format jpeg */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_jpeg(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_jpeg (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -long int cai_liste_ima_jpeg (char *repert, - char ***tab_ima) - - -{ - - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - struct dirent *dp; /* structure resultat de la fonction readdir */ - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - int nb_ima; /* nombre d'images jpeg identifiees */ - long int i; /* indice de boucle */ - long int ll,dif; /* variables de travail */ - char blanc; /* caractere blanc */ - - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - dirp=opendir(repert); - blanc = ' '; - - if(dirp!=NULL) - { - - -/*...................................... - - premiere passe pour comptabiliser les images du format donne - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE JPEG - (EXTENSION =.jpg) - ..........................................*/ - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,".jpg"); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - nb_ima=nb_ima+1; - - } - } - - (void)closedir(dirp); - -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT JPEG - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE JPEG - (EXTENSION =.jpeg) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,".jpg"); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - { - *pch0='\0'; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - - } - } - - (void)closedir(dirp); - - - } - else - { - /* repertoire inexistant */ - nb_ima=-1; - } - return(nb_ima); - -} - -/* Fin de l'operation cai_liste_ima_jpeg -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_jpeg */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format jpeg */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_jpeg (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_jpeg (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_lecture_jpeg(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - char label[80]; /* contient un enregistrement du fichier */ - int nbbit; /* nb de bits par pixel du fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines*/ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - int i,num; /* indice */ - int nbplan; /* nombre de canaux dans le fichier en-tete */ - char COD_PIX[80]; /* type de codage du pixel (optionnel) */ - struct jpeg_decompress_struct *cinfo; - static struct jpeg_error_mgr jerr; - - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - cinfo = (struct jpeg_decompress_struct *)calloc(1, - sizeof(struct jpeg_decompress_struct)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if ((image1==NULL)||(cinfo==NULL)) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_lecture"); - } - else - { - -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.jpg",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.jpg",nom_image); - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=NULL; - fic_in=fopen(nom_fic,"rb"); - if (fic_in==NULL) - { - iret=0; - sprintf(CAI_ERREUR,"Erreur ouverture fichier entete JPEG %s",nom_fic); - free(cinfo); - cinfo = NULL; - image1->ACCES_CANAL_JPEG_LEC=cinfo; - } - else - { - cinfo->err=jpeg_std_error(&jerr); - jpeg_create_decompress(cinfo); - - jpeg_stdio_src(cinfo,fic_in); - (void) jpeg_read_header(cinfo,TRUE); - jpeg_start_decompress(cinfo); - - *nb_can = cinfo->num_components; - *nb_lig = cinfo->image_height; - *nb_col = cinfo->image_width; - *nboct_pix = 1; - sprintf(image1->COD_PIX,"OCT"); - image1->ACCES_CANAL_JPEG_LEC=cinfo; - image1->ACCES_FILE_JPEG=fic_in; - image1->POS_OCTET[0]=CAI_JPEG_LECTURE; - - } - -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.jpg",repert,nom_image); - } - else - { - sprintf(nom_fic_canal,"%s.jpg",nom_image); - } - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_image,"%s",deb); - deb=deb+100; - sscanf(nom_image,"%s",deb1); - deb1=deb1+100; - image1->POS_OCTET[i]=0; - } - } - if (iret == 0) - { - return (NULL); - } - else - { - return(image1); - } - -} - -/* - Fin de l'operation cai_ouvre_lecture_jpeg -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_jpeg */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format jpeg et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_jpeg (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_jpeg (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_creation_jpeg(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig, - char *label) - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - int retour; /* retour de fonction */ - int i,nboctet; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - struct jpeg_compress_struct *cinfo; - static struct jpeg_error_mgr jerr; -/*****************************************************************************/ -/* MOD : VERSION : 4.2 :FA:Verification que le nombre d'octets par pixel est */ -/* egal a 1 et le nombre de canaux est 1 ou 3. jpeg est un format de */ -/* restitution */ -/*****************************************************************************/ -/* Verification sur le nombre d'octets par pixel */ - - if (*nboct_pix !=1) - { - strcpy(CAI_ERREUR,"Erreur une image jpeg ne peut etre codee que sur un seul octet"); - goto ERREUR; - } - -/* Verification sur le nombre de canaux */ - if ((*nb_can !=1)&&(*nb_can !=3)) - { - strcpy(CAI_ERREUR,"Erreur une image jpeg a 1 ou 3 canaux exclusivement"); - goto ERREUR; - } - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } - -/*................................................. - Constitution du nom du fichier et verification qu'il - n'existe pas deja - .................................................*/ - - nom_fic[0]='\0'; - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.jpg",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.jpg",nom_image); - } - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s JPEG existe \n" , nom_image ); - goto ERREUR; - } - -/* allocation du tableau contenant l'image entiere */ - nboctet = (*nb_col)*(*nb_lig)*(*nb_can); - image1->image_JPEG = (JSAMPLE *) calloc(nboctet,sizeof(JSAMPLE)); - if (image1->image_JPEG==NULL) - { - sprintf(CAI_ERREUR,"Erreur allocation memoire image JPEG"); - goto ERREUR; - } - -/*............................................................... - Ouverture du fichier en ecriture avec allocation de la structure - .................................................................*/ - cinfo = (struct jpeg_compress_struct *)calloc(1, - sizeof(struct jpeg_compress_struct)); - if (cinfo==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } - - cinfo->err=jpeg_std_error(&jerr); -/* Now we can initialize the JPEG compression object. */ - jpeg_create_compress(cinfo); - - fic = fopen(nom_fic,"wb"); - if (fic == NULL) - { - sprintf(CAI_ERREUR,"Erreur: Creation fichier %s impossible\n",nom_fic); - goto ERREUR; - } - image1->ACCES_FILE_JPEG = fic;; - - jpeg_stdio_dest(cinfo, fic); - - /* set parameters for compression */ - - /* First we supply a description of the input image. - * Four fields of the cinfo struct must be filled in: - */ - cinfo->image_width = *nb_col; - cinfo->image_height = *nb_lig; - cinfo->input_components = *nb_can; /* # of color components per pixel */ - if (*nb_can==1) - cinfo->in_color_space = JCS_GRAYSCALE; - else - cinfo->in_color_space = JCS_RGB; /* colorspace of input image */ - - /* Now use the library's routine to set default compression parameters. - * (You must set at least cinfo.in_color_space before calling this, - * since the defaults depend on the source color space.) - */ - jpeg_set_defaults(cinfo); - - /* Now you can set any non-default parameters you wish to. - * Here we just illustrate the use of quality (quantization table) scaling: - */ - jpeg_set_quality(cinfo, 90, TRUE /* limit to baseline-JPEG values */); - - /* Start compressor */ - - /* TRUE ensures that we will write a complete interchange-JPEG file. - * Pass TRUE unless you are very sure of what you're doing. - */ - jpeg_start_compress(cinfo, TRUE); - - image1->ACCES_CANAL_JPEG_ECR = cinfo; - - image1->POS_OCTET[0]=CAI_JPEG_ECRITURE; - image1->NBOCT_PIX = 1; - - return (image1); - -ERREUR : - return(NULL); -} - -/* - Fin de l'operation cai_ouvre_creation_jpeg -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_jpeg */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image jpeg */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_jpeg(image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_jpeg (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_lecture_canal_jpeg(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) -{ - JSAMPARRAY buffer; - struct jpeg_decompress_struct *cinfo; - static struct jpeg_error_mgr jerr; - int i,j,k,n; /* variables de travail */ - int pt_oct; /* position courante dans le fichier image */ - int no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - int lig; /* indice de boucle sur les lignes */ - int oct_pix; /* nb octets par pixels */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - int oct_lig; /* nb oct. par ligne en considerant taille pixel */ - int nbcan; /* nombre de canaux de l'image */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - FILE *infile; /* acces au fichier jpeg */ - - -/*........................... - Initialisations diverses - ..........................*/ - - iret=CAI_OK; - cinfo=image1->ACCES_CANAL_JPEG_LEC; - oct_pix=image1->NBOCT_PIX; - nbcan = image1->NB_CANAUX; - oct_lig=nbcan*(image1->NB_COL); - -if ((*premiere_ligne)-1 != cinfo->output_scanline) -{ - cinfo->output_scanline = cinfo->image_height; - jpeg_finish_decompress(cinfo); - jpeg_destroy_decompress(cinfo); - - infile = image1->ACCES_FILE_JPEG; - rewind(infile); - cinfo->err=jpeg_std_error(&jerr); - jpeg_create_decompress(cinfo); - jpeg_stdio_src(cinfo,infile); - (void) jpeg_read_header(cinfo,TRUE); - jpeg_start_decompress(cinfo); -} -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - buffer = (*cinfo->mem->alloc_sarray)((j_common_ptr)cinfo, - JPOOL_IMAGE,oct_lig,1); - if (buffer == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire JPEG"); - } - else - { -if ((*premiere_ligne)-1 != cinfo->output_scanline) -{ - - -/* positionnement jusqu'a la premiere ligne a lire */ - for (lig=0;lig <(*premiere_ligne)-1;lig++) - { - (void) jpeg_read_scanlines(cinfo,buffer,1); - - } -} -/* recuperation des lignes demandees */ - lig=(*premiere_ligne)-1; - i=1; - pch = data_image; - - while ((i <= (*nombre_lignes_lire))&&(iret==CAI_OK)) - { - cinfo->output_scanline = lig; - n = jpeg_read_scanlines(cinfo,buffer,1); - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image JPEG"); - } - else - { -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - deb = *buffer; - deb=deb+((*premiere_colonne)-1)*nbcan+(*canal-1); - j=1; - while (j <= (*nombre_colonnes_lire)) - { - - *pch=*deb; - pch=pch+1; - j=j+1; - deb=deb+((*pas_colonne)*oct_pix*nbcan); - } - - i=i+1; - lig=lig+1; - j = 1; - while ((j < (*pas_ligne))&&(iret==CAI_OK) - &&(lig+1<(image1->NB_LIG))) - { - cinfo->output_scanline = lig; - n = jpeg_read_scanlines(cinfo,buffer,1); - - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image JPEG"); - } - else - lig=lig+1; - j = j+1; - } - } - } - } - - return(iret); - } -/* - Fin de l'operation cai_lecture_canal_jpeg -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_jpeg */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image jpeg */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_jpeg(image1, canal, */ /* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_jpeg (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ecriture_canal_jpeg (CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) -{ -int i_ligne; /* compteur de lignes */ -int num; /* descripteur de fichier */ -int nboct_pix; /* nombre d'octets par pixel */ -int nbcan; /* nombre de canaux de l'image */ -int nboctet; /* nombre d'octets d'une ligne multi */ -int ires,ideb,col,indk; /* indice */ - -/* initialisations */ -i_ligne = 0; -nboct_pix = image1->NBOCT_PIX; -nbcan = image1->NB_CANAUX; -nboctet = (*nombre_colonnes_ecrire)*nbcan*(nboct_pix); - - -/********************************************************/ -/* TANT QUE il y a des lignes a ecrire */ -/********************************************************/ -ires = ( *premiere_ligne - 1) *nboctet+(*canal-1); -ideb = 0; -while (i_ligne < (*nombre_lignes_ecrire)) -{ - -/*************************************************************************/ -/* chargement de la ligne entrelacant les pixels par rapport aux canaux*/ -/*************************************************************************/ - for (col=0;col<(*nombre_colonnes_ecrire);col++) - { - for (indk=0;indk<nboct_pix;indk++) - { - image1->image_JPEG[ires] = data_image[ideb+indk]; - } - ires = ires + (nboct_pix*nbcan); - ideb = ideb + nboct_pix; - } -/********************************************************/ -/* incrementation du nombre de lignes */ -/********************************************************/ - - i_ligne++; - -/********************************************************/ -/* FIN TANT QUE */ -/********************************************************/ - -} - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} - -/* - Fin de l'operation cai_ecriture_canal_jpeg -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_jpeg */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format jpeg et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_jpeg(image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_jpeg (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_jpeg (CAI_IMAGE *image1) - - -{ - int iret; /* code retour de l'operation */ - FILE *infile; /* descripteur du fichier a fermer */ - struct jpeg_decompress_struct *cinfoL; /* structure du fichier a fermer */ - struct jpeg_compress_struct *cinfoE; /* structure du fichier a fermer */ - JSAMPROW row_pointer[1]; /* pointer to JSAMPLE row[s] */ - int nboctet; /* nb d'octets par ligne */ - -/* initialisations */ -/*.................*/ - iret=CAI_OK; - -if (image1 !=NULL) -{ - nboctet = (image1->NB_COL)*(image1->NB_CANAUX); -/*............................................. - Fermeture differente si lecture ou ecriture d'images - .............................................*/ - if (image1->POS_OCTET[0]==CAI_JPEG_LECTURE) - { -/* Fermeture d'image simple pour une lecture avec liberation des */ -/* espaces memoires */ - cinfoL = image1->ACCES_CANAL_JPEG_LEC; - if (cinfoL != NULL) - { -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : modifiation fermeture avant decompression */ -/*****************************************************************************/ - cinfoL->output_scanline=image1->NB_LIG; - - jpeg_finish_decompress(cinfoL); - jpeg_destroy_decompress(cinfoL); - free(cinfoL); - cinfoL = NULL; - } - } - else - { -/* cas ecriture d'une image au format JPEG : avant de fermer l'image */ -/* ecriture compressee du tableau conteant l'image */ - cinfoE = image1->ACCES_CANAL_JPEG_ECR; - if (cinfoE != NULL) - { - - while (cinfoE->next_scanline < cinfoE->image_height) - { - /* jpeg_write_scanlines expects an array of pointers to scanlines. - * Here the array is only one element long, but you could pass - * more than one scanline at a time if that's more convenient. - */ - row_pointer[0] = - & (image1->image_JPEG[cinfoE->next_scanline * nboctet]); - (void) jpeg_write_scanlines(cinfoE, row_pointer, 1); - } - /* Finish compression */ - - jpeg_finish_compress(cinfoE); - - /* After finish_compress, we can close the output file. */ - - /* release JPEG compression object */ - - /* This is an important step since it will release a good */ - /* deal of memory. */ - jpeg_destroy_compress(cinfoE); - free(cinfoE); - cinfoL = NULL; - } - if (image1->image_JPEG != NULL) - { - free(image1->image_JPEG); - image1->image_JPEG = NULL; - } - } - - infile=image1->ACCES_FILE_JPEG; - if (infile!=NULL) fclose(infile); -} - return (iret); -} - -/* - Fin de l'operation cai_ferme_jpeg -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_jpeg */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en jpeg et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_jpeg(repertoire,nom_ima) */ /* ------------------ */ -/* repertoire (E) (char *) : repertoire de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_jpeg (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_dest_ima_jpeg ( char *repertoire , - char *nom_ima ) - -{ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ - -int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ - -/************************************************/ -/* Constitution du nom du fichier d'entete */ -/************************************************/ - -if ((long)strlen(repertoire)!= 0) -{ - sprintf(nom_ima_complet,"%s/%s.jpg",repertoire,nom_ima); -} -else -{ - sprintf(nom_ima_complet,"./%s.jpg",nom_ima); -} - -/********************************/ -/* Destruction du fichier */ -/********************************/ - -cr_stat = stat ( nom_ima_complet , &buf_stat ); -if ( cr_stat == 0 ) - unlink ( nom_ima_complet ); - -return (CAI_OK); - -} -/* - Fin de l'operation cai_dest_ima_jpeg -*/ diff --git a/Utilities/CAI/cai_dll/src/cai_lum.c b/Utilities/CAI/cai_dll/src/cai_lum.c deleted file mode 100755 index 764e2103d5..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_lum.c +++ /dev/null @@ -1,1765 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_lum.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format lum */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : Octobre 97 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 3.3 : DM:optimisation des acces */ -/*****************************************************************************/ -/* MOD : VERSION : 4.0 : DM:possibilite de lire des images en R4 */ -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM :fonctions de test machine et inversions */ -/* deviennent generiques */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : modifications open binaire pour PC/NT */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : test sur fclose pour PC/LINUX */ -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : DM : Lecture des images codées de 9 à 16 bits en */ -/* IEEE (BI) et INTEL (LI) */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte des I4,UI2,UI4 et R8 */ -/* en lecture et ecriture en big et little endian */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <sys/types.h> -# include <stdlib.h> -# include <unistd.h> -# include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> -# include <fcntl.h> -# include <malloc.h> -# include <math.h> -# include <unistd.h> - - - -#define _CAI_IMAGE -#define IN_CAI_LUM - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_lum.c,v 1.11 01/05/31 10:47:29 cmf Exp $"; - - -extern char *getenv(); -int cai_recuptyp_lum(char *type_code, char *SensCode, int *nbbits, - char *cod_pix); - - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_lum */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format lum */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_lum(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_lum (S) (int) : = -1 repertoire inexistant */ -/* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -long int cai_liste_ima_lum (char *repert, - char ***tab_ima) - - -{ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - struct dirent *dp; /* structure resultat de la fonction readdir */ - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - char car; /* variable de travail */ - int nb_ima; /* nombre d'images lum identifiees */ - long int i; /* indice de boucle */ - long int ll,dif; /* variables de travail */ - char blanc; /* caractere blanc */ - - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - - dirp=opendir(repert); - - if(dirp!=NULL) - { -/*...................................... - - premiere passe pour comptabiliser les images du format donne - - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE LUM - (EXTENSION =.lum) - ..........................................*/ - - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,".lum"); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - nb_ima=nb_ima+1; - - } - - } - - closedir(dirp); -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT LUM - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE LUM - (EXTENSION =.lum) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - - while((dp=readdir(dirp))!=NULL) - { - pch0=strstr(dp->d_name,".lum"); - if (pch0 != NULL) - { - ll = strlen(dp->d_name); - dif = (long)(dp->d_name-pch0); - dif=labs(dif); - pch1=pch0+4; - if (((ll-4)==dif)||((*pch1)==blanc)) - { - *pch0='\0'; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - - } - } - - closedir(dirp); - - } - else - { - /* Erreur : Repertoire inexistant */ - nb_ima=-1; - } - - return(nb_ima); - -} -/* Fin de l'operation cai_liste_ima_lum*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_lum */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format lum */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_lum(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_lum (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte des UOCT, I4,UI2,UI4 et R8 */ -/* en lecture et ecriture en big et little endian */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_lecture_lum(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret,icr; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence */ - int nbbits; /* nb de bits par pixel du fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines */ - int i,num; /* indice */ - char *type_cod; /* type de codage du pixel */ - char cod_pix[5]; /* codage du pixel */ - char type_image[3]; /* type code+ordre rangement octets dans entete*/ - char *type_machine; /* ordre rangement octets machine travail */ - char buf[15]; /* buffer contenant entete image */ - int v; /* comparaison type machine-type image */ - char *v1; /* comparaison type image avec chaine vide */ - int nb_col2, nb_lig2,nb; /* variables intermediaires inversion octets */ - int taille; /* nb d'octets par pixel */ - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - nb=2; - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - - iret=1; - type_cod = NULL; - type_cod = (char *) calloc(5,sizeof(char)) ; - type_machine = NULL; - type_machine = (char *) calloc(3,sizeof(char)); - - if (type_machine == NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_lecture"); - } - - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_lecture"); - } - else - { -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.lum",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.lum",nom_image); - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ - fic_in=NULL; - fic_in=fopen(nom_fic,"rb"); - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete LUM"); - } - else - { - -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ -/*.................................. - recuperation infos completes - ......................................*/ - fread(buf,12,1,fic_in); - -/*.................................. - recuperation du type de codage des pixels - et donc du type de l'image - ......................................*/ - memcpy(type_cod,&buf[8],4); - taille = cai_recuptyp_lum(type_cod,type_image,&nbbits,cod_pix); - if (taille != -1) - { - sprintf(image1->TYPE_COD,type_cod); - image1->NB_BITS_PIX=nbbits; - image1->NBOCT_PIX=taille; - sprintf(image1->COD_PIX,cod_pix); - *nboct_pix = image1->NBOCT_PIX; - *nb_can = 1; - } - else - { - iret=0; - sprintf(CAI_ERREUR,"Type de codage LUM non reconnu : %s",type_cod); - goto ERREUR; - } - - /*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - type_machine = cai_test_pFpf(); - - /*.................................. - determination des autres infos - en fonction inversion - ......................................*/ - - v = strncmp(type_machine,type_image,2); - v1 = strrchr(type_image,'E'); - -/*.................................. - recuperation du nombre de colonne - ......................................*/ - memcpy(nb_col,&buf[0],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)nb_col, (void*)&nb_col2,4 ); - cai_inverser_tableau((short *)nb_col, (short *)&nb_col2,nb); - } -/*.................................. - recuperation du nombre de lignes - ......................................*/ - memcpy(nb_lig,&buf[4],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)nb_lig, (void*)&nb_lig2,4 ); - cai_inverser_tableau((short *)nb_lig, (short *)&nb_lig2,nb); - } - -/**********************/ -/* fin modifications */ -/**********************/ - } - -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in != NULL) fclose(fic_in); - - if (iret !=0) - { -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - if ((long)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.lum",repert,nom_image); - } - else - { - sprintf(nom_fic_canal,"%s.lum",nom_image); - } - - num=open(nom_fic_canal,O_RDONLY|O_BINARY,0); - if (num!= -1) - { - - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_image,"%s",image1->NOM_FIC_CAN); - sscanf(nom_image,"%s",image1->NOM_UTIL_CAN); - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=(*nb_col)*image1->NBOCT_PIX; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ - if ( (v!=0) && (v1!=NULL) ) - { - image1->INV_OCTETS =1; - } - else - { - image1->INV_OCTETS =0; - } - -/**************************/ -/* fin modifications */ -/**************************/ - } - else - iret=0; - } - } -// if (type_cod!=NULL) free(type_cod); -// if (type_machine!=NULL) free(type_machine); - -ERREUR: - - if (iret == 0) - { - return (NULL); - } - else - { - return(image1); - } -} -/* - Fin de l'operation cai_ouvre_lecture_lum -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_lum */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format lum et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_lum(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_lum (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_creation_lum(char *repert, - char * nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig, - char *label) - - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - long retour; /* retour de fonction */ - int i,num; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - unsigned char *Header; /* entete du fichier lum */ - int taille_entete; /* taille de l'entete */ - char *type_image; /* type_code+infos ordre des octets dans entete*/ - int reconnaissance_type; /* taille du pixel */ - - fic = NULL; - image1=NULL; - - -/*********************************************/ -/* Verification qu'un seul canal est demande */ -/*********************************************/ - if (*nb_can != 1) - { - image1 = NULL; - sprintf ( CAI_ERREUR , - "Une image LUM ne peut contenir qu'un seul canal"); - goto ERREUR; - } - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } - -/*................................................. - Constitution du nom du fichier entete et verification qu'il - n'existe pas deja - .................................................*/ - - nom_fic[0]='\0'; - if ((long)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.lum",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.lum",nom_image); - } - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s LUM existe \n" , nom_image ); - goto ERREUR; - } - -/*...................................................... - Ouverture du fichier entete en ecriture - Ecriture du contenu - ..........................................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ - fic = NULL; - fic = fopen(nom_fic,"wb"); - if (fic == NULL) - { - sprintf(CAI_ERREUR,"Erreur: Creation fichier %s impossible\n",nom_fic); - goto ERREUR; - } - taille_entete = (*nb_col)*(*nboct_pix); - Header = (unsigned char *) calloc(taille_entete,sizeof( unsigned char)); - if (Header == NULL) - { - sprintf(CAI_ERREUR,"Erreur alloc: Creation fichier %s impossible\n", - nom_fic); - goto ERREUR; - } - -/*********************************************/ -/* ecriture du nombre de colonnes de l'image */ -/*********************************************/ - memcpy(Header,nb_col , 4 ); - -/*******************************************/ -/* ecriture du nombre de lignes de l'image */ -/*******************************************/ - memcpy(&Header[4],nb_lig , 4 ); - - -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ - -/*******************************************/ -/* ecriture du type de l'image dans la zone*/ -/* reservee au type de codage */ -/*******************************************/ - - /*.................................... - test sur la machine de travail pour - typer image en LE ou BE - .....................................*/ - - type_image = cai_test_pFpf(); - - -/**************************************/ -/* ecriture type de codage de l'image */ -/**************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : Maj du tag TYPE lorsque l'utilisateur le */ -/* precise dans le param "label" */ -/*****************************************************************************/ -/* Verification si type de codage reconnu dans le label */ - reconnaissance_type = cai_istyp_connu(label); - if (strncmp(type_image,"BE",2)==0) - { - if (*nboct_pix == 1) - { - if (reconnaissance_type < 1) - sprintf(image1->TYPE_COD,"08BI"); - else if (reconnaissance_type ==1) - sprintf(image1->TYPE_COD,"08BU"); - else - { - sprintf(CAI_ERREUR,"incoherence entre TYPE et Nb bits par pixels\n"); - goto ERREUR; - } - } - else if (*nboct_pix == 2) - { - if (reconnaissance_type ==3) - sprintf(image1->TYPE_COD,"16BU"); - else if ((reconnaissance_type == -1)|| (reconnaissance_type == 2)) - sprintf(image1->TYPE_COD,"16BI"); - else - { - sprintf(CAI_ERREUR,"incoherence entre TYPE et Nb bits par pixels\n"); - goto ERREUR; - } - } - else if (*nboct_pix == 4) - { - if (reconnaissance_type ==4) - sprintf(image1->TYPE_COD,"32BI"); - else if (reconnaissance_type ==5) - sprintf(image1->TYPE_COD,"32BU"); - else if ((reconnaissance_type == -1)|| (reconnaissance_type == 6)) - sprintf(image1->TYPE_COD,"FLOA"); - else - { - sprintf(CAI_ERREUR,"incoherence entre TYPE et Nb bits par pixels\n"); - goto ERREUR; - } - } - else if (*nboct_pix == 8) - { - if ((reconnaissance_type == -1)|| (reconnaissance_type ==7)) - sprintf(image1->TYPE_COD,"R8B "); - else - { - sprintf(CAI_ERREUR,"incoherence entre TYPE et Nbbits par pixels\n"); - goto ERREUR; - } - } - } - else - { - if (*nboct_pix == 1) - { - if (reconnaissance_type < 1) - sprintf(image1->TYPE_COD,"08LI"); - else if (reconnaissance_type ==1) - sprintf(image1->TYPE_COD,"08LU"); - else - { - sprintf(CAI_ERREUR,"incoherence entre TYPE et Nb bits par pixels\n"); - goto ERREUR; - } - } - else if (*nboct_pix == 2) - { - if (reconnaissance_type ==3) - sprintf(image1->TYPE_COD,"16LU"); - else if ((reconnaissance_type == -1)|| (reconnaissance_type == 2)) - sprintf(image1->TYPE_COD,"16LI"); - else - { - sprintf(CAI_ERREUR,"incoherence entre TYPE et Nb bits par pixels\n"); - goto ERREUR; - } - } - else if (*nboct_pix == 4) - { - if (reconnaissance_type ==4) - sprintf(image1->TYPE_COD,"32LI"); - else if (reconnaissance_type ==5) - sprintf(image1->TYPE_COD,"32LU"); - else if ((reconnaissance_type == -1)|| (reconnaissance_type == 6)) - sprintf(image1->TYPE_COD,"FLOL"); - else - { - sprintf(CAI_ERREUR,"incoherence entre TYPE et Nb bits par pixels\n"); - goto ERREUR; - } - } - else if (*nboct_pix == 8) - { - if ((reconnaissance_type == -1)|| (reconnaissance_type ==7)) - sprintf(image1->TYPE_COD,"R8L "); - else - { - sprintf(CAI_ERREUR,"incoherence entre TYPE et Nbbits par pixels\n"); - goto ERREUR; - } - } - - } - memcpy(&Header[8],image1->TYPE_COD , 4 ); - -/***********************/ -/* fin modifications */ -/***********************/ - - retour = fwrite ( Header , taille_entete , 1 , fic ); - free(Header); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , - "Erreur : ecriture entete impossible dans fichier %s\n", - nom_fic ); - goto ERREUR; - } - -/*************************************************/ -/* Fermeture du fichier */ -/*************************************************/ - - if (fic != NULL) fclose ( fic ); - - num = open(nom_fic,O_RDWR|O_BINARY,PERMS); - if (num == -1) - { - - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic); - goto ERREUR; - } - - for (i=0;i<*nb_can;i=i+1) - { - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=taille_entete; - } - - return (image1); - -ERREUR : - - if (fic !=NULL) cai_dest_ima_lum ( repert , nom_image ); - return(NULL); -} - -/* - Fin de l'operation cai_ouvre_creation_lum -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_lum */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image LUM */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_lum(image1, canal, */ -/* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_lum (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_lecture_canal_lum(CAI_IMAGE *image1 , - int *canal , - int * premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) - -{ - - int num,i,j,k,kk; /* variables de travail */ - long pt_oct,n; /* position courante dans le fichier image */ - int no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - int lig; /* indice de boucle sur les lignes */ - int oct_pix; /* nb octets par pixels */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - long oct_lig; /* nb oct. par ligne en considerant taille pixel */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - unsigned char *data_image2;/* pointeur donnees image pour inversion octets */ - int taille_image,Nb; /* taille en octets de l'image */ - - -/*********************************************/ -/* Verification qu'un seul canal est demande */ -/*********************************************/ - if (*canal != 1) - { - image1 = NULL; - sprintf ( CAI_ERREUR , - "Une image LUM ne contient qu'un seul canal"); - iret=CAI_KO; - } - else - { -/*........................... - Initialisations diverses - ..........................*/ - iret=CAI_OK; - num=image1->ACCES_CANAL_INT[*canal-1]; - oct_pix=image1->NBOCT_PIX; - taille_image = (*nombre_lignes_lire)*oct_pix*(*nombre_colonnes_lire); - data_image2 = NULL; - data_image2 = (unsigned char *) calloc(taille_image,sizeof(unsigned char)); - - if (data_image2 == NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_lecture_canal"); - iret=CAI_KO; - goto FIN; - } - - -/*.............................................................*/ -/* verification si lecture non sous-echantillonnee par bandeau */ -/*.............................................................*/ - if ((*nombre_colonnes_lire==image1->NB_COL)&&(*premiere_colonne==1)&& - (*pas_ligne==1)&&(*pas_colonne==1)) - { - oct_lig=(*nombre_lignes_lire)*oct_pix*(image1->NB_COL); - pch=data_image; - -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - lig=*premiere_ligne; - no_oct=image1->POS_OCTET[*canal-1]+ - (lig-1)*image1->NB_COL*oct_pix; - - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture des lignes completes - ................................................*/ - n=read(num,pch,oct_lig); - - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image LUM"); - goto FIN; - } - - } - else - { - oct_lig=oct_pix*image1->NB_COL; - -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - buf_lec = NULL; - buf_lec = (unsigned char *) calloc(oct_lig,sizeof(unsigned char)); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - } - else - { -/*.................... - Initialisation - ......................*/ - lig=*premiere_ligne; - i=1; - pch=data_image; - -/*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i <= *nombre_lignes_lire)&&(iret==CAI_OK)) - { -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - - no_oct=image1->POS_OCTET[*canal-1]+ - (lig-1)*image1->NB_COL*oct_pix; - - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture d'une ligne image - ................................................*/ - n=read(num,buf_lec,oct_lig); - - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image LUM"); - } - else - { -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - deb=buf_lec+(*premiere_colonne-1)*oct_pix; - j=1; - while (j <= *nombre_colonnes_lire) - { - for (k=0;k<oct_pix;k=k+1) - { - *(pch+k)=*(deb+k); - } - j=j+1; - pch=pch+oct_pix; - deb=deb+(*pas_colonne*oct_pix); - } - - } - i=i+1; - lig=lig+(*pas_ligne); - } - - free(buf_lec); - buf_lec=NULL; - } - } - } - - -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ - - - if ( (iret!= CAI_KO) && (image1->INV_OCTETS==1) && (oct_pix!=1) ) - { - - /*modification ordre selon nb octets par pixel*/ - swab( (void*)(data_image), (void*)(data_image2), taille_image); - - if (oct_pix!=2) - { - Nb = taille_image/2; - cai_inverser_tableau(data_image, data_image2,Nb); - } - else - for (i=0; i<taille_image;i++) - { - /*stockage dans data_image*/ - data_image[i] = data_image2[i]; - } - - } - -/*************************/ -/* fin modifications */ -/*************************/ - FIN: - if (data_image2!= NULL) free(data_image2); - - return(iret); -} - -/* - Fin de l'operation cai_lecture_canal_lum -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_lum */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image lum */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_lum(image1, canal, */ -/* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de colonnes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_lum (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_ecriture_canal_lum (CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) -{ -long position_first_lig; /* position de la 1ere ligne a ecrire */ -long position_courante; /* position courante dans le fichier */ -long deplacement; /* deplacement a effectuer */ -unsigned char *buff_lig; /* pointeur de travail bandeau a ecrire */ -long cr_write; /* code retour de write */ -int num; /* descripteur de fichier */ -int nboct_pix; /* nombre d'octets par pixel */ -int nb_canaux; /* nombre de canaux de l'image totale */ -int nboct_ecrire; /* nb d'octets du bandeau a ecrire */ - -/*********************************************/ -/* Verification qu'un seul canal est demande */ -/*********************************************/ - if (*canal != 1) - { - image1 = NULL; - sprintf ( CAI_ERREUR , - "Une image LUM ne contient qu'un seul canal"); - goto ERREUR; - } - -/* ................ - Initialisations - .................*/ - - num = image1->ACCES_CANAL_INT[*canal-1]; - nboct_pix = image1->NBOCT_PIX; - nb_canaux = 1; - position_first_lig = 0; - position_courante = 0; - deplacement = 0; - nboct_ecrire = 0; - -/********************************************************/ -/* Calcul de la position de la premiere ligne a ecrire */ -/********************************************************/ - - position_first_lig = (long) ( image1->POS_OCTET[*canal-1] + - + (*premiere_ligne - 1) * - (*nombre_colonnes_ecrire) * nboct_pix ); -/********************************************************/ -/* Recuperation de la position courante */ -/********************************************************/ - - position_courante = lseek ( num , 0L , 1 ); - -/********************************************************/ -/* Calcul du deplacement jusqu'a la 1ere ligne a ecrire */ -/********************************************************/ - - deplacement = position_first_lig - position_courante; - -/*******************************************************/ -/* deplacement jusqu'a la premiere ligne a ecrire*/ -/*******************************************************/ - - lseek ( num , deplacement , 1 ); - -/***********************************************/ -/* position en debut de bandeau a ecrire */ -/***********************************************/ - - buff_lig = data_image; - -/********************************************************/ -/* ecriture des lignes */ -/********************************************************/ - nboct_ecrire = (*nombre_colonnes_ecrire)*nboct_pix* - (*nombre_lignes_ecrire); - - cr_write = write ( num , buff_lig,nboct_ecrire); - - if ( cr_write != nboct_ecrire) - { - strcpy ( CAI_ERREUR , "Erreur ecriture canal image lum\n" ); - goto ERREUR; - } - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} -/* - Fin de l'operation cai_ecriture_canal_lum -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_lum */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format lum et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_lum(image1) */ -/* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_lum (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_lum (CAI_IMAGE *image1) - - -{ - - int iret; /* code retour de l'operation */ - int num; /* descripteur du fichier a fermer */ - unsigned char Header[12]; /* entete a MAJ si creation */ - int temp; /* variable temporaire */ - long pt_oct; /* position courante ds fichier image */ - long retour; - -/*--------------------------*/ -/* Initialisations diverses */ -/*--------------------------*/ - iret=CAI_OK; - num=image1->ACCES_CANAL_INT[0]; - -/*--------------------------------------------------*/ -/* Mise a jour de l'entete si ouverture en creation */ -/*--------------------------------------------------*/ -if (image1->MODE == CAI_ECRITURE) -{ - pt_oct=lseek(num,0L,0); - -/*******************************************************/ -/* ecriture nombre de colonnes */ -/*******************************************************/ - temp = image1->NB_COL; - memcpy(Header,&temp , 4 ); - -/*******************************************************/ -/* ecriture nombre de ligne */ -/*******************************************************/ - temp = image1->NB_LIG; - memcpy(&Header[4],&temp , 4 ); - -/*****************************************************************/ -/* ecriture du type de codage en fonctions de la taille du pixel */ -/* et du codage des Poids Forts, poids faibles */ -/*****************************************************************/ - memcpy(&Header[8],image1->TYPE_COD , 4 ); - - retour = write ( num,Header , 12 ); - if ( temp == 0 ) - { - sprintf ( CAI_ERREUR , - "Erreur : MAJ entete a la fermeture impossible ds fichier lum\n"); - goto ERREUR; - } - -} - -/*............................................. - Fermeture du fichier qui contient tous les canaux - .............................................*/ - if (num>0) close(num); - - return (iret); - -ERREUR: - return(CAI_KO); - -} - -/* - Fin de l'operation cai_ferme_lum -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_lum */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en lum et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_lum(repertoire,nom_ima) */ -/* ------------------ */ -/* repertoire (E) (char *) : repertoire de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_lum (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_dest_ima_lum ( char *repertoire , - char *nom_ima ) - - -{ -int i_can; /* compteur de canaux */ -int iret; /* code retour fonction fermetrue lecture */ -char str_num_canal[3]; /* suffixe numero du canal */ -char nom_fic_entete[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ -char nom_fic_canal[1024]; /* nom du fichier canal a detruire */ - -int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ - -CAI_IMAGE *image1; /* structure ouverture image */ -int nb_can; /* nombre de canaux de l'image */ -int nboct_pix; /* nombre d'octets par pixel image */ -int nb_col; /* nombre de colonnes de l'image */ -int nb_lig; /* nombre de lignes de l'image */ - -/************************************************/ -/* Constitution du nom du fichier d'entete */ -/************************************************/ - -if ((long)strlen(repertoire)!= 0) -{ - sprintf( nom_ima_complet, "%s/%s" ,repertoire,nom_ima); -} -else -{ - strcpy ( nom_ima_complet , nom_ima); -} - sprintf(nom_fic_entete ,"%s.lum", nom_ima_complet); - -/************************************************/ -/* Destruction du fichier d'entete */ -/************************************************/ - -cr_stat = stat ( nom_fic_entete , &buf_stat ); -if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); - - -return (CAI_OK); - -} -/* - Fin de l'operation cai_dest_ima_lum -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_lum */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture-ecriture d'une image au format */ -/* ----- lum et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_lum(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_lum (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_modifie_lum(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - - -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret,icr; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence */ - int nbbits; /* nb de bits par pixel du fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines */ - int i,num; /* indice */ - char *type_cod; /* type de codage du pixel */ - char cod_pix[5]; /* codage du pixel */ - char type_image[3]; /* type code+ordre rangement octets dans entete*/ - char *type_machine; /* ordre rangement octets machine travail */ - char buf[15]; /* buffer contenant entete image */ - int v; /* comparaison type machine-type image */ - char *v1; /* comparaison type image avec chaine vide */ - int nb_col2, nb_lig2,nb; /* variables intermediaires inversion octets */ - int taille; /* nb d'octets par pixel */ - - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - nb=2; - *nb_can=0; - - *nb_lig=0; - - *nb_col=0; - - *nboct_pix=0; - - iret=1; - - type_cod = NULL; - type_cod = (char *) calloc(5,sizeof(char)) ; - type_machine = NULL; - type_machine = (char *) calloc(3,sizeof(char)); - - if (type_machine == NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_lecture"); - } - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_modifie"); - } - else - { - -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.lum",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.lum",nom_image); - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ - fic_in=NULL; - fic_in=fopen(nom_fic,"rb"); - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete LUM"); - } - else - { - -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ - /*.................................. - recuperation infos completes - ......................................*/ - fread(buf,12,1,fic_in); - - /*.................................. - recuperation du type de codage des pixels - et donc du type de l'image - ......................................*/ - memcpy(type_cod,&buf[8],4); - taille = cai_recuptyp_lum(type_cod,type_image,&nbbits,cod_pix); - - if (taille != -1) - { - sprintf(image1->TYPE_COD,type_cod); - image1->NB_BITS_PIX=nbbits; - image1->NBOCT_PIX=taille; - sprintf(image1->COD_PIX,cod_pix); - *nboct_pix = image1->NBOCT_PIX; - *nb_can = 1; - } - else - { - iret=0; - sprintf(CAI_ERREUR,"Type de codage LUM non reconnu : %s",type_cod); - goto ERREUR; - } - - /*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - - type_machine = cai_test_pFpf(); - - /*.................................. - determination des autres infos - en fonction inversion - ......................................*/ - - v = strncmp(type_machine,type_image,2); - v1 = strrchr(type_image,'E'); - -/*.................................. - recuperation du nombre de colonne - ......................................*/ - memcpy(nb_col,&buf[0],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - - { - swab( (void*)nb_col, (void*)&nb_col2,4 ); - cai_inverser_tableau((short *)nb_col, (short *)&nb_col2,nb); - } -/*.................................. - recuperation du nombre de lignes - ......................................*/ - memcpy(nb_lig,&buf[4],4); - -/*modification si (type_image et type_machine st differentes) */ -/*et si (type_image existe avec BE ou LE)*/ - - if ( (v!=0) && (v1!=NULL) ) - { - swab( (void*)nb_lig, (void*)&nb_lig2,4 ); - cai_inverser_tableau((short *)nb_lig, (short *)&nb_lig2,nb); - } - - -/************************/ -/* fin modifications */ -/************************/ - } - -/*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in != NULL) fclose(fic_in); - - if (iret !=0) - { -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - if ((long)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.lum",repert,nom_image); - - } - else - { - sprintf(nom_fic_canal,"%s.lum",nom_image); - } - - num=open(nom_fic_canal,O_RDWR|O_BINARY,0); - if (num!= -1) - { - - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_image,"%s",image1->NOM_FIC_CAN); - sscanf(nom_image,"%s",image1->NOM_UTIL_CAN); - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=(*nb_col)*image1->NBOCT_PIX; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications indications Big ou Little Endian */ -/*****************************************************************************/ - - if ( (v!=0) && (v1!=NULL) ) - { - image1->INV_OCTETS =1; - } - else - { - image1->INV_OCTETS =0; - } - -/***********************/ -/* fin modifications */ -/***********************/ - - } - else - iret=0; - } - } -ERREUR: - if (iret == 0) - { - return (NULL); - } - else - { - return(image1); - } - -} -/* - Fin de l'operation cai_ouvre_modifie_lum - -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_recuptyp_lum */ -/* ---------- */ -/* */ -/* ROLE : fonction de verification si pixels de type lum ou non */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : retour = cai_recuptyp_lum(type_code,SensCode,nbbits , */ -/* cod_pix) */ -/* ---------------- */ -/* */ -/* type_code (E) (char *) : type de codage a verifier */ -/* SensCode (S) (char *) : sens du codage BE ou LE */ -/* nbbits (S) (char *) : nombre de bits significatifs ds le pixel */ -/* cod_pix (S) (char *) : codage du pixel */ -/* retour (S) (int) : Taille du pixel en octet si OK reconnu */ -/* -1 si non reconnu */ -/* */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -int cai_recuptyp_lum(char *type_code, char *SensCode, int *nbbits, - char *cod_pix) -{ - int ind; /* indice de boucle sur les types reconnus */ - int trouve,icr,taille; /* indice pour la recherche */ - int mod2; /* modulo2 */ - char* pch0; - -/* Initialisations diverses */ - trouve = -1; - taille = -1; - *nbbits=-1; - ind = 0; - pch0=NULL; - while ((trouve==-1)&&(ind< CAI_NB_LUM)) - { - pch0=strstr(type_code,CAI_LUM_TYP[ind]); - if (pch0!=NULL) - trouve=ind; - else - ind=ind+1; - } - if (trouve !=-1) - { - mod2=ind%2; - if (mod2==0) sprintf(SensCode,"BE"); - else sprintf(SensCode,"LE"); - - if (ind < 4) - { - icr=sscanf(type_code,"%d",nbbits); - if (icr ==0) *nbbits=-1 ; - else - { - trouve =(int)(*nbbits/8); - if ((*nbbits%8)!=0) taille =trouve+1; - else taille = trouve; - } - pch0 = strstr(type_code,"U"); - if (taille == 1) - { - if (pch0==NULL) sprintf(cod_pix,"OCT"); - else sprintf(cod_pix,"UOCT"); - } - else if (taille == 2) - { - if (pch0==NULL) sprintf(cod_pix,"I2"); - else sprintf(cod_pix,"UI2"); - } - else if (taille == 4) - { - if (pch0==NULL) sprintf(cod_pix,"I4"); - else sprintf(cod_pix,"UI4"); - } - else taille=-1; - } - else if ((ind ==4)||(ind==5) ) - { - taille=4; - *nbbits = 32; - sprintf(cod_pix,"R4"); - - } - else if ((ind ==6)||(ind==7) ) - { - taille=8; - *nbbits = 64; - sprintf(cod_pix,"R8"); - } - } - -/* sortie normale */ - return(taille); -} -/* - Fin de l'operation cai_recuptyp_lum -*/ - - - - - diff --git a/Utilities/CAI/cai_dll/src/cai_mapsat.c b/Utilities/CAI/cai_dll/src/cai_mapsat.c deleted file mode 100755 index f50fe9c5f8..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_mapsat.c +++ /dev/null @@ -1,1080 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_mapsat.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format mapsat */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : fevrier 1995 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <sys/types.h> -# include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> - -#define _CAI_IMAGE -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_mapsat.c,v 1.4 98/07/21 14:54:07 cmf Exp $"; - -extern char *getenv(); - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_mapsat */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format mapsat */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_mapsat (repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees*/ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_mapsat (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -int cai_liste_ima_mapsat (repert, - tab_ima) - -char *repert; -char ***tab_ima; - -{ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - -struct dirent *dp; /* structure resultat de la fonction readdir */ - - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - char *pch2; /* pointeurs sur chaine de caracteres */ - char car; /* variable de travail */ - int nb_ima; /* nombre d'images mapsat identifiees */ - int i; /* indice de boucle */ - - /*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - dirp=opendir(repert); - - if(dirp!=NULL) - { - - -/*...................................... - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE MAPSAT - (EXTENSION =.im ou .it) - ..........................................*/ - - while((dp=readdir(dirp))!=NULL) - { - car='.'; - pch0=(char *)strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='i'; - pch1=(char *)strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='m'; - pch2=(char *)strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - pch2++; - if (*pch2 == '\0' ) - { - nb_ima=nb_ima+1; - } - } - else - { - car='t'; - pch2=(char *)strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - pch2++; - *pch2='\0'; - nb_ima=nb_ima+1; - } - } - } - } - } - - (void)closedir(dirp); - -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT MAPSAT - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE MAPSAT - (EXTENSION =.im ou .it) - SI C'EST LE CAS STOCKAGE DE L'IMAGE DANS LA LISTE DES IMAGES MAPSAT - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - while((dp=readdir(dirp))!=NULL) - { - car='.'; - pch0=(char *)strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='i'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='m'; - pch2=(char *)strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - pch2++; - if (*pch2 == '\0' ) - { - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - else - { - car='t'; - pch2=(char *)strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - pch2++; - *pch2='\0'; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - } - } - } - - (void)closedir(dirp); - - } - else - { - /* Erreur:Repertoire inexistant */ - nb_ima=-1; - } - - return(nb_ima); - -} - -/* - Fin de l'operation cai_liste_ima_mapsat -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_mapsat */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format mapsat */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_mapsat (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_mapsat (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_lecture_mapsat(repert, - nom_image, - nb_can, - nboct_pix, - nb_col, - nb_lig) - -char *repert; -char *nom_image; -int *nb_can; -int *nboct_pix; -int *nb_col; -int *nb_lig; -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - char car[4]; /* indice du canal traite */ - int i,fic; /* indice */ - int RVB,MONO; /* indique le nombre de canaux */ - char type_inf[5]; /* type fichier lu dans l'entete */ - char label[64]; /* label lu dans l'entete */ - int lig,col; /* variables intermediaires */ - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - iret=1; - RVB=3; - MONO=1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*................................................. - Constitution du nom du fichier MAPSAT .it - et test sur son existence - .................................................*/ - nom_fic[0]='\0'; - if (strlen(repert)!=0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,".it"); - nom_fic[strlen(repert)+1+strlen(nom_image)+3]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,".it"); - nom_fic[strlen(nom_image)+3]='\0'; - } - fic_in=fopen(nom_fic,"r"); - *nb_can=RVB; - strncpy(car,".it",3); - car[3]='\0'; - if (fic_in==NULL) - { -/*........................................................... - Test sur l'existence du fichier MAPSAT avec extension .im - ..........................................................*/ - nom_fic[0]='\0'; - if (strlen(repert)!=0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,".im"); - nom_fic[strlen(repert)+1+strlen(nom_image)+3]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,".im"); - nom_fic[strlen(nom_image)+3]='\0'; - } - fic_in=fopen(nom_fic,"r"); - *nb_can=MONO; - car[0]='\0'; - strncpy(car,".im",3); - car[3]='\0'; - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur Ouverture Fichier MAPSAT"); - return (NULL); - } - } -/*.......................................... - verification que le fichier est de type mapsat - ...................................................*/ - fread(type_inf,4,1,fic_in); -/*... - pour une image trichrome - ......*/ - if (*nb_can==RVB) - { - if (strncmp(type_inf,"ITRI",4) !=0) - { - iret=0; - strcpy(CAI_ERREUR,"l'image n'est pas au format MAPSAT"); - return (NULL); - } - } - -/*..... - pour une image monochrome - .....*/ - if (*nb_can==MONO) - { - if (strncmp(type_inf,"IMON",4) !=0) - { - iret=0; - strcpy(CAI_ERREUR,"l'image n'est pas au format MAPSAT"); - return (NULL); - } - } - -/*..... - positionnement sur les infos a recuperer - .....*/ - fread(label,64,1,fic_in); - fread(nb_lig,4,1,fic_in); - fread(nb_col,4,1,fic_in); - *nboct_pix=1; - image1->NB_BITS_PIX=8; - lig=*nb_lig; - col=*nb_col; -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - fclose (fic_in); - fic=open(nom_fic,O_RDONLY,0); - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_image,"%s",deb); - strcat(deb,car); - deb=deb+100; - sscanf(nom_image,"%s",deb1); - strcat(deb1,car); - deb1=deb1+100; - image1->POS_OCTET[i]=col+(i*lig*col); - image1->ACCES_CANAL_INT[i]=fic; - - - } - - - return(image1); - -} - -/* - Fin de l'operation cai_ouvre_lecture_mapsat -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_mapsat */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format mapsat et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_mapsat (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_mapsat (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_IMAGE *cai_ouvre_creation_mapsat(repert, - nom_image, - nb_can, - nboct_pix, - nb_col, - nb_lig, - label) - -char *repert; -char *nom_image; -int *nb_can; -int *nboct_pix; -int *nb_col; -int *nb_lig; -char *label; -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - int retour; /* retour de fonction */ - int i,num; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - unsigned char *ptr; /* pointeur sur buffer fichier */ - int taille_entete; /* taille de l'entete en octets */ - int pas_echantil; /* pas d'echantillonnage de l'image */ - int taille_buff_label; /* taille en octets du label a ecrire */ - char *buff_label; /* pointeur sur la chaine label a ecrire */ - - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*................................................. - Constitution du nom du fichier entete et verification qu'il - n'existe pas deja .Il n'y a qu'un fichier .it si multispectral - .im si monospectral - .................................................*/ - nom_fic[0]='\0'; - if (strlen(repert)!=0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - if (*nb_can == 1) - strcat(nom_fic,".im"); - else - strcat(nom_fic,".it"); - nom_fic[strlen(repert)+1+strlen(nom_image)+3]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - if (*nb_can == 1) - strcat(nom_fic,".im"); - else - strcat(nom_fic,".it"); - nom_fic[strlen(nom_image)+3]='\0'; - } - - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s MAPSAT existe \n" , nom_image ); - goto ERREUR; - } - -/*************************************************/ -/* determination de la taille de l'entete : */ -/* taille de l'entete = taille d'une ligne, soit */ -/* nb_col et au minimum 128 octets */ -/* ecriture de l'entete */ -/*************************************************/ - - taille_entete = ( *nb_col > 128 )? (*nb_col) : 128; - fic = fopen(nom_fic,"w"); - if (fic == NULL) - { - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic); - goto ERREUR; - } - ptr = (unsigned char *) malloc ( taille_entete ); - if ( ptr == NULL ) - { - strcpy ( CAI_ERREUR , "Erreur : probleme d'allocation MAPSAT\n" ); - goto ERREUR; - } - if (*nb_can == 1) - { - memcpy ( ptr , "IMON" , 4 ); - } - else - { - memcpy ( ptr , "ITRI" , 4 ); - } - taille_buff_label = ((int)(strlen(label))+1 > 65 )? - (int)(strlen(label))+1 : 65; - buff_label = (char *) malloc ( taille_buff_label*sizeof(char *) ); - strcpy( buff_label , label ); - for ( i = strlen(label) ; i < 64 ; i++ ) - { - buff_label[i]=' '; - } - buff_label[64]='\0'; - - memcpy ( &ptr[4] , buff_label , 64 ); - memcpy ( &ptr[68] , nb_lig , 4 ); - memcpy ( &ptr[72] , nb_col , 4 ); - memcpy ( &ptr[76] , nb_can , 4 ); - pas_echantil = 0; - memcpy ( &ptr[80] , &pas_echantil , 4 ); - for ( i = 84 ; i < taille_entete - 1 ; i++ ) - { - ptr[i] = 0; - } - - retour = fwrite ( ptr , taille_entete , 1 , fic ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "Erreur : ecriture impossible dans fichier %s\n", - nom_fic ); - goto ERREUR; - } - - fclose ( fic ); - free (ptr); - -/*................................................. - Ouverture du fichier pour ecriture radiometrie - ...................................................*/ - num = open(nom_fic,O_RDWR,0); - if (num == -1) - { - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic); - goto ERREUR; - } - for (i=0;i<*nb_can;i=i+1) - { - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=taille_entete; - } - - return (image1); - -ERREUR : - return(NULL); -} - /* - Fin de l'operation cai_ouvre_creation_mapsat -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_mapsat */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image mapsat */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_mapsat(image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_mapsat (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - CAI_OK_KO cai_lecture_canal_mapsat(image1 , - canal , - premiere_ligne , - premiere_colonne, - nombre_lignes_lire , - nombre_colonnes_lire, - pas_ligne , - pas_colonne, - data_image ) -CAI_IMAGE *image1; -int *canal ; -int *premiere_ligne ; -int *premiere_colonne ; -int *nombre_lignes_lire ; -int *nombre_colonnes_lire; -int *pas_ligne ; -int *pas_colonne; -unsigned char *data_image; - -{ - - int num,i,j,n; /* variables de travail */ - int pt_oct; /* position courante dans le fichier image */ - int no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - int lig; /* indice de boucle sur les lignes */ - int oct_pix; /* nb octets par pixels */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - long oct_lig; /* nb oct. par ligne en considerant taille pixel */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - -/*........................... - Initialisations diverses - ..........................*/ - iret=CAI_OK; - num=image1->ACCES_CANAL_INT[*canal-1]; - oct_pix=image1->NBOCT_PIX; - oct_lig=oct_pix*image1->NB_COL; - lig=*premiere_ligne; - i=1; - pch=data_image; - -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - - buf_lec = (unsigned char *) malloc(oct_lig); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - } - else - { - -/*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i <= *nombre_lignes_lire)&&(iret==CAI_OK)) - { -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - no_oct=image1->POS_OCTET[*canal-1]+(lig-1)*image1->NB_COL; - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture d'une ligne image - ................................................*/ - n=read(num,buf_lec,image1->NB_COL); - - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image mapsat"); - } - else - { -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - deb=buf_lec+(*premiere_colonne)-1; - j=1; - while (j <= *nombre_colonnes_lire) - { - *pch=*deb; - pch=pch+1; - j=j+1; - deb=deb+(*pas_colonne); - } - - } - i=i+1; - lig=lig+(*pas_ligne); - - } - - free(buf_lec); - } - return(iret); -} - -/* - Fin de l'operation cai_lecture_canal_mapsat -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_mapsat */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image mapsat */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_mapsat (image1, canal, */ /* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_mapsat (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_ecriture_canal_mapsat (image1 , - canal , - premiere_ligne , - nombre_lignes_ecrire , - nombre_colonnes_ecrire, - data_image ) -CAI_IMAGE *image1; -int *canal ; -int *premiere_ligne ; -int *nombre_lignes_ecrire ; -int *nombre_colonnes_ecrire; -unsigned char *data_image; - -{ - -long position_first_lig; /* position de la 1ere ligne a ecrire */ -long position_courante; /* position courante dans le fichier */ -long deplacement; /* deplacement a effectuer */ -int i_ligne; /* compteur de lignes */ -unsigned char *buff_lig; /* tableau contenant une ligne a ecrire */ -int cr_write; /* code retour de write */ -int num; /* descripteur de fichier */ -int nboct_pix; /* nombre d'octets par pixel */ - -/*............... - Initialisations - ................*/ - -i_ligne = 0; -num = image1->ACCES_CANAL_INT[*canal-1]; -nboct_pix = image1->NBOCT_PIX; - - -/*************************************************/ -/* Les donnees doivent etre codees sur 8 bits */ -/*************************************************/ - -if ( nboct_pix != 1 ) -{ - strcpy ( CAI_ERREUR , "Erreur : les donnees doivent etre codees sur 8 bits\n"); - goto ERREUR; -} - - -/********************************************************/ -/* Calcul de la position de la premiere ligne a ecrire */ -/********************************************************/ - -position_first_lig = (long) ( image1->POS_OCTET[*canal-1] + - (*canal - 1) * image1->NB_LIG* (*nombre_colonnes_ecrire) - + ((*premiere_ligne) - 1) * (*nombre_colonnes_ecrire) ); - - -/********************************************************/ -/* Recuperation de la position courante */ -/********************************************************/ - -position_courante = lseek ( num , 0L , 1 ); - - -/********************************************************/ -/* Deplacement jusqu'a la premiere ligne a ecrire */ -/********************************************************/ - -deplacement = position_first_lig - position_courante; -lseek ( num , deplacement , 1 ); - - -/********************************************************/ -/* TANT QUE il y a des lignes a ecrire */ -/********************************************************/ -while (i_ligne < *nombre_lignes_ecrire) -{ - -/********************************************************/ -/* extraction de la ligne du tableau */ -/********************************************************/ - - buff_lig = data_image + (*nombre_colonnes_ecrire) * i_ligne; - -/********************************************************/ -/* ecriture de la ligne */ -/********************************************************/ - - cr_write = write ( num , buff_lig , (*nombre_colonnes_ecrire) ); - if ( cr_write != (*nombre_colonnes_ecrire) ) - { - strcpy ( CAI_ERREUR , "Erreur ecriture canal image mapsat\n" ); - goto ERREUR; - } - -/********************************************************/ -/* incrementation du nombre de lignes */ -/********************************************************/ - - i_ligne++; - -/********************************************************/ -/* FIN TANT QUE */ -/********************************************************/ -} - - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} - -/* - Fin de l'operation cai_ecriture_canal_mapsat -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_mapsat */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format mapsat et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_mapsat (image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_mapsat (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_mapsat (image1) - -CAI_IMAGE *image1; - -{ - int iret; /* code retour de l'operation */ - int num; /* descripteur du fichier a fermer */ - - iret=CAI_OK; -/*............................................. - Fermeture de tous les canaux qui sont tous contenus - dans un seul fichier .im ou .it suivant le nb de canaux - .............................................*/ - - - num=image1->ACCES_CANAL_INT[0]; - close(num); - - - return (iret); -} - -/* - Fin de l'operation cai_ferme_mapsat -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_mapsat */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en mapsat et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_mapsat (format,nom_ima) */ /* ------------------ */ -/* format (E) (char *) : format de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_mapsat (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_dest_ima_mapsat ( repertoire , - nom_ima ) - -char *repertoire; /* repertoire de stockage de l'image */ -char *nom_ima; /* nom de l'image */ - -{ -int iret; /* code retour fonction fermetrue lecture */ -char nom_fic[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ - -CAI_IMAGE *image1; /* structure ouverture image */ -int nb_can; /* nombre de canaux de l'image */ -int nboct_pix; /* nombre d'octets par pixel image */ -int nb_col; /* nombre de colonnes de l'image */ -int nb_lig; /* nombre de lignes de l'image */ - -/************************************************/ -/* Constitution du nom du fichier */ -/************************************************/ -if (strlen(repertoire)!= 0) -{ - strcpy ( nom_ima_complet , repertoire ); - strcat ( nom_ima_complet, "/" ); - strcat ( nom_ima_complet , nom_ima ); -} -else -{ - strcpy ( nom_ima_complet , nom_ima); -} - -/************************************************/ -/* Extraction des caracteristiques de l'image */ -/* du fichier entete par l'appel a la fonction */ -/* cai_ouvre_lecture_mapsat */ -/************************************************/ - - image1 = cai_ouvre_lecture_mapsat (repertoire, nom_ima, &nb_can ,&nboct_pix , - &nb_col , &nb_lig); - if ( image1 == NULL) goto ERREUR; - - image1->NB_CANAUX=nb_can; - image1->NB_COL=nb_col; - image1->NB_LIG=nb_lig; - image1->NBOCT_PIX=nboct_pix; - - iret=cai_ferme_mapsat(image1); - -/************************************************/ -/* constitution du fichier + extension en */ -/* fonction du nombre de canaux */ -/************************************************/ - nom_fic[0]='\0'; - strcpy(nom_fic,nom_ima_complet); - if (nb_can == 1) - { - strcat ( nom_fic , ".im" ); - nom_fic[strlen(nom_ima_complet)+3]='\0'; - } - else - { - strcat ( nom_fic , ".it" ); - nom_fic[strlen(nom_ima_complet)+3]='\0'; - } - - -/************************************************/ -/* Destruction du fichier image */ -/************************************************/ - - unlink ( nom_fic ); - - - return (CAI_OK); - -ERREUR: - -return (CAI_KO); - - -} -/* - Fin de l'operation cai_dest_ima_mapsat -*/ diff --git a/Utilities/CAI/cai_dll/src/cai_multis.c b/Utilities/CAI/cai_dll/src/cai_multis.c deleted file mode 100755 index a9d80866ef..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_multis.c +++ /dev/null @@ -1,1985 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_multis.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format multiscope */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : fevrier 1995 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : FA : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <stdlib.h> -# include <ctype.h> -# include <unistd.h> -# include <sys/types.h> -#include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> - -#define _CAI_IMAGE -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_multis.c,v 1.8 01/05/31 10:47:08 cmf Exp $"; - - -extern char *getenv(); - - -static void inverser (char * s , int nboct ); -static void calculer_histo(CAI_IMAGE *image1, unsigned char *buffer , - int nb_pix , int canal ); - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_multis */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format multiscope */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_multis (repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees*/ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_multis (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -long int cai_liste_ima_multis (char *repert, - char ***tab_ima) - - -{ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - -struct dirent *dp; /* structure resultat de la fonction readdir */ - - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - char *pch2,*pch3; /* pointeurs sur chaine de caracteres */ - char car; /* variable de travail */ - int nb_ima; /* nombre d'images multiscope identifiees */ - int i; /* indice de boucle */ - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - - dirp=opendir(repert); - - if(dirp!=NULL) - { - -/*...................................... - - premiere passe pour comptabiliser les images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE MULTISCOPE - (EXTENSION =.img) - ..........................................*/ - - - while((dp=readdir(dirp))!=NULL) - { - - car='.'; - pch0=strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='i'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='m'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - car='g'; - pch3=strrchr(dp->d_name,car); - if ((pch3 != NULL)&&(pch3==pch2+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - *pch3=' '; - nb_ima=nb_ima+1; - } - } - } - } - } - - (void)closedir(dirp); -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT MULTISCOPE - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE MULTISCOPE - (EXTENSION =.img) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - while((dp=readdir(dirp))!=NULL) - { - - car='.'; - pch0=strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='i'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='m'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - car='g'; - pch3=strrchr(dp->d_name,car); - if ((pch3 != NULL)&&(pch3==pch2+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - *pch3=' '; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - } - } - } - - (void)closedir(dirp); - - - } - else - { - /* Repertoire inexistant */ - nb_ima=-1; - } - return(nb_ima); - -} - -/* Fin de l'operation cai_liste_ima_multis -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_multis */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format multiscope */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_multis (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_multis (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_lecture_multis(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom du fichier canal */ - char nom_util_canal[1024]; /* nom du fichier utilisateur */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - int num,retour,lon; /* variables de travail */ - short int type,fin; /* variables de trvail */ - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - *nb_can=0; - iret=1; - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,".img"); - nom_fic[strlen(repert)+1+strlen(nom_image)+4]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,".img"); - nom_fic[strlen(nom_image)+4]='\0'; - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ - fic=fopen(nom_fic,"rb"); - if (fic == NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete MULTISCOPE"); - } - else - { - -/*.................................... - positionnement sur le nombre de colonnes -*/ - fseek(fic,8,0); -/* - recuperation du nombre de colonnes */ - fread(nb_col,4,1,fic); -/* - inversion des octets pour compatibilite SUN */ - lon=sizeof(*nb_col)-1; - inverser((char *)nb_col,lon); - -/*.................................... - recuperation du nombre de lignes -*/ - fread(nb_lig,4,1,fic); -/* - inversion des octets pour compatibilite SUN */ - lon=sizeof(*nb_lig)-1; - inverser((char *)nb_lig,lon); - -/*...................................... - initialisation du nombre d'octets par pixel -*/ - *nboct_pix=1; - image1->NB_BITS_PIX=8; - sprintf(image1->COD_PIX,"OCT"); -/*................................. - positionnement sur le premier objet -*/ - fseek(fic,114,1); - retour=0; - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - - while (retour == 0) - { -/*...........Recuperation de tous les objets jusqu'a l'eof - nom fichier,nom utilisateur et type de l'objet(avec inversion) -*/ - fread(nom_fic_canal,14,1,fic); - fread(nom_util_canal,40,1,fic); - fread(&type,2,1,fic); - lon=sizeof(type)-1; - inverser((char *)&type,lon); - if (type == 3) - { -/*....................................... - Initialisation des tableaux contenant le nom de fichier - et le nom utilisateur de chaque canal - .....................................................*/ - - - if (*nb_can<CAI_NB_MAX_CAN) - { - nom_fic_canal[0] = tolower(nom_fic_canal[0]); - nom_fic_canal[1] = tolower(nom_fic_canal[1]); - nom_fic_canal[2] = tolower(nom_fic_canal[2]); - nom_fic_canal[9] = tolower(nom_fic_canal[9]); - nom_fic_canal[10] = tolower(nom_fic_canal[10]); - nom_fic_canal[11] = tolower(nom_fic_canal[11]); - nom_fic[0]='\0'; - if ((long int)strlen(repert) != 0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_fic_canal); - nom_fic[strlen(repert)+1+strlen(nom_fic_canal)]='\0'; - } - else - { - sscanf(nom_fic_canal,"%s",nom_fic); - nom_fic[strlen(nom_fic_canal)]='\0'; - } - sscanf(nom_fic_canal,"%s",deb); - deb=deb+100; - sscanf(nom_util_canal,"%s",deb1); - deb1=deb1+100; - - num=open(nom_fic,O_RDONLY,0); - if (num==-1) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fi canal Multiscope"); - } - else - { - image1->ACCES_CANAL_INT[*nb_can]=num; - image1->POS_OCTET[*nb_can]=1280; - image1->NB_PIX_ECRITS[*nb_can]=0; - } - - } - *nb_can=*nb_can+1; - } - -/*............Positionnement en fin de bloc */ - fseek(fic,70,1); -/* - ............Test fin de fichier */ - fread(&fin,2,1,fic); - retour=feof(fic); - } -/*.................................. - Fermeture du fichier - ......................................*/ - fclose(fic); - } - - - if (iret != 0) - return (image1); - else - return(NULL); - -} - -/* - Fin de l'operation cai_ouvre_lecture_multis -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_multis */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format multiscope et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_multis (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_multis (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_IMAGE *cai_ouvre_creation_multis(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig, - char *label) - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char fichier[1024]; /* variable intermediaire */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - long int retour; /* retour de fonction */ - char car3[3],car6[6]; /* indice du canal traite */ - int i,num,numero_fic; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - unsigned char *buff ; /* buffer a ecrire */ - int taille,nb; /* variables de travail sur taille fichier */ - char *deb; /* pointeur sur chaine pour transfert */ - int col_pix_1; /* colonne du premier pixel */ - int lig_pix_1; /* ligne du premier pixel */ - char *nom_fic_carac; /* nom relatif du fichier caracteristiques */ - long int taille_nom_dos_vue; /* taille de fichier */ - char *nom_dos_vue; /* nom DOS de la vue */ - long int taille_nom_dos_ima; /* taille de fichier */ - char *nom_dos_ima; /* nom DOS de l'image */ - int flag_sauvegarde; /* flag de sauvegarde */ - char *nom_dos_obj; /* nom DOS de l'objet */ - char nom_util[100+1]; /* intitule ou nom utilisateur */ - int flag_suppression; /* flag de suppression */ - int type_obj; /* type de l'objet */ - int version; /* version */ - int filler; /* filler */ - int dim_bloc; /* dimension d'un bloc */ - int presence_histo; /* indicateur de presence des histogrammes */ - int int_tempo; /* entier utilise pour inversion d'octets */ - int lon; /* longueur de l'entier - 1 */ - int i_can; /* indice de boucle sur les canaux */ - long li; - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*................................................. - Constitution du nom du fichier entete et verification qu'il - n'existe pas deja - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,".img"); - nom_fic[strlen(repert)+1+strlen(nom_image)+4]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,".img"); - nom_fic[strlen(nom_image)+4]='\0'; - } - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s MULTISCOPE existe \n" , nom_image ); - goto ERREUR; - } - -/*............................................................... - Pour chaque canal de l'image,constitution du nom de fichier correspondant - Verification qu'il n'existe pas deja - Ouverture du fichier en ecriture - .................................................................*/ - - deb =(char *) image1->NOM_FIC_CAN; - i=0; - numero_fic=0; - while ((i<*nb_can)&& (numero_fic<10000)) - { - nom_fic_canal[0]='\0'; - fichier[0]='\0'; - sprintf ( car6 , "%05d" , numero_fic ); - strcat ( fichier,"fdo"); - strcat ( fichier , car6); - strcat ( fichier , ".per" ); - fichier[strlen(car6)+7]='\0'; - - if ((long int)strlen(repert) != 0) - { - sscanf(repert,"%s",nom_fic_canal); - strcat(nom_fic_canal,"/fdo"); - strcat ( nom_fic_canal , car6 ); - strcat ( nom_fic_canal , ".per" ); - nom_fic_canal[strlen(repert)+4+strlen(car6)+4]='\0'; - } - else - { - sscanf(fichier,"%s",nom_fic_canal); - nom_fic_canal[strlen(car6)+7]='\0'; - } - retour = stat ( nom_fic_canal , &buf_stat ); - if ( retour != 0 ) /* si ce fichier n'existe pas il peut etre creer */ - { - sscanf(fichier,"%s",deb); - i=i+1; - deb=deb+100; - } - numero_fic=numero_fic+1; - - } - -/*.................................................................. - ecriture du fichier img et de l'entete des fichiers canaux - .................................................................*/ - fic = fopen(nom_fic,"w"); - if ( fic == NULL ) - { - sprintf ( CAI_ERREUR , "Creation image multiscope impossible \n" , - nom_image ); - goto ERREUR; - } -/* la taille du fichier entete doit etre multiple de 512 */ - taille = 128*(1+(*nb_can)); - nb=taille; - if ( taille % 512 == 0 ) - taille = taille; - else - taille = taille - (taille%512) + 512; - - -/*************************************************/ -/* Ecriture des enregistrements d'entete et de */ -/* description des objets : */ -/* 128 + n*128 octets avec n = nombre d'objets */ -/*************************************************/ - -/*************************************************/ -/* ecriture de l'enregistrement d'entete */ -/*************************************************/ - buff = (unsigned char *) calloc ( 128,sizeof(unsigned char) ); - if ( buff == NULL ) - { - sprintf ( CAI_ERREUR , "Erreur : probleme d'allocation \n" ); - unlink(nom_fic); - goto ERREUR; - } - - col_pix_1 = 0; - int_tempo = col_pix_1; - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( buff , &int_tempo , 4 ); - - lig_pix_1 = 0; - int_tempo = lig_pix_1; - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( &buff[4] , &int_tempo , 4 ); - - int_tempo = (*nb_col); - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( &buff[8] , &int_tempo , 4 ); - - int_tempo = (*nb_lig); - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( &buff[12] , &int_tempo , 4 ); -/* construction du nom relatif du fichier */ -/* caracteristiques : nom_image.img */ - nom_fic_carac = (char *) strrchr ( nom_fic , '/' ) + 1; - - - taille_nom_dos_vue = - ( (long int)(strlen(nom_fic_carac))-3 > 15 )? - (long int)(strlen(nom_fic_carac))-3 : 15; - nom_dos_vue = (char *) malloc ( taille_nom_dos_vue*sizeof(char *) ); - strncpy ( nom_dos_vue , nom_fic_carac , strlen(nom_fic_carac)-4 ); - for ( li = (long int)(strlen(nom_fic_carac)-4) ; li < 14 ; li++ ) - { - nom_dos_vue[li]=' '; - } - nom_dos_vue[14]='\0'; - /* passage en majuscules */ - for ( i = 0 ; i < 14 ; i++ ) - { - nom_dos_vue[i] = toupper(nom_dos_vue[i]); - } -/* memcpy ( &buff[16] , nom_dos_vue , 14 ); */ - - - taille_nom_dos_ima = - ( (long int)(strlen(nom_fic_carac))-3 > 15 )? - (long int)(strlen(nom_fic_carac))-3 : 15; - nom_dos_ima = (char *) malloc ( taille_nom_dos_ima*sizeof(char *) ); - strncpy ( nom_dos_ima , nom_fic_carac , strlen(nom_fic_carac)-4 ); - nom_dos_ima[strlen(nom_fic_carac)-4]='\0'; - /* le nom DOS de l'image ne doit pas depasser 10 caracteres */ - if ( (long int)(strlen(nom_dos_ima)) > 10 ) - nom_dos_ima[10]='\0'; - /* passage en majuscule */ - for ( li = 0 ; li < (long int)(strlen(nom_dos_ima)) ; li++ ) - { - nom_dos_ima[li] = toupper(nom_dos_ima[li]); - } - li = (long int)strlen(nom_dos_ima)+1 ; - memcpy ( &buff[30] , nom_dos_ima , li); - -/* memcpy ( &buff[30+li] , "IMG" , 3 ); - for ( li = 30+(long int)strlen(nom_dos_ima)+1+3 ; li < 44 ; li++ ) - { - buff[li] = 0; - }*/ - - flag_sauvegarde = 0; - int_tempo = flag_sauvegarde; - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( &buff[44] , &int_tempo , 2 ); - -/* for ( i = 46 ; i < 128 ; i++ ) - { - buff[i] = 0; - }*/ - if ((*nb_can)==1) - buff[46]='I'; - retour = fwrite ( buff , 128 , 1 , fic ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR ,"Ecriture impossible dans fichier %s\n" ,nom_fic); - unlink(nom_fic); - goto ERREUR; - } - free ( nom_dos_vue ); - free ( nom_dos_ima ); - free ( buff ); - -/*************************************************/ -/* POUR chacun des objets */ -/*************************************************/ - deb=image1->NOM_FIC_CAN; - for ( i_can= 0 ; i_can< *nb_can ; i_can++ ) - { - - - buff = (unsigned char *) calloc ( 128,sizeof(unsigned char) ); - if ( buff == NULL ) - { - sprintf ( CAI_ERREUR , "Erreur : probleme d'allocation \n" ); - unlink(nom_fic); - goto ERREUR; - } - -/*************************************************/ -/* ecriture de la description de l'objet */ -/*************************************************/ - - flag_suppression = 1; - int_tempo = flag_suppression; - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( buff , &int_tempo , 2 ); - - - nom_fic_canal[0]='\0'; - sscanf(deb,"%s",nom_fic_canal); - deb=deb+100; - nom_dos_obj = (char *) calloc ( 15,sizeof(char *) ); - strcpy ( nom_dos_obj , nom_fic_canal ); - for ( li = (long int)strlen(nom_fic_canal) ; li < 14 ; li++ ) - { - nom_dos_obj[li]='\0'; - } - nom_dos_obj[14]='\0'; - nom_dos_obj[0] = toupper(nom_dos_obj[0]); - nom_dos_obj[1] = toupper(nom_dos_obj[1]); - nom_dos_obj[2] = toupper(nom_dos_obj[2]); - nom_dos_obj[9] = toupper(nom_dos_obj[9]); - nom_dos_obj[10] = toupper(nom_dos_obj[10]); - nom_dos_obj[11] = toupper(nom_dos_obj[11]); - memcpy ( &buff[2] , nom_dos_obj , 14 ); - - for ( i = 6 ; i < 40 ; i++ ) - { - nom_util[i]='\0'; - } - nom_util[40]='\0'; - sprintf(nom_util,"CANAL/PLAN%d",i_can+1); - memcpy ( &buff[16] , nom_util , 40 ); - - type_obj = 3; - int_tempo = type_obj; - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( &buff[56] , &int_tempo , 2 ); - - memcpy ( &buff[58] , "01-04-01 10:10" , 14 ); - - for ( i = 72 ; i < 128 ; i++ ) - { - buff[i] = 0; - } - - retour = fwrite ( buff , 128 , 1 , fic ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR ,"Ecriture impossible dans fichier %s\n" ,nom_fic); - unlink(nom_fic); - goto ERREUR; - } - free(buff); -/*.......................................................... - Ecriture de 0 jusqu'a la taille du fichier - .........................................................*/ - if (nb != taille) - { - buff = (unsigned char *) calloc ( taille-nb,sizeof(unsigned char) ); - if ( buff == NULL ) - { - sprintf ( CAI_ERREUR , "Erreur : probleme d'allocation \n" ); - unlink(nom_fic); - goto ERREUR; - } - retour = fwrite ( buff , taille-nb , 1 , fic ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR ,"Ecriture impossible dans fichier %s\n" ,nom_fic); - unlink(nom_fic); - goto ERREUR; - } - free(buff); - } - } - fclose(fic); - - /*************************************************/ - /* POUR chacun des fichiers canaux */ - /*************************************************/ - deb=image1->NOM_FIC_CAN; - for ( i_can = 0 ; i_can< *nb_can ; i_can++ ) - { - -/*************************************************/ -/* ouverture du fichier */ -/*************************************************/ - fichier[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sscanf(repert,"%s",fichier); - strcat(fichier,"/"); - strcat(fichier,deb); - } - else - { - sscanf(deb,"%s",fichier); - } - deb=deb+100; - - fic = fopen ( fichier , "w" ); - if ( fic == NULL ) - { - sprintf ( CAI_ERREUR , "Erreur : ouverture fichier %s impossible \n", - fichier); - goto ERREUR ; - } - - -/*************************************************/ -/* ecriture de l'enregistrement d'entete */ -/* du filler et des enregistrements */ -/* histogrammes */ -/* 24 + 232 + 4*256 octets */ -/*************************************************/ - -/*************************************************/ -/* ecriture de l'enregistrement d'entete */ -/*************************************************/ - - buff = (unsigned char *) calloc ( 24 ,sizeof(unsigned char)); - if ( buff == NULL ) - { - strcpy ( CAI_ERREUR , "Erreur : probleme d'allocation\n" ); - goto ERREUR; - } - - version = 1; - int_tempo = version; - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( buff , &int_tempo , 2 ); - - type_obj = 3; - int_tempo = type_obj; - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( &buff[2] , &int_tempo , 2 ); - -/* memcpy ( &buff[4] , "*CAI**" , 6 ); */ - - filler = 0; - int_tempo = filler; - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( &buff[10] , &int_tempo , 2 ); - - dim_bloc = 16; - int_tempo = dim_bloc; - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( &buff[12] , &int_tempo , 2 ); - - int_tempo = (*nb_lig); - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( &buff[14] , &int_tempo , 4 ); - - int_tempo = (*nb_col); - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( &buff[18] , &int_tempo , 4 ); - - presence_histo = 0; - int_tempo = presence_histo; - lon = sizeof(int_tempo)-1; - inverser((char *)&int_tempo,lon); - memcpy ( &buff[22] , &int_tempo , 2 ); - retour = fwrite ( buff , 24 , 1 , fic ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "Erreur : ecriture impossible dans fichier %s\n", fichier ); - goto ERREUR; - } - - free ( buff ); - - -/*************************************************/ -/* ecriture du filler a 0 */ -/*************************************************/ - - buff = (unsigned char *) calloc ( 232 ,sizeof(unsigned char)); - if ( buff == NULL ) - { - strcpy ( CAI_ERREUR , "Erreur : probleme d'allocation\n" ); - goto ERREUR; - } - - retour = fwrite ( buff , 232 , 1 , fic ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "Erreur : ecriture impossible dans fichier %s\n", fichier ); - goto ERREUR; - } - - free ( buff ); - -/*************************************************/ -/* ecriture des histogrammes a 0 */ -/*************************************************/ - - /* initialisations de variables necessaire au calcul d'histogramme */ - - for ( i=0 ; i<256 ; i++ ) - { - image1->HISTO[i_can][i]=0; - } - - retour = fwrite ( image1->HISTO[i_can] , (sizeof(int)*256) , 1 , fic ); - if ( retour == 0 ) - { - sprintf (CAI_ERREUR , "Erreur : ecriture impossible dans fichier %s\n", fichier ); - goto ERREUR; - } - - -/*************************************************/ -/* fermeture du fichier canal */ -/*************************************************/ - - fclose ( fic ); - -/*................................................ - Ouverture du fichier canal pour ecriture radiometrie - .............................................................*/ - num = open(fichier,O_RDWR,0); - image1->ACCES_CANAL_INT[i_can]=num; - image1->POS_OCTET[i_can]=24 +232+ 4*256; - - } - - - free ( nom_dos_obj ); - - - return (image1); - -ERREUR : - return(NULL); -} - -/* - Fin de l'operation cai_ouvre_creation_multis -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_multis */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image multiscope */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_multis(image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_multis (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_lecture_canal_multis(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) - -{ - - int num,i,j; /* variables de travail */ - long int pt_oct,n; /* position courante dans le fichier image */ - int no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - int lig; /* indice de boucle sur les lignes */ - int l,p; /* variables de travail */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - unsigned char *buffer; /* buffer de lecture d'un pave 16*16 */ - int pave; /* nombre de paves colonnes dans une ligne */ - int taille; /* nbcol_tot*taille lignes pave */ - int bloc; /* indice de boucle sur les paves */ - int nolig; /* indice de boucle sur les lignes */ - int numlig; /* numero de la ligne reconstituee */ - unsigned char *ind_lec; /* pointeur de travai pour transfert pave */ - unsigned char *ind_tab; /* pointeur de travai pour transfert pave */ - int nbcol16; /* nb pave*taille colonnes du pave (16) */ - -/*......................... - Initialisations - ........................*/ - iret=CAI_OK; - num=image1->ACCES_CANAL_INT[*canal-1]; - lig=*premiere_ligne; - i=0; - pch=data_image; - -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - pave=image1->NB_COL/16; - if ((image1->NB_COL%16)!=0) - { - pave=pave+1; - } - nbcol16=pave*16; - taille=nbcol16*16; - buf_lec = (unsigned char *) malloc(256); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - } - else - { - buffer = (unsigned char *) malloc(taille); - if (buffer == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - } - else - { - lig=*premiere_ligne; - i=0; - pch=data_image; -/*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i < *nombre_lignes_lire)&&(iret==CAI_OK)) - { -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - nolig=((lig-1)/16)*16; - no_oct=image1->POS_OCTET[*canal-1]+(nolig*nbcol16); - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - - lseek(num,nb_oct,1); -/*........................................... - lecture de 16 lignes completes de nolig+1 a nolig+16 - ................................................*/ - for (bloc=1;bloc<=pave;bloc=bloc+1) - { -/* lecture d'un bloc de 256 octets consecutifs */ - n=read(num,buf_lec,256); - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image multis"); - } - else - { -/* stockage du pave dans le tableau de 16 lignes completes */ - ind_tab=buffer+(bloc-1)*16; - ind_lec=buf_lec; - - for (l=1;l<=16;l=l+1) - { - for (p=1;p<=16;p=p+1) - { - *ind_tab=*ind_lec; - ind_tab=ind_tab+1; - ind_lec=ind_lec+1; - } - ind_tab=ind_tab+nbcol16-16; - } - } - } - -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - - if (iret==CAI_OK) - { - numlig=lig-nolig; - deb=buffer+(numlig-1)*nbcol16+(*premiere_colonne)-1; - while ((numlig<=16)&&(i<*nombre_lignes_lire)) - { - j=1; - while (j<=*nombre_colonnes_lire) - { - *pch=*deb; - pch=pch+1; - j=j+1; - deb=deb+(*pas_colonne); - } - numlig=numlig+(*pas_ligne); - deb=buffer+(numlig-1)*nbcol16+(*premiere_colonne)-1; - lig=lig+(*pas_ligne); - i=i+1; - } - } - } - - free(buffer); - } - free(buf_lec); - } - - return(iret); -} -/* - Fin de l'operation cai_lecture_canal_multis -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_multis */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image multiscope */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_multis(image1, canal, */ /* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_multis (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ecriture_canal_multis (CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) -{ -int num; /* descripteur de fichier */ -int nboct_pix; /* nombre d'octets par pixel */ -int nb_colon_correc; /* nombre de colonnes multiple de 16 */ -int nb_blocs; /* nombre de paquets de 16 pixels */ -int i_bloc; /* compteur de blocs */ -int nb_last_pix; /* nb initial de pixels dans le dernier bloc */ -int nb_blocs_prec_first_lig;/* nb de blocs avant 1ere ligne a ecrire */ -int nb_blocs_prec_lig; /* nb de blocs avant ligne courante */ -int pos_first_lig_ds_bloc; /* position 1ere ligne a ecrire dans son bloc*/ -int pos_lig_ds_bloc; /* position ligne courante dans son bloc */ -long position_first_oct; /* position du 1er octet a ecrire */ -long position_courante; /* position courante dans le fichier */ -long deplacement; /* deplacement a effectuer */ -long depla_bl; /* deplacement a effectuer */ -int i_ligne; /* compteur de lignes */ -unsigned char *buff_lig; /* tableau contenant une ligne a ecrire */ -unsigned char *buff_bloc; /* tableau contenant un bloc a ecrire */ -int taille_wr,octwr; /* nombre d'elements du buffer a ecrire */ -long int cr_write; /* code retour de write */ -int i,can; /* indice de boucle */ -int Nb1; /* Nombre d'octets de completion */ -int NbL,NbC,i_can; -unsigned char *buf; - -/* initialisations */ - -i_ligne = 0; -num = image1->ACCES_CANAL_INT[*canal-1]; -nboct_pix = image1->NBOCT_PIX; - - -/*************************************************/ -/* Les donnees doivent etre codees sur 8 bits */ -/*************************************************/ - -if ( nboct_pix != 1 ) -{ - strcpy ( CAI_ERREUR , "Erreur : les donnees doivent etre codees sur 8 bits\n"); - goto ERREUR; -} - - -/********************************************************/ -/* Calcul du nombre de colonnes multiple de 16 de */ -/* l'image a ecrire */ -/********************************************************/ - -if ( (*nombre_colonnes_ecrire) % 16 == 0 ) - nb_colon_correc = (*nombre_colonnes_ecrire); -else - nb_colon_correc = (*nombre_colonnes_ecrire) - ((*nombre_colonnes_ecrire)%16) + 16; - -/********************************************************/ -/* Calcul du nombre de blocs complets de 16 pixels */ -/* sur une meme ligne (eventuellement completes par 0) */ -/********************************************************/ - -nb_blocs = nb_colon_correc / 16; - -/********************************************************/ -/* Calcul du nombre de pixels presents initialement */ -/* dans le dernier bloc d'une ligne */ -/********************************************************/ - -nb_last_pix = 16 - ( nb_colon_correc - (*nombre_colonnes_ecrire) ); - - -/********************************************************/ -/* Calcul du nombre de blocs de 16 lignes precedant la */ -/* premiere ligne a ecrire */ -/* Calcul de la position de la premiere ligne a ecrire */ -/* au sein d'un bloc de 16 lignes */ -/********************************************************/ -if ( (*premiere_ligne) <= 16 ) -{ - nb_blocs_prec_first_lig = 0; - pos_first_lig_ds_bloc = (*premiere_ligne); -} -else if ( ((*premiere_ligne) - 1) % 16 == 0 ) -{ - nb_blocs_prec_first_lig = ((*premiere_ligne) - 1) / 16; - pos_first_lig_ds_bloc = 1; -} -else -{ - nb_blocs_prec_first_lig = - ( ((*premiere_ligne) - 1 ) - ((*premiere_ligne) - 1)%16 ) / 16; - pos_first_lig_ds_bloc = 1 + ((*premiere_ligne) - 1)%16; -} - - - -/********************************************************/ -/* Initialisations */ -/********************************************************/ - -pos_lig_ds_bloc = pos_first_lig_ds_bloc; -nb_blocs_prec_lig = nb_blocs_prec_first_lig; - - -/********************************************************/ -/* POUR chacune des lignes a ecrire */ -/********************************************************/ -for ( i_ligne = 0 ; i_ligne < (*nombre_lignes_ecrire) ; i_ligne++ ) -{ - -/********************************************************/ -/* calcul de la position du premier octet de la */ -/* ligne a ecrire */ -/********************************************************/ - - position_first_oct = (long) ( image1->POS_OCTET[*canal-1] - + 16 * (pos_lig_ds_bloc - 1) - + 16 * nb_blocs_prec_lig * nb_colon_correc ); -/********************************************************/ -/* recuperation de la position courante */ -/********************************************************/ - - position_courante = lseek ( num , 0L , 1 ); - -/********************************************************/ -/* deplacement jusqu'au premier octet a ecrire */ -/********************************************************/ - - deplacement = position_first_oct - position_courante; - lseek ( num , deplacement , 1 ); - -/********************************************************/ -/* extraction de la ligne du tableau */ -/********************************************************/ - - buff_lig = data_image + (*nombre_colonnes_ecrire) * i_ligne; - -/********************************************************/ -/* initialisation du decalage de 15*16 octets */ -/********************************************************/ - - depla_bl = 0; - -/********************************************************/ -/* POUR chacun des blocs de 16 pixels */ -/********************************************************/ - for ( i_bloc = 0 ; i_bloc < nb_blocs ; i_bloc++ ) - { - -/********************************************************/ -/* deplacement */ -/********************************************************/ - - lseek ( num , depla_bl , 1 ); - -/********************************************************/ -/* extraction d'un bloc de la ligne */ -/********************************************************/ - - buff_bloc = buff_lig + i_bloc * 16; - -/********************************************************/ -/* determination du nombre de pixels a */ -/* ecrire */ -/********************************************************/ - - if ( i_bloc == nb_blocs - 1 ) - taille_wr = (int) nb_last_pix; - else - taille_wr = 16; - - image1->NB_PIX_ECRITS[(*canal)-1] = - image1->NB_PIX_ECRITS[(*canal)-1] + taille_wr; - -/********************************************************/ -/* ecriture dans le fichier */ -/********************************************************/ - cr_write = write ( num , buff_bloc , taille_wr ); - if ( cr_write != taille_wr ) - { - strcpy ( CAI_ERREUR , - "Erreur ecriture canal image multiscope\n" ); - goto ERREUR; - } -/* ecriture des colonnes de completion si necessaire */ - octwr = 16 - taille_wr; - buf = (unsigned char *) calloc(octwr,sizeof(unsigned char)); - if (buf==NULL) - { - printf(CAI_ERREUR,"Erreur completion multiscope"); - return(CAI_KO); - } - - cr_write = write ( num , buf , octwr ); - if ( cr_write != octwr ) - { - strcpy ( CAI_ERREUR , - "Erreur ecriture canal image multiscope\n" ); - goto ERREUR; - } - free(buf); - - -/********************************************************/ -/* calcul de l'histogramme */ -/********************************************************/ - can=(*canal)-1; - calculer_histo (image1, buff_bloc , taille_wr , can); -/********************************************************/ -/* mise a jour du decalage de 15*16 octets */ -/********************************************************/ - - depla_bl = 15*16; - -/********************************************************/ -/* FIN POUR */ -/********************************************************/ - } - -/********************************************************/ -/* mise a jour de la position de la ligne dans le */ -/* bloc, et du nombre de blocs precedant la ligne */ -/********************************************************/ - - if ( pos_lig_ds_bloc == 16 ) - { - pos_lig_ds_bloc = 1; - nb_blocs_prec_lig++; - } - else - pos_lig_ds_bloc++; - -/********************************************************/ -/* FIN POUR */ -/********************************************************/ -} - - -/********************************************************/ -/* SI on a ecrit le dernier pixel du canal */ -/********************************************************/ - -if ( image1->NB_PIX_ECRITS[*canal-1] == image1->NB_COL*image1->NB_LIG ) -{ -/* Ecriture des 0 de completions si necessaires */ - - NbL= image1->NB_LIG; - NbC= image1->NB_COL; - if ((NbL%16) !=0) - NbL = ((NbL/16)+1)*16; - - if ((NbC%16) !=0) - NbC = ((NbC/16)+1)*16; - - Nb1 = (NbL*NbC)+1280; - if (Nb1 !=0) - { - position_courante = lseek ( num , 0L , 1 ); - deplacement = Nb1 - position_courante; - buf = (unsigned char *) calloc(deplacement,sizeof(unsigned char)); - if (buf==NULL) - { - printf(CAI_ERREUR,"Erreur ecriture multiscope"); - return(CAI_KO); - } - - - /* ecriture des octets a 0 pour bloc de 16 */ - num=image1->ACCES_CANAL_INT[(*canal)-1]; - cr_write = write ( num , buf , deplacement ); - - free(buf); - } - -/********************************************************/ -/* on ecrit l'histogramme dans le fichier */ -/* apres positionnement dans le fichier */ -/********************************************************/ - - lseek ( num , 0L , 0 ); - lseek ( num , 256L , 0 ); - - /* inversion des octets */ - for ( i=0 ; i<256 ; i++ ) - { - inverser((char *)&(image1->HISTO[(*canal)-1][i]), - (sizeof(int)-1)); - } - - cr_write = write ( num , image1->HISTO[(*canal)-1] , - (sizeof(int)*256) ); - if ( cr_write != (sizeof(int)*256) ) - { - strcpy ( CAI_ERREUR , - "Erreur ecriture canal image multiscope\n" ); - goto ERREUR; - } -} - - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} - -/* - Fin de l'operation cai_ecriture_canal_multis -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_multis */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format multiscope et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_multis(image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_multis (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_multis (CAI_IMAGE *image1) - -{ - int iret; /* code retour de l'operation */ - int i_can; /* indice du canal a fermer */ - int num; /* descripteur du fichier a fermer */ - - iret=CAI_OK; - -/*............................................. - Fermeture des fichiers image - .............................................*/ - for (i_can=0;i_can<image1->NB_CANAUX;i_can=i_can+1) - { - num=image1->ACCES_CANAL_INT[i_can]; - close(num); - } - - - return (iret); -} -/* - Fin de l'operation cai_ferme_multis -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_multis */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en multiscope et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_multis(format,nom_ima) */ /* ------------------ */ -/* format (E) (char *) : format de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_multis (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_dest_ima_multis (char *repertoire , - char *nom_ima ) - -{ -int i_can; /* compteur de canaux */ -long iret; /* code retour fonction fermetrue lecture */ -char nom_fichier[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ -char nom_fic_canal[1024]; /* nom du fichier canal a detruire */ -char chemin[1024]; /* repertoire + "/" */ -char *ptr_nom_fic_can; /* pointeur sur nom fichier canal traite */ -int cr_stat; /* code retour de fonction status de fichier*/ -struct stat buf_stat; /* structure decrivant status de fichier */ -CAI_IMAGE *image1; /* structure ouverture image */ -int nb_can; /* nombre de canaux de l'image */ -int nboct_pix; /* nombre d'octets par pixel image */ -int nb_col; /* nombre de colonnes de l'image */ -int nb_lig; /* nombre de lignes de l'image */ - -/************************************************/ -/* Constitution du nom du fichier d'entete */ -/************************************************/ -nom_ima_complet[0]='\0'; -if ((long int)strlen(repertoire)!= 0) -{ - strcpy ( nom_ima_complet , repertoire ); - strcat ( nom_ima_complet, "/" ); - strcpy ( chemin,nom_ima_complet ); - strcat ( nom_ima_complet , nom_ima ); - chemin[strlen(repertoire)+1] = '\0'; -} -else -{ - strcpy ( nom_ima_complet , nom_ima); - chemin[0]='\0'; -} -strcpy(nom_fichier , nom_ima_complet); -strcat ( nom_fichier , ".img" ); -nom_fichier[strlen(nom_ima_complet)+4]='\0'; - - -/************************************************/ -/* Extraction des caracteristiques de l'image */ -/* et noms des fichiers fdoxxxxx.per */ -/* du fichier entete par l'appel a la fonction */ -/* cai_ouvre_lecture_multis */ -/************************************************/ - image1 = cai_ouvre_lecture_multis ( repertoire,nom_ima, &nb_can ,&nboct_pix , - &nb_col, &nb_lig ); - if ( image1 == NULL) goto ERREUR; - -image1->NB_CANAUX=nb_can; -image1->NB_COL=nb_col; -image1->NB_LIG=nb_lig; -image1->NBOCT_PIX=nboct_pix; - -ptr_nom_fic_can = image1->NOM_FIC_CAN; - -for ( i_can = 0 ; i_can < nb_can ; i_can++ ) -{ - strncpy ( nom_fic_canal , ptr_nom_fic_can , 49 ); - nom_fic_canal[49] = '\0'; - strcpy ( nom_fichier , chemin ); - strcat ( nom_fichier, nom_fic_canal ); - nom_fichier[strlen(chemin)+12] = '\0'; - cr_stat = stat ( nom_fichier , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fichier ); - ptr_nom_fic_can = ptr_nom_fic_can + 100; -} - - iret=cai_ferme_multis(image1); - -/************************************************/ -/* Destruction du fichier d'entete */ -/************************************************/ -nom_fichier[0]='\0'; -strcpy(nom_fichier , nom_ima_complet); -strcat ( nom_fichier , ".img" ); -nom_fichier[strlen(nom_ima_complet)+4]='\0'; - -cr_stat = stat ( nom_fichier , &buf_stat ); -if ( cr_stat == 0 ) -unlink ( nom_fichier ); - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} -/* - Fin de l'operation cai_dest_ima_multis -*/ - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS INTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : inverser */ -/* ---------- */ -/* */ -/* ROLE : Inversion des octets poids forts,poids faibles */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : void inverser((char *)s,nboct) */ -/* ----------------- */ -/* */ -/* s (E/S) (char *) : chaine a inverser */ -/* nboct (E) (int) : longueur de la chaine */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -static void inverser ( char *s , int nboct ) -{ - int c; - char *t; - - for ( t=s+nboct ; s<t ; s++,t-- ) - { - c=*s; - *s=*t; - *t=c; - } -} -/* Fin de l'operation inverser */ - -/*****************************************************************************/ -/* */ -/* OPERATION : calculer_histo */ -/* ---------- */ -/* */ -/* ROLE : Inversion des octets poids forts,poids faibles */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : void calculer_histo(s,nboct) */ -/* ----------------- */ -/* */ -/* s (E/S) (char *) : chaine a inverser */ -/* nboct (E) (int) : longueur de la chaine */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -static void calculer_histo (CAI_IMAGE *image1, unsigned char *buffer , - int nb_pix , int canal ) -{ - int i_pix; /* indice de boucle sur les pixels */ - int val_pix; /* valeur du pixel traite */ - - for ( i_pix=0 ; i_pix<nb_pix ; i_pix++ ) - { - val_pix = (int) buffer[i_pix]; - image1->HISTO[canal][val_pix]++; - } -} -/* - Fin de l'operation calculer_histo -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_multis */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture-ecriture d'une image au format */ -/* ----- multiscope et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_multis (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_multis (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_modifie_multis(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom du fichier canal */ - char nom_util_canal[1024]; /* nom du fichier utilisateur */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - int num,retour,lon; /* variables de travail */ - short int type,fin; /* variables de trvail */ - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - *nb_can=0; - iret=1; - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_image); - strcat(nom_fic,".img"); - nom_fic[strlen(repert)+1+strlen(nom_image)+4]='\0'; - } - else - { - sscanf(nom_image,"%s",nom_fic); - strcat(nom_fic,".img"); - nom_fic[strlen(nom_image)+4]='\0'; - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ - fic=fopen(nom_fic,"rb"); - if (fic == NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete MULTISCOPE"); - } - else - { - -/*.................................... - positionnement sur le nombre de colonnes -*/ - fseek(fic,8,0); -/* - recuperation du nombre de colonnes */ - fread(nb_col,4,1,fic); -/* - inversion des octets pour compatibilite SUN */ - lon=sizeof(*nb_col)-1; - inverser((char *)nb_col,lon); - -/*.................................... - recuperation du nombre de lignes -*/ - fread(nb_lig,4,1,fic); -/* - inversion des octets pour compatibilite SUN */ - lon=sizeof(*nb_lig)-1; - inverser((char *)nb_lig,lon); - -/*...................................... - initialisation du nombre d'octets par pixel -*/ - *nboct_pix=1; - image1->NB_BITS_PIX=8; - sprintf(image1->COD_PIX,"OCT"); -/*................................. - positionnement sur le premier objet -*/ - fseek(fic,114,1); - retour=0; - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - - while (retour == 0) - { -/*...........Recuperation de tous les objets jusqu'a l'eof - nom fichier,nom utilisateur et type de l'objet(avec inversion) -*/ - fread(nom_fic_canal,14,1,fic); - fread(nom_util_canal,40,1,fic); - fread(&type,2,1,fic); - lon=sizeof(type)-1; - inverser((char *)&type,lon); - if (type == 3) - { -/*....................................... - Initialisation des tableaux contenant le nom de fichier - et le nom utilisateur de chaque canal - .....................................................*/ - - - if (*nb_can<CAI_NB_MAX_CAN) - { - nom_fic_canal[0] = tolower(nom_fic_canal[0]); - nom_fic_canal[1] = tolower(nom_fic_canal[1]); - nom_fic_canal[2] = tolower(nom_fic_canal[2]); - nom_fic_canal[9] = tolower(nom_fic_canal[9]); - nom_fic_canal[10] = tolower(nom_fic_canal[10]); - nom_fic_canal[11] = tolower(nom_fic_canal[11]); - nom_fic[0]='\0'; - if ((long int)strlen(repert) != 0) - { - sscanf(repert,"%s",nom_fic); - strcat(nom_fic,"/"); - strcat(nom_fic,nom_fic_canal); - nom_fic[strlen(repert)+1+strlen(nom_fic_canal)]='\0'; - } - else - { - sscanf(nom_fic_canal,"%s",nom_fic); - nom_fic[strlen(nom_fic_canal)]='\0'; - } - sscanf(nom_fic_canal,"%s",deb); - deb=deb+100; - sscanf(nom_util_canal,"%s",deb1); - deb1=deb1+100; - - num=open(nom_fic,O_RDWR,0); - if (num==-1) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fi canal Multiscope"); - } - else - { - image1->ACCES_CANAL_INT[*nb_can]=num; - image1->POS_OCTET[*nb_can]=1280; - image1->NB_PIX_ECRITS[*nb_can]=0; - } - - } - *nb_can=*nb_can+1; - } - -/*............Positionnement en fin de bloc */ - fseek(fic,70,1); -/* - ............Test fin de fichier */ - fread(&fin,2,1,fic); - retour=feof(fic); - } -/*.................................. - Fermeture du fichier - ......................................*/ - fclose(fic); - } - - - if (iret != 0) - return (image1); - else - return(NULL); - -} -/* - Fin de l'operation cai_ouvre_modifie_multis -*/ diff --git a/Utilities/CAI/cai_dll/src/cai_onera.c b/Utilities/CAI/cai_dll/src/cai_onera.c deleted file mode 100755 index 76b55d78ab..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_onera.c +++ /dev/null @@ -1,1296 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_onera.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format onera */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : fevrier 1995 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 3.3: DM : optimisation des acces */ -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : FA : verification que l'image est codee sur un seul */ -/*octet par pixel (contrainte du format) */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : modifications open et fopen pour PC NT */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : test sur fclose pour PC/LINUX */ -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : FA : erreur ouverture en modification */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA : ecriture image entiere. Correction du test de */ -/* retour sur le nb d'octets ecrits */ -/*****************************************************************************/ -/* MOD : VERSION : 5.3 : FA : ouverture en lecture/ecriture */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - -# include <stdio.h> -# include <string.h> -# include <stdlib.h> -# include <unistd.h> -# include <sys/types.h> -#include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> - -#define _CAI_IMAGE -#define IN_CAI_ONERA - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_onera.c,v 1.10 01/05/31 10:47:12 cmf Exp $"; - -extern char *getenv(); - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_onera */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format onera */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_onera(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees*/ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_onera (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -long int cai_liste_ima_onera (char *repert, - char ***tab_ima) - - -{ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - -struct dirent *dp; /* structure resultat de la fonction readdir */ - - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - char *pch2,*pch3; /* pointeurs sur chaine de caracteres */ - char car; /* variable de travail */ - int nb_ima; /* nombre d'images onera identifiees */ - int i; /* indice de boucle */ - - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - - dirp=opendir(repert); - - if(dirp!=NULL) - { - -/*...................................... - premiere passe pour comptabiliser les images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE ONERA - (EXTENSION =.inf) - ..........................................*/ - - while((dp=readdir(dirp))!=NULL) - { - - car='.'; - pch0=strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='i'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='n'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - car='f'; - pch3=strrchr(dp->d_name,car); - if ((pch3 != NULL)&&(pch3==pch2+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - *pch3=' '; - nb_ima=nb_ima+1; - } - } - } - } - } - - closedir(dirp); -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT ONERA - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE ONERA - (EXTENSION =.inf) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - while((dp=readdir(dirp))!=NULL) - { - - car='.'; - pch0=strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='i'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='n'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - car='f'; - pch3=strrchr(dp->d_name,car); - if ((pch3 != NULL)&&(pch3==pch2+1)) - { - *pch0='\0'; - *pch1=' '; - *pch2=' '; - *pch3=' '; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - } - } - } - - (void)closedir(dirp); - - } - else - { - /* Repertoire inexistant */ - nb_ima=-1; - } - - return(nb_ima); - -} - -/* Fin de l'operation cai_liste_ima_onera -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_onera */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format onera */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_onera (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_onera (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_lecture_onera(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ - int fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - char car[2]; /* indice du canal traite */ - int num,ican; /* indice */ - char *buf_lec ; /* buffer lecture entete onera */ - long k; /* indice */ - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - *nb_can=0; - - - iret=1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_lecture"); - } - else - { -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.inf",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.inf",nom_image); - } - - -/*........................ - Ouverture du fichier entete - ..........................................*/ - num=open(nom_fic,O_RDONLY|O_BINARY,0); - if (num == -1) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete ONERA"); - } - else - { - -/*.................................... - Lecture du fichier entete - ............................................*/ - buf_lec=(char *) malloc(257); - if (buf_lec==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_lecture"); - } - else - { - - k=read(num,buf_lec,256); - if (k<=0) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur lecture entete Onera"); - close(num); - } - else - { - buf_lec[k]='\0'; -/*......................................... - Initialisation du nombre d'octets par pixel . Pour onera les pixels - sont toujours codes sur 1 octet - ...............................................................*/ - *nboct_pix=1; - image1->NB_BITS_PIX=8; - sprintf(image1->COD_PIX,"OCT"); -/*................................. - Decodage de l'enregistrement - .........................................*/ - deb=buf_lec; - sscanf(deb,"%d%d%d",nb_col,nb_lig,nb_can); - close(num); - } - free(buf_lec); - } - } - - if (iret !=0) - { -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL et ouverture - de ces fichiers - .....................................................*/ - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - ican=1; - while((ican<=*nb_can)&&(ican<CAI_NB_MAX_CAN)) - { - sprintf(deb,"%s.%d",nom_image,ican); - deb=deb+100; - sprintf(deb1,"%s.%d",nom_image,ican); - deb1=deb1+100; - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.%d",repert,nom_image,ican); - } - else - { - sprintf(nom_fic,"%s.%d",nom_image,ican); - } - fic=open(nom_fic,O_RDONLY|O_BINARY,0); - if (fic != -1) - { - image1->ACCES_CANAL_INT[ican-1]=fic; - image1->POS_OCTET[ican-1]=0; - ican=ican+1; - } - else - { - iret=0; - strcpy(CAI_ERREUR,"incoherence au niveau du nb fichiers canaux"); - return(NULL); - } - } - } - } - - if (iret == 0) - { - return (NULL); - } - else - { - return(image1); - } - -} - -/* - Fin de l'operation cai_ouvre_lecture_onera -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_onera */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format onera et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_onera(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_onera (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_creation_onera(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig, - char *label) - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - int retour; /* retour de fonction */ - char car[2]; /* indice du canal traite */ - int i,num; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : FA : verification que l'image est codee sur un seul */ -/*octet par pixel (contrainte du format) */ -/*****************************************************************************/ - if (*nboct_pix != 1) - { - image1 = NULL; - sprintf ( CAI_ERREUR , - "Une image onera ne peutetre codee que sur un seul octet par pixel"); - goto ERREUR; - } - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } - -/*................................................. - Constitution du nom du fichier entete et verification qu'il - n'existe pas deja - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.inf",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.inf",nom_image); - } - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s ONERA existe \n" , nom_image ); - goto ERREUR; - } - -/*............................................................... - Pour chaque canal de l'image,constitution du nom de fichier correspondant - Verification qu'il n'existe pas deja - Ouverture du fichier en ecriture - .................................................................*/ - - for (i=0;i<*nb_can;i=i+1) - { - nom_fic_canal[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic_canal,"%s/%s.%d",repert,nom_image,i+1); - } - else - { - sprintf(nom_fic_canal,"%s.%d",nom_image,i+1); - } - retour = stat ( nom_fic_canal , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s ONERA existe \n" , nom_image ); - goto ERREUR; - } - - num = open(nom_fic_canal,O_RDWR|O_CREAT|O_BINARY,PERMS); - if (num == -1) - { - sprintf(CAI_ERREUR,"Erreur: Creation %s canl impossible\n",nom_fic_canal); - goto ERREUR; - } - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=0; - } - -/*...................................................... - Ouverture du fichier entete en ecriture - Ecriture du contenu - ..........................................................*/ - fic = fopen(nom_fic,"w"); - if (fic == NULL) - { - sprintf(CAI_ERREUR, - "Erreur: Creation fichier entete %s impossible\n", - nom_fic); - goto ERREUR; - } - fprintf ( fic , "%d\n" , *nb_col ); - fprintf ( fic , "%d\n" , *nb_lig); - fprintf ( fic , "%d" , *nb_can ); - - -/*************************************************/ -/* Fermeture du fichier */ -/*************************************************/ - - if (fic!=NULL) fclose ( fic ); - return (image1); - -ERREUR : - return(NULL); -} - -/* - Fin de l'operation cai_ouvre_creation_onera -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_onera */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image onera */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_onera(image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_onera (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_lecture_canal_onera(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) - -{ - int num,i,j; /* variables de travail */ - long pt_oct,n; /* position courante dans le fichier image */ - int no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - int lig; /* indice de boucle sur les lignes */ - int oct_pix; /* nb octets par pixels */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - long oct_lig; /* nb oct. par ligne en considerant taille pixel */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - - -/*........................... - Initialisations diverses - ..........................*/ - - iret=CAI_OK; - num=image1->ACCES_CANAL_INT[*canal-1]; - oct_pix=image1->NBOCT_PIX; - oct_lig=oct_pix*(image1->NB_COL); - -/*.......................................*/ -/* verification si lecture image entiere */ -/*.......................................*/ - if ((*nombre_lignes_lire==image1->NB_LIG)&&(*nombre_colonnes_lire==image1->NB_COL) - &&(*pas_ligne==1)&&(*pas_colonne==1)) - { - oct_lig=oct_pix*(image1->NB_COL)*(image1->NB_LIG); - - /* positionnement en debut de fichier */ - pt_oct=lseek(num,0L,0); - - /* lecture du canal complet */ - n=read(num,data_image,oct_lig); - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image ONERA"); - } - else - iret=CAI_OK; - } - else - { - -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - - buf_lec = (unsigned char *) malloc(oct_lig); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - } - else - { -/*.................... - Initialisation - ......................*/ - lig=*premiere_ligne; - i=1; - pch=data_image; - -/*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i <= *nombre_lignes_lire)&&(iret==CAI_OK)) - { -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - no_oct=(lig-1)*image1->NB_COL; - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture d'une ligne image - ................................................*/ - n=read(num,buf_lec,image1->NB_COL); - - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image onera"); - } - else - { -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - deb=buf_lec+(*premiere_colonne-1); - j=1; - while (j <= *nombre_colonnes_lire) - { - *pch=*deb; - pch=pch+1; - j=j+1; - deb=deb+*pas_colonne; - } - - } - i=i+1; - lig=lig+*pas_ligne; - - } - - free(buf_lec); - } - } - - return(iret); -} - -/* - Fin de l'operation cai_lecture_canal_onera -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_onera */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image onera */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_onera(image1, canal, */ /* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_onera (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ecriture_canal_onera (CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) -{ -long position_first_lig; /* position de la 1ere ligne a ecrire */ -long position_courante; /* position courante dans le fichier */ -long deplacement; /* deplacement a effectuer */ -int i_ligne; /* compteur de lignes */ -unsigned char *buff_lig; /* tableau contenant une ligne a ecrire */ -long cr_write; /* code retour de write */ -int num; /* descripteur de fichier */ -int nboct_pix; /* nombre d'octets par pixel */ -int tot_pix; /* nb de pixels total a ecrire */ - -/* ................ - Initialisations - .................*/ -i_ligne = 0; -num = image1->ACCES_CANAL_INT[*canal-1]; -nboct_pix = image1->NBOCT_PIX; - - -/*************************************************/ -/* Les donnees doivent etre codees sur 8 bits */ -/*************************************************/ - -if ( nboct_pix != 1 ) -{ - strcpy ( CAI_ERREUR , "Erreur : les donnees doivent etre codees sur 8 bits\n"); - goto ERREUR; -} -/*.......................................*/ -/* verification si ecriture image entiere */ -/*.......................................*/ - if ((*nombre_lignes_ecrire==image1->NB_LIG)&& - (*nombre_colonnes_ecrire==image1->NB_COL)) - { - tot_pix=nboct_pix*(image1->NB_COL)*(image1->NB_LIG); - - /* positionnement en debut de fichier */ - position_first_lig=lseek(num,0L,0); - -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA : ecriture image entiere. Correction du test de */ -/* retour sur le nb d'octets ecrits */ -/* tot_pix au lieu de nboct_pix */ -/*****************************************************************************/ - /* ecriture du canal complet */ - cr_write = write ( num , data_image,tot_pix); - if (cr_write != tot_pix) - { - strcpy(CAI_ERREUR,"Erreur ecriture donnee image ONERA"); - goto ERREUR; - } - } - else - { - -/********************************************************/ -/* Calcul de la position de la premiere ligne a ecrire */ -/********************************************************/ - -position_first_lig = - (long) ( image1->POS_OCTET[*canal-1] + - (*premiere_ligne - 1) * (*nombre_colonnes_ecrire) ); - - -/********************************************************/ -/* Recuperation de la position courante */ -/********************************************************/ - -position_courante = lseek ( num , 0L , 1 ); - - -/********************************************************/ -/* Deplacement jusqu'a la premiere ligne a ecrire */ -/********************************************************/ - -deplacement = position_first_lig - position_courante; -lseek ( num, deplacement , 1 ); - - -/********************************************************/ -/* TANT QUE il y a des lignes a ecrire */ -/********************************************************/ -while (i_ligne < *nombre_lignes_ecrire) -{ - -/********************************************************/ -/* extraction de la ligne du tableau */ -/********************************************************/ - - buff_lig = data_image + (*nombre_colonnes_ecrire) * i_ligne; - -/********************************************************/ -/* ecriture de la ligne */ -/********************************************************/ - - cr_write = write ( num , buff_lig ,(*nombre_colonnes_ecrire) ); - if ( cr_write !=(*nombre_colonnes_ecrire) ) - { - strcpy ( CAI_ERREUR , "Erreur ecriture canal image onera \n" ); - goto ERREUR; - } - -/********************************************************/ -/* incrementation du nombre de lignes */ -/********************************************************/ - - i_ligne++; - -/********************************************************/ -/* FIN TANT QUE */ -/********************************************************/ - } -} - - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} -/* - Fin de l'operation cai_ecriture_canal_onera -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_onera */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format onera et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_onera(image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_onera (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_onera (CAI_IMAGE *image1) - - -{ - int iret; /* code retour de l'operation */ - int i_can; /* indice du canal a fermer */ - int num; /* descripteur du fichier a fermer */ - - - iret=CAI_OK; -/*............................................. - Fermeture des fichiers image - .............................................*/ - for (i_can=0;i_can<image1->NB_CANAUX;i_can=i_can+1) - { - num=image1->ACCES_CANAL_INT[i_can]; - if (num>0) close(num); - } - - - return (iret); -} - -/* - Fin de l'operation cai_ferme_onera -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_onera */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en onera et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_onera(format,nom_ima) */ /* ------------------ */ -/* format (E) (char *) : format de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_onera (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_dest_ima_onera ( char *repertoire , - char *nom_ima ) - -{ - -int i_can; /* compteur de canaux */ -long iret; /* code retour fonction fermetrue lecture */ -char str_num_canal[3]; /* suffixe numero du canal */ -char nom_fic_entete[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ -char nom_fic_canal[1024]; /* nom du fichier canal a detruire */ -int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ -CAI_IMAGE *image1; /* structure ouverture image */ -int nb_can; /* nombre de canaux de l'image */ -int nboct_pix; /* nombre d'octets par pixel image */ -int nb_col; /* nombre de colonnes de l'image */ -int nb_lig; /* nombre de lignes de l'image */ - -/************************************************/ -/* Constitution du nom du fichier d'entete */ -/************************************************/ -if ((long)strlen(repertoire)!= 0) -{ - sprintf ( nom_ima_complet, "%s/%s",repertoire,nom_ima ); - -} -else -{ - strcpy ( nom_ima_complet , nom_ima); -} -sprintf(nom_fic_entete ,"%s.inf", nom_ima_complet); - -/************************************************/ -/* Extraction des caracteristiques de l'image */ -/* du fichier entete par l'appel a la fonction */ -/* cai_ouvre_lecture_onera */ -/************************************************/ - - image1 = cai_ouvre_lecture_onera ( repertoire,nom_ima, &nb_can ,&nboct_pix , - &nb_col , &nb_lig); - if ( image1 == NULL) goto ERREUR; - - image1->NB_CANAUX=nb_can; - image1->NB_COL=nb_col; - image1->NB_LIG=nb_lig; - image1->NBOCT_PIX=nboct_pix; - -iret=cai_ferme_onera(image1); -image1 = NULL; - -/************************************************/ -/* Destruction du fichier d'entete */ -/************************************************/ - -cr_stat = stat ( nom_fic_entete , &buf_stat ); -if ( cr_stat == 0 ) - unlink ( nom_fic_entete ); - - -/************************************************/ -/* Constitution un a un des noms des fichiers */ -/* canaux et destruction */ -/************************************************/ - -for ( i_can = 0 ; i_can < nb_can ; i_can++ ) -{ - sprintf( nom_fic_canal , "%s.%d" ,nom_ima_complet,i_can+1); - cr_stat = stat ( nom_fic_canal , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic_canal ); -} - - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} -/* - Fin de l'operation cai_dest-ima_onera -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_onera */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture-ecriture d'une image au format */ -/* ----- onera et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_onera (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_onera (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_modifie_onera(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ - int fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - char car[2]; /* indice du canal traite */ - int num,ican; /* indice */ - char *buf_lec ; /* buffer lecture entete onera */ - long k; /* indice */ - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - *nb_can=0; - - - iret=1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_modifie"); - } - else - { - -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.inf",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.inf",nom_image); - } - - -/*........................ - Ouverture du fichier entete - ..........................................*/ - num=open(nom_fic,O_RDWR|O_BINARY,0); - if (num == -1) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete ONERA"); - } - else - { -/*.................................... - Lecture du fichier entete - ............................................*/ - buf_lec=(char *) malloc(257); - if (buf_lec==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_modifie"); - } - else - { - - k=read(num,buf_lec,256); - if (k<=0) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur lecture entete Onera"); - close(num); - } - else - { - buf_lec[k]='\0'; -/*......................................... - Initialisation du nombre d'octets par pixel . Pour onera les pixels - sont toujours codes sur 1 octet - ...............................................................*/ - *nboct_pix=1; - image1->NB_BITS_PIX=8; - sprintf(image1->COD_PIX,"OCT"); -/*................................. - Decodage de l'enregistrement - .........................................*/ - deb=buf_lec; - sscanf(deb,"%d%d%d",nb_col,nb_lig,nb_can); - close(num); - } - free(buf_lec); - } - } - - if (iret !=0) - { -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL et ouverture - de ces fichiers - .....................................................*/ - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - ican=1; - while((ican<=*nb_can)&&(ican<CAI_NB_MAX_CAN)) - { - sprintf(deb,"%s.%d",nom_image,ican); - deb=deb+100; - sprintf(deb1,"%s.%d",nom_image,ican); - deb1=deb1+100; - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.%d",repert,nom_image,ican); - } - else - { - sprintf(nom_fic,"%s.%d",nom_image,ican); - } -/*****************************************************************************/ -/* MOD : VERSION : 5.3 : FA : ouverture en lecture/ecriture */ -/*****************************************************************************/ - fic=open(nom_fic,O_RDWR|O_BINARY,0); - if (fic != -1) - { - image1->ACCES_CANAL_INT[ican-1]=fic; - image1->POS_OCTET[ican-1]=0; - ican=ican+1; - } - else - { - iret=0; - strcpy(CAI_ERREUR,"incoherence au niveau du nb fichiers canaux"); - return(NULL); - } - } - - } - } - if (iret==0) - { - return (NULL); - } - else - { - return(image1); - } - -} -/* - Fin de l'operation cai_ouvre_modifie_onera -*/ diff --git a/Utilities/CAI/cai_dll/src/cai_radar.c b/Utilities/CAI/cai_dll/src/cai_radar.c deleted file mode 100755 index ebf80637a4..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_radar.c +++ /dev/null @@ -1,1466 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_radar.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format radar */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CS) */ -/* ------- */ -/* */ -/* DATE DE CREATION : Juin 2001 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V5.1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 1.2 : FA : IMA-FA-011 pb inversion des octets complexes */ -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : DM : Maj du tag COD_PIX lorsque l'image est codée */ -/* en reel a partir du TYPE_CODE */ -/*****************************************************************************/ - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -#ifndef _MSC_VER -# include <strings.h> -#endif -# include <stdlib.h> -# include <sys/types.h> -# include <unistd.h> -# include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> -#include <errno.h> - -#define _CAI_IMAGE -#define IN_CAI_RADAR - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header$"; - -extern char *getenv(); - -#define FREE(A) { if ((A)!=NULL) { free(A); (A)=NULL; } } - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_radar */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format radar */ -/* ------ */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_radar(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_radar (S) (long int) : = -1 repertoire inexistant */ -/* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -long int cai_liste_ima_radar (char *repert, - char ***tab_ima) -{ - - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - struct dirent *dp; /* structure resultat de la fonction readdir */ - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - int nb_ima; /* nombre d'images radar identifiees */ - int ind; /* indice de boucles */ - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - dirp=opendir(repert); - - if(dirp!=NULL) - { - -/*...................................... - - premiere passe pour comptabiliser les images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE RADAR_CNES - (EXTENSION =.rad ou .RAD) - ..........................................*/ - while((dp=readdir(dirp))!=NULL) - { -/* recherche de l'extension en minuscule */ - pch0 = strstr(dp->d_name,".rad"); - if (pch0==NULL) - { -/* recherche de l'extension en majuscule */ - pch1=strstr(dp->d_name,".RAD"); - if ((pch1 != NULL)&&(*(pch1+4) == '\0')) - { - nb_ima=nb_ima+1; - } - } - else - { - if (*(pch0+4) == '\0') - nb_ima=nb_ima+1; - } - } - (void)closedir(dirp); - -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT RADAR - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (ind=0;ind<nb_ima;ind++) - (*tab_ima)[ind]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE RADAR_CNES - (EXTENSION =.rar ou .RAD) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - while((dp=readdir(dirp))!=NULL) - { -/* recherche de l'extension en minuscule */ - pch0 = strstr(dp->d_name,".rad"); - if (pch0==NULL) - { -/* recherche de l'extension en majuscule */ - pch1=strstr(dp->d_name,".RAD"); - if ((pch1 != NULL)&&(*(pch1+4) == '\0')) - { - *pch1='\0'; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - else - { - if (*(pch0+4) == '\0') - { - *pch0='\0'; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - } - (void)closedir(dirp); - } - else - { - /* repertoire inexistant */ - nb_ima=-1; - } - return(nb_ima); -} - -/* Fin de l'operation cai_liste_ima_radar -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_radar */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format radar */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_radar (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels et par canal */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_radar (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_lecture_radar(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - - -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - char label[80]; /* contient un enregistrement du fichier */ - int nbplan; /* nombre de canaux dans le fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines*/ - char *deb,*pch0; /* pointeurs sur chaine de caracteres */ - int ind,num; /* indice */ - int nboct; /* variables de travail */ - int ind_typ; /* Indice du type de codage */ - int is_Cplx; /* Indique si type complexe ou pas */ - char *type_machine; /* ordre rangement octets machine de travail*/ - int cmp; /* retour de comparaison de chaine */ - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - *nb_lig=0; - *nb_col=0; - *nboct_pix = 0; - pch0=NULL; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_lecture"); - goto ERREUR; - } -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)== 0) - sprintf(repert,"./"); - sprintf(nom_fic,"%s/%s.rad",repert,nom_image); - sprintf(image1->NOM_IMAGE,"%s/%s",repert,nom_image); - - /*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=NULL; - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { -/* verification si extension en majuscule */ - nom_fic[0]='\0'; - sprintf(nom_fic,"%s/%s.RAD",repert,nom_image); - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete RADAR-CNES"); - goto ERREUR; - } - } - /*.................................... - Decodage du nombre de colonnes - ............................................*/ - retour=fscanf(fic_in,"%s",label); - pch0=strstr(label,"NBCOLONNES"); - if (pch0==NULL) - { - sprintf(CAI_ERREUR,"Informations incoherentes NBCOLONNES dans %s", - nom_fic); - goto ERREUR; - } - retour=fscanf(fic_in,"%d",nb_col); - - - /*.................................... - Decodage du nombre de lignes - ............................................*/ - retour=fscanf(fic_in,"%s",label); - pch0=strstr(label,"NBLIGNES"); - if (pch0==NULL) - { - sprintf(CAI_ERREUR,"Informations incoherentes NBLIGNES dans %s", - nom_fic); - goto ERREUR; - } - retour=fscanf(fic_in,"%d",nb_lig); - - /*........................................ - Decodage du nombre de plans - .........................................*/ - retour=fscanf(fic_in,"%s",label); - pch0=strstr(label,"NBPLANS"); - if (pch0==NULL) - { - sprintf(CAI_ERREUR,"Informations incoherentes NBPLANS dans %s", - nom_fic); - goto ERREUR; - } - retour=fscanf(fic_in,"%d",&nbplan); - *nb_can=nbplan; - - /*........................................ - Recuperation du type de codage du plan .........................................*/ - retour=fscanf(fic_in,"%s",label); - pch0=strstr(label,"TYPECODAGE"); - if (pch0==NULL) - { - sprintf(CAI_ERREUR,"Informations incoherentes TYPECODAGE dans %s", - nom_fic); - goto ERREUR; - } - - retour=fscanf(fic_in,"%s",label); - pch0=cai_En_majuscule( label ); - -/* Verification si type de codage reconnu et recuperation de la taille pixel*/ - nboct = cai_istyp_radar(pch0,&ind_typ,&is_Cplx); - if (nboct == -1) - { - sprintf(CAI_ERREUR,"Type de codage du plan %s non reconnu ", - nom_fic_canal); - goto ERREUR; - } - *nboct_pix=nboct; - sprintf(image1->TYPE_COD,"%s",pch0); - -/* ........................................................... - Determination du sens de codage de la machine de travail - .............................................................*/ - type_machine = cai_test_pFpf(); - -/*..................................................... - Recuperation du type de codage du plan (INTEL ou IEEE) .......................................................*/ - retour=fscanf(fic_in,"%s",label); - pch0=strstr(label,"SENSCODAGE"); - if (pch0==NULL) - { - sprintf(CAI_ERREUR,"Informations incoherentes SENSCODAGE dans %s", - nom_fic); - goto ERREUR; - } - - retour=fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"IEEE",4); - if (retour==0) - sprintf(image1->COD_PIX,"BE"); - else - sprintf(image1->COD_PIX,"LE"); - cmp = strncmp(type_machine,image1->COD_PIX,2); - if (cmp!=0) - { -/*****************************************************************************/ -/* MOD : VERSION : 1.2 : FA : IMA-FA-011 pb inversion des octets complexes */ -/*****************************************************************************/ - if (is_Cplx==0) - image1->INV_OCTETS =1; - else - image1->INV_OCTETS =2; - } - else - { - image1->INV_OCTETS =0; - } -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : DM : Maj du tag COD_PIX lorsque l'image est codée */ -/* en reel a partir du TYPE_CODE */ -/*****************************************************************************/ sprintf(image1->COD_PIX,"%s",image1->TYPE_COD); - -/*............................................... - Pour chaque plan , decodage des caracteristiques du plans -..................................................................*/ - deb=image1->NOM_FIC_CAN; - for (ind=0;ind<nbplan;ind++) - { -/* Recuperation nom du plan */ - retour=fscanf(fic_in,"%s",label); - sprintf(deb,"%s",label); - sprintf(nom_fic_canal,"%s/%s",repert,label); - deb = deb+100; - -/* Verification de l'existence du plan et ouverture */ - num=open(nom_fic_canal,O_RDONLY|O_BINARY,0); - if (num!= -1) - { - image1->ACCES_CANAL_INT[ind]=num; - image1->POS_OCTET[ind]=0; - } - else - { - sprintf(CAI_ERREUR,"Impossible d'ouvrir le plan %s", - nom_fic_canal); - goto ERREUR; - } - } - - /*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in!=NULL) fclose(fic_in); - - -/* sortie nominale */ - return(image1); - -ERREUR: -/* sortie en erreur */ - FREE(image1); - return (NULL); -} -/* - Fin de l'operation cai_ouvre_lecture_radar -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_radar */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format radar et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_radar (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* typcode) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nb d'octets pixels */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* typcode (E) (char *) : type de codage de l'image */ -/* */ -/* cai_ouvre_creation_radar (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_creation_radar(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig, - char *typcode) - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - int retour,retour1; /* retour de fonction */ - int can,num; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - char *type_machine; /* ordre rangement octets machine de travail*/ - int ind_typ; /* Indice du type de codage radar */ - int is_Cplx; /* Indique si type complexe ou pas */ - int nboct; - char *pch0; - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } - -/* Vérification si typecode est un type radar si non par défaut mettre und */ - pch0=cai_En_majuscule( typcode ); - nboct = cai_istyp_radar(pch0,&ind_typ,&is_Cplx); - if (nboct == -1) - { - sprintf(typcode,"und"); - } -/*................................................. - Constitution du nom du fichier entete et verification qu'il - n'existe pas deja - .................................................*/ - - nom_fic[0]='\0'; - if ((long int)strlen(repert) == 0) - sprintf(repert,"./"); - -/* Recherche avec l'extension en majuscule */ - sprintf(nom_fic,"%s/%s.RAD",repert,nom_image); - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - unlink(nom_fic); - } - -/* Recherche avec l'extension en minuscule */ - sprintf(nom_fic,"%s/%s.rad",repert,nom_image); - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - unlink(nom_fic); - } - sprintf(image1->NOM_IMAGE,"%s/%s",repert,nom_image); - - -/*...................................................... - Ouverture du fichier entete en ecriture - Ecriture du contenu - ..........................................................*/ - fic = fopen(nom_fic,"w"); - if (fic == NULL) - { - sprintf(CAI_ERREUR,"Erreur: Creation fichier %s impossible\n",nom_fic); - goto ERREUR; - } - -/* Nombre de colonnes */ - retour=fprintf ( fic , "NBCOLONNES "); - retour1=fprintf ( fic , "%d\n" , *nb_col ); - if ((retour == 0)||(retour1 == 0)) - { - sprintf(CAI_ERREUR,"Erreur: Ecriture %s impossible\n",nom_fic); - goto ERREUR; - } -/* Nombre de lignes */ - retour=fprintf ( fic , "NBLIGNES "); - retour1=fprintf ( fic , "%d\n" , *nb_lig ); - if ((retour == 0)||(retour1 == 0)) - { - sprintf(CAI_ERREUR,"Erreur: Ecriture %s impossible\n",nom_fic); - goto ERREUR; - } - -/* Nombre de plans */ - retour=fprintf ( fic , "NBPLANS "); - retour1=fprintf ( fic , "%d\n" , *nb_can); - if ((retour == 0)||(retour1 == 0)) - { - sprintf(CAI_ERREUR,"Erreur: Ecriture %s impossible\n",nom_fic); - goto ERREUR; - } - -/* TYPE DE CODAGE */ - retour=fprintf ( fic , "TYPECODAGE "); - retour1=fprintf ( fic , "%s\n" , typcode ); - if ((retour == 0)||(retour1 == 1)) - { - sprintf(CAI_ERREUR,"Erreur: Ecriture %s impossible\n",nom_fic); - goto ERREUR; - } - /*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - type_machine = cai_test_pFpf(); - -/* TYPE DE CODAGE */ - retour=fprintf ( fic , "SENSCODAGE "); - - if (strcmp(type_machine,"BE")==0) - retour=fprintf ( fic , "IEEE\n"); - else - retour=fprintf ( fic , "INTEL\n"); - if (retour == 0) - { - sprintf(CAI_ERREUR,"Erreur: Ecriture %s impossible\n", - nom_fic); - goto ERREUR; - } - -/*............................................................... - Pour chaque canal de l'image,constitution du nom de fichier correspondant - Verification qu'il n'existe pas deja - Ouverture du fichier en ecriture - .................................................................*/ - pch0=cai_En_minuscule( typcode ); - - for (can=0;can<*nb_can;can++) - { - nom_fic[0]='\0'; - if (*nb_can==1) - sprintf(nom_fic,"%s/%s.%s",repert,nom_image,pch0); - else - sprintf(nom_fic,"%s/%s_%d.%s",repert,nom_image,can+1,pch0); - - retour = stat ( nom_fic , &buf_stat ); - - if ( retour == 0 ) - { - unlink(nom_fic); - } - num = open(nom_fic,O_RDWR|O_CREAT|O_BINARY,PERMS); - if (num == -1) - { - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n", - nom_fic); - goto ERREUR; - } - image1->ACCES_CANAL_INT[can]=num; - image1->POS_OCTET[can]=0; - if (*nb_can==1) - { - retour1=fprintf ( fic , "%s.%s\n" , nom_image,pch0); - snprintf(image1->NOM_FIC_CAN,100,"%s.%s",nom_image,pch0); - *(image1->NOM_FIC_CAN+99)='\0'; - } - else - { - retour1=fprintf ( fic , "%s_%d.%s\n" , nom_image,can+1,pch0); - snprintf(image1->NOM_FIC_CAN+can*100,100,"%s_%d.%s",nom_image,can+1,pch0); - *(image1->NOM_FIC_CAN+can*100+99)='\0'; - } - if (retour1 == 1) - { - sprintf(CAI_ERREUR,"Erreur: Ecriture %s impossible\n", - nom_fic); - goto ERREUR; - } - } - -/*************************************************/ -/* Fermeture du fichier */ -/*************************************************/ - - fclose ( fic ); - return (image1); - -ERREUR : - return(NULL); -} - -/* - Fin de l'operation cai_ouvre_creation_radar -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_radar */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image radar */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_radar(image1, canal, */ -/* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (lint): numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_radar (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_lecture_canal_radar(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) - -{ - - int num,i,j,k; /* variables de travail */ - long int pt_oct; /* position courante dans le fichier image */ - long int no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - long int lig; /* indice de boucle sur les lignes */ - long int oct_pix,octpix; /* nb octets par pixels */ - long int nb_oct; /* nb oct =1er octet a lire - position courante */ - long int oct_lig; /* nb oct. par ligne en considerant taille pixel */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - long int n; - int nbpix; -/*........................... - Initialisations diverses - ..........................*/ - - iret=CAI_OK; - num=(int)image1->ACCES_CANAL_INT[(*canal)-1]; - oct_pix=image1->NBOCT_PIX;; - oct_lig=oct_pix*(image1->NB_COL); - -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - buf_lec = (unsigned char *) calloc(oct_lig,sizeof(unsigned char)); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme allocation memoire"); - } - else - { -/*.................... - Initialisation - ......................*/ - lig=*premiere_ligne; - i=1; - pch=data_image; - /*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i <= (*nombre_lignes_lire))&&(iret==CAI_OK)) - { - -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - no_oct=image1->POS_OCTET[(*canal)-1]+((lig-1)*oct_lig); - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture d'une ligne image - ................................................*/ - n=read(num,buf_lec,oct_lig); - if (n<=0) - { - iret=CAI_KO; - sprintf(CAI_ERREUR,"Erreur lecture donnee image RADAR %s", - image1->NOM_IMAGE); - - } - else - { -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - deb=buf_lec+((*premiere_colonne)-1)*oct_pix; - j=1; - while (j <= (*nombre_colonnes_lire)) - { - for (k=0;k<oct_pix;k=k+1) - { - *(pch+k)=*(deb+k); - } - pch=pch+oct_pix; - j=j+1; - deb=deb+((*pas_colonne)*oct_pix); - } - - } - i=i+1; - lig=lig+(*pas_ligne); - - if ((image1->INV_OCTETS==1) && (oct_pix!=1)) - { - nbpix = (*nombre_lignes_lire)*(*nombre_colonnes_lire); - cai_inverser_tableau_complet(data_image,(int)nbpix,(int)oct_pix); - } - -/*****************************************************************************/ -/* MOD : VERSION : 1.2 : FA : IMA-FA-011 pb inversion des octets complexes */ -/*****************************************************************************/ - else if (image1->INV_OCTETS==2) - { - nbpix = (*nombre_lignes_lire)*(*nombre_colonnes_lire)*2; - octpix = oct_pix/2; - cai_inverser_tableau_complet(data_image,(int)nbpix,(int)octpix); - } - - } - free(buf_lec); - } - return(iret); - } -/* - Fin de l'operation cai_lecture_canal_radar -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_radar */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un plan d'une image radar */ -/* ----- */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_radar(image1, canal, */ -/* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_radar (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ecriture_canal_radar (CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) - -{ - - long int position_first_lig; /* position de la 1ere ligne a ecrire */ - long int position_courante; /* position courante dans le fichier */ - long int deplacement; /* deplacement a effectuer */ - int i_ligne; /* compteur de lignes */ - unsigned char *buff_lig; /* tableau contenant une ligne a ecrire */ - long int cr_write; /* code retour de write */ - int num; /* descripteur de fichier */ - int nboct_pix; /* nombre d'octets par pixel */ - int tot_pix; /* nb de pixels total a ecrire */ - -/* initialisations */ - -i_ligne = 0; -num = image1->ACCES_CANAL_INT[*canal-1]; -nboct_pix = image1->NBOCT_PIX; - -/*.......................................*/ -/* verification si ecriture image entiere */ -/*.......................................*/ - if ((*nombre_lignes_ecrire==image1->NB_LIG)&& - (*nombre_colonnes_ecrire==image1->NB_COL)) - { - tot_pix=nboct_pix*(image1->NB_COL)*(image1->NB_LIG); - - /* positionnement en debut de fichier */ - position_first_lig=lseek(num,0L,0); - - /* ecriture du canal complet */ - cr_write = write ( num , data_image,tot_pix); - if (cr_write != tot_pix) - { - sprintf(CAI_ERREUR,"Erreur ecriture donnee image RADAR %s", - image1->NOM_IMAGE); - - goto ERREUR; - } - } - else - { - -/********************************************************/ -/* Calcul de la position de la premiere ligne a ecrire */ -/********************************************************/ - -position_first_lig =(long int) ( image1->POS_OCTET[*canal-1]+ - (( *premiere_ligne - 1) * (*nombre_colonnes_ecrire) - * nboct_pix)); - - -/********************************************************/ -/* Recuperation de la position courante */ -/********************************************************/ - -position_courante = lseek ( num , 0L , 1 ); - - -/********************************************************/ -/* Deplacement jusqu'a la premiere ligne a ecrire */ -/********************************************************/ - -deplacement = position_first_lig - position_courante; -lseek ( num , deplacement , 1 ); - -/********************************************************/ -/* TANT QUE il y a des lignes a ecrire */ -/********************************************************/ -while (i_ligne < (*nombre_lignes_ecrire)) -{ - -/********************************************************/ -/* extraction de la ligne du tableau */ -/********************************************************/ - - buff_lig = data_image + (*nombre_colonnes_ecrire) * nboct_pix * i_ligne; - -/********************************************************/ -/* ecriture de la ligne */ -/********************************************************/ - - cr_write = write ( num , buff_lig , - (*nombre_colonnes_ecrire) * nboct_pix ); - if ( cr_write != (*nombre_colonnes_ecrire)*nboct_pix ) - { - sprintf( CAI_ERREUR , "Erreur ecriture canal image radar_cnes %s", - image1->NOM_IMAGE); - - goto ERREUR; - } - -/********************************************************/ -/* incrementation du nombre de lignes */ -/********************************************************/ - - i_ligne++; -/********************************************************/ -/* FIN TANT QUE */ -/********************************************************/ - } -} - - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} - -/* - Fin de l'operation cai_ecriture_canal_radar -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_radar */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format radar et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_radar(image1) */ -/* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_radar (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_radar (CAI_IMAGE *image1) - -{ - int iret; /* code retour de l'operation */ - int i_can; /* indice du canal a fermer */ - int num; /* descripteur du fichier a fermer */ - - iret=CAI_OK; -/*............................................. - Fermeture de tous les canaux - .............................................*/ - for (i_can=0;i_can<image1->NB_CANAUX;i_can=i_can+1) - { - - num=image1->ACCES_CANAL_INT[i_can]; - if (num>0) close(num); - } - - return (iret); -} - -/* - Fin de l'operation cai_ferme_radar -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_radar */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en radar et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_radar(repertoire,nom_ima) */ -/* ------------------ */ -/* repertoire (E) (char *) : repertoire de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_radar (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_dest_ima_radar ( char *repertoire , - char *nom_ima ) - -{ -int i_can; /* compteur de canaux */ -long int iret; /* code retour fonction fermeture lecture */ -char nom_fic[1024]; /* nom du fichier entete a detruire */ -long int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ - -CAI_IMAGE *image1; /* structure ouverture image */ -int nb_can; /* nombre de canaux de l'image */ -int nboct_pix; /* nombre d'octets par pixel image */ -int nb_col; /* nombre de colonnes de l'image */ -int nb_lig; /* nombre de lignes de l'image */ -char *pch; - - if ((long int)strlen(repertoire)!= 0) - sprintf(repertoire,"./"); - -/************************************************/ -/* Extraction des caracteristiques de l'image */ -/* du fichier entete par l'appel a la fonction */ -/* cai_ouvre_lecture_radar */ -/************************************************/ - - image1 = cai_ouvre_lecture_radar ( repertoire,nom_ima, &nb_can ,&nboct_pix , - &nb_col , &nb_lig ); - if ( image1 == NULL) goto ERREUR; - - image1->NB_CANAUX=nb_can; - image1->NB_COL=nb_col; - image1->NB_LIG=nb_lig; - image1->NBOCT_PIX=nboct_pix; - - -/************************************************/ -/* Constitution un a un des noms des fichiers */ -/* canaux et destruction */ -/************************************************/ -pch = image1->NOM_FIC_CAN; -for ( i_can = 0 ; i_can < nb_can ; i_can++ ) -{ - sprintf(nom_fic,"%s/%s",repertoire,pch); - cr_stat = stat ( nom_fic , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic ); - pch=pch+100; -} - - iret=cai_ferme_radar(image1); - -/************************************************/ -/* Destruction du fichier d'entete */ -/************************************************/ -sprintf(nom_fic ,"%s/%s.RAD", repertoire,nom_ima); -cr_stat = stat ( nom_fic , &buf_stat ); -if ( cr_stat == 0 ) - unlink ( nom_fic ); -else -{ - sprintf(nom_fic ,"%s/%s.rad", repertoire,nom_ima); - cr_stat = stat ( nom_fic , &buf_stat ); - if ( cr_stat == 0 ) - unlink ( nom_fic ); -} - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} -/* - Fin de l'operation cai_dest_ima_radar -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_radar */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture-ecriture d'une image au format */ -/* ----- radar et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_radar (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_radar (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_modifie_radar(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - - -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence*/ - char label[80]; /* contient un enregistrement du fichier */ - int nbplan; /* nombre de canaux dans le fichier en-tete */ - int retour; /* retour de la fonction comparaison chaines*/ - char *deb,*pch0; /* pointeurs sur chaine de caracteres */ - int ind,num; /* indice */ - int nboct; /* variables de travail */ - int ind_typ; /* Indice du type de codage radar */ - int is_Cplx; /* Indique si type complexe ou pas */ - char *type_machine; /* Type de codage de la machine */ - int cmp; /* variable de travail */ - - /*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - *nb_lig=0; - *nb_col=0; - *nboct_pix = 0; - pch0=NULL; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_modifie"); - goto ERREUR; - } -/*................................................. - Constitution du nom du fichier entete - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)== 0) - sprintf(repert,"./"); - sprintf(nom_fic,"%s/%s.rad",repert,nom_image); - sprintf(image1->NOM_IMAGE,"%s/%s",repert,nom_image); - - /*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=NULL; - fic_in=fopen(nom_fic,"rw"); - if (fic_in==NULL) - { -/* verification si extension en majuscule */ - nom_fic[0]='\0'; - sprintf(nom_fic,"%s/%s.RAD",repert,nom_image); - fic_in=fopen(nom_fic,"r"); - if (fic_in==NULL) - { - strcpy(CAI_ERREUR,"Erreur ouverture fichier entete RADAR-CNES"); - goto ERREUR; - } - } - /*.................................... - Decodage du nombre de colonnes - ............................................*/ - retour=fscanf(fic_in,"%s",label); - pch0=strstr(label,"NBCOLONNES"); - if (pch0==NULL) - { - sprintf(CAI_ERREUR,"Informations incoherentes NBCOLONNES dans %s", - nom_fic); - goto ERREUR; - } - retour=fscanf(fic_in,"%d",nb_col); - - - /*.................................... - Decodage du nombre de lignes - ............................................*/ - retour=fscanf(fic_in,"%s",label); - pch0=strstr(label,"NBLIGNES"); - if (pch0==NULL) - { - sprintf(CAI_ERREUR,"Informations incoherentes NBLIGNES dans %s", - nom_fic); - goto ERREUR; - } - retour=fscanf(fic_in,"%d",nb_lig); - - /*........................................ - Decodage du nombre de plans - .........................................*/ - retour=fscanf(fic_in,"%s",label); - pch0=strstr(label,"NBPLANS"); - if (pch0==NULL) - { - sprintf(CAI_ERREUR,"Informations incoherentes NBPLANS dans %s", - nom_fic); - goto ERREUR; - } - retour=fscanf(fic_in,"%d",&nbplan); - *nb_can=nbplan; - - /*........................................ - Recuperation du type de codage du plan .........................................*/ - retour=fscanf(fic_in,"%s",label); - pch0=strstr(label,"TYPECODAGE"); - if (pch0==NULL) - { - sprintf(CAI_ERREUR,"Informations incoherentes TYPECODAGE dans %s", - nom_fic); - goto ERREUR; - } - - retour=fscanf(fic_in,"%s",label); - pch0=cai_En_majuscule( label ); - -/* Verification si type de codage reconnu et recuperation de la taille pixel*/ - nboct = cai_istyp_radar(pch0,&ind_typ,&is_Cplx); - if (nboct == -1) - { - sprintf(CAI_ERREUR,"Type de codage du plan %s non reconnu ", - nom_fic_canal); - goto ERREUR; - } - *nboct_pix=nboct; - sprintf(image1->TYPE_COD,"%s",pch0); -/* ........................................................... - Determination du sens de codage de la machine de travail - .............................................................*/ - type_machine = cai_test_pFpf(); - -/*..................................................... - Recuperation du type de codage du plan (INTEL ou IEEE) .......................................................*/ - retour=fscanf(fic_in,"%s",label); - pch0=strstr(label,"SENSCODAGE"); - if (pch0==NULL) - { - sprintf(CAI_ERREUR,"Informations incoherentes SENSCODAGE dans %s", - nom_fic); - goto ERREUR; - } - - retour=fscanf(fic_in,"%s\n",label); - retour=strncmp(label,"IEEE",4); - if (retour==0) - sprintf(image1->COD_PIX,"BE"); - else - sprintf(image1->COD_PIX,"LE"); - cmp = strncmp(type_machine,image1->COD_PIX,2); - if (cmp!=0) - { -/*****************************************************************************/ -/* MOD : VERSION : 1.2 : FA : IMA-FA-011 pb inversion des octets complexes */ -/*****************************************************************************/ - if (is_Cplx==0) - image1->INV_OCTETS =1; - else - image1->INV_OCTETS =2; - } - else - { - image1->INV_OCTETS =0; - } -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : DM : Maj du tag COD_PIX lorsque l'image est codée */ -/* en reel a partir du TYPE_CODE */ -/*****************************************************************************/ sprintf(image1->COD_PIX,"%s",image1->TYPE_COD); - -/*............................................... - Pour chaque plan , decodage des caracteristiques du plans -..................................................................*/ - deb=image1->NOM_FIC_CAN; - for (ind=0;ind<nbplan;ind++) - { -/* Recuperation nom du plan */ - retour=fscanf(fic_in,"%s",label); - sprintf(deb,"%s",label); - sprintf(nom_fic_canal,"%s/%s",repert,label); - deb = deb+100; - -/* Verification de l'existence du plan et ouverture */ - num=open(nom_fic_canal,O_RDWR|O_BINARY,0); - if (num!= -1) - { - image1->ACCES_CANAL_INT[ind]=num; - image1->POS_OCTET[ind]=0; - } - else - { - sprintf(CAI_ERREUR,"Impossible d'ouvrir le plan %s", - nom_fic_canal); - goto ERREUR; - } - } - - /*.................................. - Fermeture du fichier - ......................................*/ - if (fic_in!=NULL) fclose(fic_in); - - -/* sortie nominale */ - return(image1); - -ERREUR: -/* sortie en erreur */ - FREE(image1); - return (NULL); -} - -/* - Fin de l'operation cai_ouvre_modifie_radar -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_istyp_radar */ -/* ---------- */ -/* */ -/* ROLE : fonction de verification si pixels de type radar ou non */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : retour = cai_istyp_radar(type_code) */ -/* ---------------- */ -/* */ -/* type_code (E) (char *) : type de codage a verifier */ -/* ind_typ (S) (int *) : indice du type des pixels */ -/* is_Cplx (S) (int *) : 1 si type complexe, 0 si non */ -/* retour (S) (int) : nb d'octets par pixel si type reconnu */ -/* -1 si non reconnu */ -/* */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -int cai_istyp_radar(char *type_code,int *ind_typ,int *is_Cplx ) -{ - int ind; /* indice de boucle sur les types reconnus */ - int trouve,icr; /* indice pour la recherche */ - -/* Initialisations diverses */ - trouve = 0; - ind = 0; - while ((trouve==0)&&(ind< CAI_NB_RADAR)) - { - icr=strncmp(type_code,CAI_RADAR_TYP[ind],strlen(type_code)); - if (icr==0) - trouve=1; - else - ind=ind+1; - } - - if (trouve ==1) - { - *ind_typ=ind; - ind=CAI_RADAR_LONG[ind]; - } - else - { - *ind_typ=-1; - ind=-1; - } - - if (type_code[0]=='C') - *is_Cplx=1; - else - *is_Cplx=0; - -/* sortie normale */ - return(ind); -} -/* - Fin de l'operation cai_istyp_radar -*/ diff --git a/Utilities/CAI/cai_dll/src/cai_rasterfile.c b/Utilities/CAI/cai_dll/src/cai_rasterfile.c deleted file mode 100755 index 15ebf31274..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_rasterfile.c +++ /dev/null @@ -1,1440 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_rasterfile.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format rasterfile */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : fevrier 1995 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 3.3 : DM :optimisation des acces */ -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 :FA:Verification que le nombre de canaux est 1 ou 3. */ -/* sunrasterfile est un format de restitution */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : modifications open binaire pour PC/NT */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : test sur fclose pour PC/LINUX */ -/*****************************************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA : == au lieu de = simple */ -/* image1->MODE == CAI_ECRITURE */ -/*****************************************************************************/ - - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <stdlib.h> -# include <unistd.h> -# include <sys/types.h> -#include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> - -#define _CAI_IMAGE -#define IN_CAI_RASTER - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_rasterfile.c,v 1.11 01/05/31 10:47:16 cmf Exp $"; - -extern char *getenv(); - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_sun_raster */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format rasterfile */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_sun_raster(repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees*/ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_sun_raster (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -long int cai_liste_ima_sun_raster (char *repert, - char ***tab_ima) - - -{ - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - struct dirent *dp; /* structure resultat de la fonction readdir */ - char *pch0,*pch1; /* pointeurs sur chaine de caracteres */ - char *pch2,*pch3; /* pointeurs sur chaine de caracteres */ - char car; /* variable de travail */ - int nb_ima; /* nombre d'images rasterfile identifiees */ - int i; /* indice de boucle */ - - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - - dirp=opendir(repert); - - if(dirp!=NULL) - { - -/*...................................... - premiere passe pour comptabiliser les images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE sun_raster_file - (EXTENSION =.srf) - ..........................................*/ - - - while((dp=readdir(dirp))!=NULL) - { - - car='.'; - pch0=strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='s'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='r'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - car='f'; - pch3=strrchr(dp->d_name,car); - if ((pch3 != NULL)&&(pch3==pch2+1)) - { - - *pch0=' '; - *pch1=' '; - *pch2=' '; - *pch3=' '; - nb_ima=nb_ima+1; - } - } - } - } - } - - (void)closedir(dirp); -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE RASTERFILE - (EXTENSION =.srf) - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - dirp=opendir(repert); - - nb_ima=0; - while((dp=readdir(dirp))!=NULL) - { - - car='.'; - pch0=strrchr(dp->d_name,car); - if (pch0 != NULL) - { - car='s'; - pch1=strrchr(dp->d_name,car); - if ((pch1 != NULL)&&(pch1==pch0+1)) - { - car='r'; - pch2=strrchr(dp->d_name,car); - if ((pch2 != NULL)&&(pch2==pch1+1)) - { - car='f'; - pch3=strrchr(dp->d_name,car); - if ((pch3 != NULL)&&(pch3==pch2+1)) - { - - *pch0=' '; - *pch1=' '; - *pch2=' '; - *pch3=' '; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - } - } - } - - (void)closedir(dirp); - - } - else - { - /* Erreur:Repertoire inexistant */ - nb_ima=-1; - } - - return(nb_ima); - -} -/* Fin de l'operation cai_liste_ima_sun_raster -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_sun_raster */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format rasterfile*/ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_sun_raster(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_sun_raster (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_lecture_sun_raster(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - int i,j,ind; /* indice */ - int ras_type; /* type de fichier raster */ - int fic; /* code retour fonction open */ - unsigned char *colormap; /* tableau de colormap */ - unsigned char *pch; - int taille; - long li; - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - iret=1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_lecture"); - } - else - { -/*................................................. - Constitution du nom du fichier SUN_RASTER srf - .................................................*/ - nom_fic[0]='\0'; - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.srf",repert,nom_image); - - } - else - { - sprintf(nom_fic,"%s.srf",nom_image); - } -/*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=fopen(nom_fic,"rb"); - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier sun_raster"); - } - else - { -/*.................................... - positionnement sur le nombre de colonnes */ - fseek(fic_in,4,0); - -/* recuperation du nombre de colonnes -............................................*/ - - li=fread(nb_col,4,1,fic_in); - - /*.................................... - recuperation du nombre de lignes -............................................*/ - - fread(nb_lig,4,1,fic_in); - -/*...................................... - recuperation du nombre de canaux -............................................*/ - fread(nb_can,4,1,fic_in); - if ((*nb_can!=8)&&(*nb_can!=24)) - { - iret=0; - strcpy(CAI_ERREUR,"Profondeur encodage ni 8 ni 24. Format non traite"); - } - else - { - - *nb_can=(*nb_can)/8; -/*......................................... - recuperation du type de fichier - ............................................*/ - - fseek(fic_in,4,1); - fread(&ras_type,4,1,fic_in); - if (ras_type!=1) - { - iret=0; - strcpy(CAI_ERREUR,"Type de fichier non standard.Non traite"); - } - else - { -/*......................................... - recuperation du nombre d'octets de colormap - ............................................*/ - fseek(fic_in,4,1); - fread(nboct_pix,4,1,fic_in); - image1->COLORMAP=*nboct_pix; - if (image1->COLORMAP != 0) - { -/*..................................................... - lecture de la colormap si elle existe - ......................................................*/ - colormap = (unsigned char *) malloc(image1->COLORMAP); - image1->TABCOLOR = (int *)malloc(sizeof(int)*768); - if (image1->TABCOLOR == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme d'allocation memoire"); - } - - if (colormap == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme d'allocation memoire"); - } - else - { - li=fread(colormap,image1->COLORMAP,1,fic_in); - pch=colormap; - taille=(image1->COLORMAP/3); -/* -------------- recuperation pour chaque couleur R V B ----*/ - for(j=0;j<3;j++) - { - for (i=0;i<taille;i++) - { - ind=i+(j*256); - image1->TABCOLOR[ind]=(int)(*pch); - pch=pch+1; - } - for (i=taille;i<256;i++) - { - ind=i+(j*256); - image1->TABCOLOR[ind]=0; - - } - } - free(colormap); - } - } -/*......................................... - recuperation du nombre d'octets par pixel - .................................................*/ - *nboct_pix=1; - image1->NB_BITS_PIX=1; - sprintf(image1->COD_PIX,"OCT"); - - } - } - } - - if (fic_in!=NULL) fclose(fic_in); -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - fic=NULL; - fic=open(nom_fic,O_RDONLY|O_BINARY,0); - if (fic == -1) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier sun_raster"); - } - else - { - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - for (i=0;i<*nb_can;i=i+1) - { - sprintf(deb,"%s.srf",nom_image); - deb=deb+100; - sprintf(deb1,"%s.srf",nom_image); - deb1=deb1+100; - image1->POS_OCTET[i]=32+image1->COLORMAP; - image1->ACCES_CANAL_INT[i]=fic; - } - - } - } - if (iret == 0) - return (NULL); - else - return(image1); - -} -/* - Fin de l'operation cai_ouvre_lecture_sun_raster -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_sun_raster */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format rasterfile et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_sun_raster(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_sun_raster (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -#define RAS_MAGIC 0x59a66a95 - - -CAI_IMAGE *cai_ouvre_creation_sun_raster(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig, - char *label) - -{ - FILE *fic; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - long retour; /* retour de fonction */ - int i,num; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - unsigned char *buff; /* pointeur sur buffer fichier */ - int taille; /* taille du fichier en octets */ - int ras_depth; /* profondeur d'encodage du pixel 8 ou 24 */ - int ras_magic; /* nombre magique raster file */ - int ras_length; /* nb octets total de l'image */ - int ras_type; /* type de fichier 1=sun raster standard */ - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } - - -/*************************************************/ -/* Les donnees doivent etre codees sur 8 bits */ -/*************************************************/ - - if ( *nboct_pix != 1 ) - { - strcpy ( CAI_ERREUR , - "Erreur : les donnees doivent etre codees sur 8 bits\n"); - goto ERREUR; - } -/*****************************************************************************/ -/* MOD : VERSION : 4.2 :FA:Verification que le nombre de canaux est 1 ou 3. */ -/* sunrasterfile est un format de restitution */ -/*****************************************************************************/ -/* Verification sur le nombre de canaux 1(noir&blanc) ou 3 (RVB) */ - if ((*nb_can !=1)&&(*nb_can !=3)) - { - strcpy(CAI_ERREUR,"Erreur une image RASTERFILE a 1 ou 3 canaux exclusivement"); - goto ERREUR; - } - -/*................................................. - Constitution du nom du fichier entete et verification qu'il - n'existe pas deja . - .................................................*/ - - nom_fic[0]='\0'; - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.srf",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.srf",nom_image); - } - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s SUN_RASTER existe \n" , nom_image ); - goto ERREUR; - } - -/*************************************************/ -/* creation du fichier et reservation de la */ -/* place necessaire a l'ecriture de l'entete */ -/*************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : modifications fopen binaire pour PC/NT */ -/*****************************************************************************/ - - fic = fopen ( nom_fic, "wb" ); - if ( nom_fic == NULL ) - { - sprintf ( CAI_ERREUR , "Erreur : creation fichier %s impossible\n" , - nom_fic ); - goto ERREUR; - } - - taille=32 ; - - buff = (unsigned char *) malloc (taille); - if ( buff== NULL ) - { - strcpy ( CAI_ERREUR , "Erreur : probleme d'allocation \n" ); - unlink(nom_fic); - goto ERREUR; - } - - ras_length=(*nb_lig)*(*nb_col)*(*nb_can); - if ((*nb_col)%2!=0) - ras_length=ras_length+(*nb_lig); - ras_magic=RAS_MAGIC; - ras_depth=(*nb_can)*8; - ras_type=1; - memcpy ( &buff[0] , &ras_magic , 4); - memcpy ( &buff[4] , nb_col , 4 ); - memcpy ( &buff[8] , nb_lig , 4 ); - memcpy ( &buff[12] , &ras_depth , 4 ); - memcpy ( &buff[16] , &ras_length, 4 ); - memcpy ( &buff[20] , &ras_type, 4 ); - - - for ( i = 24 ; i < taille ; i++ ) - { - buff[i] = 0; - } - - retour= fwrite ( buff , taille , 1 , fic ); - if ( retour == 0 ) - { - sprintf (CAI_ERREUR , "Erreur : ecriture impossible dans fichier %s\n", - nom_fic ); - goto ERREUR; - } - - - - free ( buff ); - if (fic!=NULL) fclose(fic); - -/*................................................. - Ouverture du fichier pour ecriture radiometrie - ...................................................*/ - num = open(nom_fic,O_RDWR|O_BINARY,0); - if (num == -1) - { - sprintf(CAI_ERREUR,"Erreur: Creation %s impossible\n",nom_fic); - goto ERREUR; - } - for (i=0;i<*nb_can;i=i+1) - { - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=32; - } - - return (image1); - -ERREUR : - return(NULL); -} - -/* - Fin de l'operation cai_ouvre_creation_sun_raster -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_sun_raster */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image rasterfile */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_sun_raster(image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne , */ -/* pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_sun_raster (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_lecture_canal_sun_raster( CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) -{ - int num,i,j,k; /* variables de travail */ - long pt_oct,n; /* position courante dans le fichier image */ - int no_oct; /* numero du premier octet a lire */ - int iret; /* indicateur d'erreur */ - int lig; /* indice de boucle sur les lignes */ - int oct_pix; /* nb octets par pixels */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - int Arrond; /* pixels rajoutes pour arrondi 2 octets */ - - -/*........................... - Initialisations diverses - ..........................*/ - iret=CAI_OK; - strcpy(CAI_ERREUR," "); - lig=*premiere_ligne; - i=1; - pch=data_image; - num = image1->ACCES_CANAL_INT[*canal-1]; - oct_pix = image1->NBOCT_PIX; - -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - - buf_lec = (unsigned char *) malloc(image1->NB_COL*oct_pix*image1->NB_CANAUX); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme d'allocation memoire"); - } - else - { -/*..................... - Pour chaque ligne a lire - .......................................*/ - while ((i <= *nombre_lignes_lire)&&(iret==CAI_OK)) - { -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct=lseek(num,0L,1); - -/*................................ - Calcul du numero du 1er octet a lire - ....................................*/ - if ( image1->NB_COL%2 == 0 ) - Arrond=0; - else - Arrond=(lig-1); - no_oct= image1->POS_OCTET[*canal-1] + Arrond + - (lig-1)*(image1->NB_COL)*(oct_pix)*(image1->NB_CANAUX); - - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(num,nb_oct,1); - -/*........................................... - lecture d'une ligne image - ................................................*/ - n=read(num,buf_lec,(image1->NB_COL)*(oct_pix)*(image1->NB_CANAUX)); - - if (n<=0) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Erreur lecture donnee image sun_raster"); - } - else - { -/*...................................... - Sauvegarde des donnees lues en tenant compte du pas - d'echantillonnage en colonne - ........................................*/ - - deb=buf_lec+(((*premiere_colonne)-1)*(oct_pix)*(image1->NB_CANAUX))+ - (image1->NB_CANAUX-(*canal)); - j=1; - while (j <= *nombre_colonnes_lire) - { - for(k=0;k<oct_pix;k++) - { - *(pch+k)=*(deb+k); - } - j=j+1; - pch=pch+oct_pix; - deb=deb+((*pas_colonne)*(oct_pix)*(image1->NB_CANAUX)); - } - - } - i=i+1; - lig=lig+(*pas_ligne); - - } - - free(buf_lec); - } - - return(iret); -} -/* - Fin de l'operation cai_lecture_canal_sun_raster -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_sun_raster */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image rasterfile */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_sun_raster(image1, canal, */ /* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_sun_raster (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ecriture_canal_sun_raster (CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) -{ -long position_first_lig; /* position de la 1ere ligne a ecrire */ -long position_courante; /* position courante dans le fichie */ -long deplacement; /* deplacement a effectuer */ -int i_ligne; /* compteur de lignes */ -unsigned char *buff_lig; /* tableau contenant une ligne a ecrire */ -long cr_write; /* code retour de write */ -int num; /* descripteur de fichier */ -int nboct_pix; /* nombre d'octets par pixel */ -int i,j; /* indice de boucle sur les colonnes */ -long cr_read; /* code retour de la fonction read */ -int nb; /* nombre d'octets lus par le read */ -unsigned char *deb,*pch; /* pointeur sur chaine pour transfert */ -int nb_canaux; /* nombre de canaux de l'image */ -int Arrond; /* arrondi pour les lignes non paires */ - -/* ................ - Initialisations - .................*/ -i_ligne = 0; -num = image1->ACCES_CANAL_INT[(*canal)-1]; -nboct_pix = image1->NBOCT_PIX; -nb_canaux = image1->NB_CANAUX; - -/*************************************************/ -/* Les donnees doivent etre codees sur 8 bits */ -/*************************************************/ - -if ( nboct_pix != 1 ) -{ - strcpy ( CAI_ERREUR , - "Erreur : les donnees doivent etre codees sur 8 bits\n"); - goto ERREUR; -} - - -/********************************************************/ -/* Calcul de la position de la premiere ligne a ecrire */ -/********************************************************/ -Arrond=0; -if (*nombre_colonnes_ecrire%2 !=0) - Arrond=((*premiere_ligne) - 1); -position_first_lig = (long) ( image1->POS_OCTET[*canal-1] + Arrond + - ((*premiere_ligne) - 1) *(*nombre_colonnes_ecrire)*nb_canaux ); -/********************************************************/ -/* Recuperation de la position courante */ -/********************************************************/ - -position_courante = lseek ( num , 0L , 1 ); - - -/************************************************************************/ -/* Deplacement jusqu'au premier pixel de la premiere ligne a ecrire */ -/************************************************************************/ - -deplacement = position_first_lig - position_courante; -lseek ( num , deplacement , 1 ); -nb=(*nombre_colonnes_ecrire)*nb_canaux; -if (*nombre_colonnes_ecrire%2 !=0) - nb=nb+1; -buff_lig=(unsigned char *)(calloc(nb,sizeof(unsigned char))); -if (buff_lig == NULL) -{ - strcpy(CAI_ERREUR,"Probleme d'allocation memoire ecriture"); - goto ERREUR; - } - -pch=data_image; - -/********************************************************/ -/* TANT QUE il y a des lignes a ecrire */ -/********************************************************/ -while (i_ligne < (*nombre_lignes_ecrire)) -{ - -cr_read=read(num,buff_lig,nb); -if (cr_read <0) - { - strcpy ( CAI_ERREUR , "Erreur ecriture canal image sun_raster\n" ); - goto ERREUR; - } -else - { - if (cr_read==0) - { - for (i=0;i<nb;i++) - *(buff_lig+i)=0; - deplacement=0; - } - else - deplacement= - nb; - } -/************************************************************************/ -/* Redeplacement jusqu'au premier pixel de la premiere ligne a ecrire */ -/************************************************************************/ -lseek ( num , deplacement , 1 ); - -/*************************************************************************/ -/*chargement de la ligne en entrelacant les pixels par rapport aux canaux*/ -/*************************************************************************/ - -deb=buff_lig+(nb_canaux-(*canal)); -for (j=0;j<(*nombre_colonnes_ecrire);j=j+1) -{ - *deb=*pch; - pch=pch+1; - deb=deb+nb_canaux; -} - -/********************************************************/ -/* ecriture de la ligne */ -/********************************************************/ - - cr_write = write ( num , buff_lig , nb ); - - if ( cr_write != nb ) - { - strcpy ( CAI_ERREUR , "Erreur ecriture canal image sun_raster\n" ); - goto ERREUR; - } -/********************************************************/ -/* incrementation du nombre de lignes */ -/********************************************************/ - - i_ligne++; - -/********************************************************/ -/* FIN TANT QUE */ -/********************************************************/ -} -free(buff_lig); - -return (CAI_OK); - -ERREUR : - -return (CAI_KO); - - -} - -/* - Fin de l'operation cai_ecriture_canal_sun_raster -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_sun_raster */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format rasterfile et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_sun_raster(image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_sun_raster (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_ferme_sun_raster (CAI_IMAGE *image1) - - -{ - long iret; /* code retour de l'operation */ - int num; /* descripteur du fichier a fermer */ - unsigned char *colormap; /* tableau de colormap */ - unsigned char *pch; /* pointeur de travail */ - int i; /* indice de boucle */ - long int pos_cour,li; /* position courante */ - long int deplacement; /* deplacement a effectuer */ - unsigned char *buf; /* buffer de lecture de l'image */ - int taille; /* taille totale de l'image (oct) */ - int val; /* variable intermediaire */ - - - iret=CAI_OK; - num=image1->ACCES_CANAL_INT[0]; - -/*............................................. - Traitement de la Colormap si ecriture - .............................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA : == au lieu de = simple */ -/* image1->MODE == CAI_ECRITURE */ -/*****************************************************************************/ - - if ((image1->COLORMAP !=0) && (image1->MODE == CAI_ECRITURE)) - { -/*--- recuperation de la position courante ---*/ - pos_cour=lseek(num,0L,1); - -/*-- on se positionne sur le debut de la radiometrie --*/ - deplacement = 32 - pos_cour; - lseek(num,deplacement,1); - -/*--- lecture de l'image rasterfile ---*/ - taille = image1->NB_LIG*image1->NB_COL*image1->NB_CANAUX; - buf = (unsigned char *)malloc(taille); - li=read(num,buf,taille); - -/*--- recuperation de la position courante ---*/ - pos_cour=lseek(num,0L,1); - -/*-- on se positionne sur le debut des caracteristiques COLORMAP --*/ - deplacement = 24 - pos_cour; - lseek(num,deplacement,1); - -/*-- positionnement de l'indicateur de presence colormap --*/ - val=1; - li=write(num,(char *)(&val),4); - -/*-- positionnement de la taille de la colormap --*/ - val=image1->COLORMAP; - li=write(num,(char *)(&val),4); - -/*--- recuperation de la Colormap ---*/ - colormap = (unsigned char *) malloc(image1->COLORMAP); - pch=colormap; - for (i=0;i<image1->COLORMAP;i++) - { - *pch = (unsigned char )(image1->TABCOLOR[i]); - pch=pch+1; - } - -/*--- ecriture des octets de colormap dans l'image ---*/ - iret=write(num,colormap,image1->COLORMAP); - if (iret != image1->COLORMAP) - { - strcpy(CAI_ERREUR,"Erreur ecriture Colormap rasterfile "); - iret=CAI_KO; - } - else - { -/*--- ecriture de l'image ---*/ - iret=write(num,buf,taille); - } - free(buf); - free(colormap); - - - } - -/*............................................. - Fermeture de tous les canaux qui sont tous contenus - dans un seul fichier .srf - .............................................*/ - - if (num>0) close(num); - - return (iret); -} - -/* - Fin de l'operation cai_ferme_sun_raster -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_sun_raster */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en rasterfile et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_sun_raster(format,nom_ima) */ /* ------------------ */ -/* format (E) (char *) : format de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_sun_raster (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK_KO si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_dest_ima_sun_raster (char * repertoire , - char *nom_ima ) - -{ - -char nom_fic[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ -int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ - - -/************************************************/ -/* Constitution du nom du fichier d'entete */ -/************************************************/ -if ((long)strlen(repertoire)!= 0) -{ - sprintf ( nom_ima_complet, "%s/%s",repertoire,nom_ima ); -} -else -{ - strcpy ( nom_ima_complet , nom_ima); -} -sprintf ( nom_fic , "%s.srf" ,nom_ima_complet); - -/************************************************/ -/* Destruction du fichier sun_raster */ -/************************************************/ - -cr_stat = stat ( nom_fic , &buf_stat ); -if ( cr_stat == 0 ) - unlink ( nom_fic ); - - -return (CAI_OK); - - -} -/* - Fin de l'operation cai_dest_ima_sun_raster -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_sun_raster */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture-ecriture d'une image au format */ -/* ----- rasterfile et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_sun_raster(nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_sun_raster (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_modifie_sun_raster(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ - FILE *fic_in; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - int i,j,ind; /* indice */ - int ras_type; /* type de fichier raster */ - int fic; /* code retour fonction open */ - unsigned char *colormap; /* tableau de colormap */ - unsigned char *pch; - int taille; - long li; - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - iret=1; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION : 4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_modifie"); - } - else - { -/*................................................. - Constitution du nom du fichier SUN_RASTER srf - .................................................*/ - nom_fic[0]='\0'; - if((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.srf",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.srf",nom_image); - } -/*........................ - Ouverture du fichier entete - ..........................................*/ - fic_in=fopen(nom_fic,"rb"); - if (fic_in==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier sun_raster"); - } - else - { -/*.................................... - positionnement sur le nombre de colonnes */ - fseek(fic_in,4,0); - -/* recuperation du nombre de colonnes -............................................*/ - - li=fread(nb_col,4,1,fic_in); - - /*.................................... - recuperation du nombre de lignes -............................................*/ - - fread(nb_lig,4,1,fic_in); - -/*...................................... - recuperation du nombre de canaux -............................................*/ - fread(nb_can,4,1,fic_in); - if ((*nb_can!=8)&&(*nb_can!=24)) - { - iret=0; - strcpy(CAI_ERREUR,"Profondeur encodage ni 8 ni 24. Format non traite"); - } - else - { - - *nb_can=(*nb_can)/8; -/*......................................... - recuperation du type de fichier - ............................................*/ - - fseek(fic_in,4,1); - fread(&ras_type,4,1,fic_in); - if (ras_type!=1) - { - iret=0; - strcpy(CAI_ERREUR,"Type de fichier non standard.Non traite"); - } - else - { -/*......................................... - recuperation du nombre d'octets de colormap - ............................................*/ - fseek(fic_in,4,1); - fread(nboct_pix,4,1,fic_in); - image1->COLORMAP=*nboct_pix; - if (image1->COLORMAP != 0) - { -/*..................................................... - lecture de la colormap si elle existe - ......................................................*/ - colormap = (unsigned char *) malloc(image1->COLORMAP); - image1->TABCOLOR = (int *)malloc(sizeof(int)*768); - if (image1->TABCOLOR == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme d'allocation memoire"); - } - - if (colormap == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme d'allocation memoire"); - } - else - { - li=fread(colormap,image1->COLORMAP,1,fic_in); - pch=colormap; - taille=(image1->COLORMAP/3); -/* -------------- recuperation pour chaque couleur R V B ----*/ - for(j=0;j<3;j++) - { - for (i=0;i<taille;i++) - { - ind=i+(j*256); - image1->TABCOLOR[ind]=(int)(*pch); - pch=pch+1; - } - for (i=taille;i<256;i++) - { - ind=i+(j*256); - image1->TABCOLOR[ind]=0; - - } - } - free(colormap); - } - } -/*......................................... - recuperation du nombre d'octets par pixel - .................................................*/ - *nboct_pix=1; - image1->NB_BITS_PIX=1; - sprintf(image1->COD_PIX,"OCT"); - } - } - } - - if (fic_in!=NULL) fclose(fic_in); -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - fic=open(nom_fic,O_RDWR|O_BINARY,0); - if (fic == -1) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier sun_raster"); - } - else - { - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - for (i=0;i<*nb_can;i=i+1) - { - sprintf(deb,"%s.srf",nom_image); - deb=deb+100; - sprintf(deb1,"%s.srf",nom_image); - deb1=deb1+100; - image1->POS_OCTET[i]=32+image1->COLORMAP; - image1->ACCES_CANAL_INT[i]=fic; - } - - } - } - if (iret == 0) - return (NULL); - else - return(image1); - -}/* - Fin de l'operation cai_ouvre_modifie_sun_raster -*/ diff --git a/Utilities/CAI/cai_dll/src/cai_spot.c b/Utilities/CAI/cai_dll/src/cai_spot.c deleted file mode 100755 index ce687ed637..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_spot.c +++ /dev/null @@ -1,22134 +0,0 @@ -/*****************************************************************************/ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_spot.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format spot */ -/* */ -/* AUTEUR : (CS-SI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : Octobre 2000 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 4.4 : DM : prise en compte ecriture SPOT5 TIF et BIL */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : test sur fclose pour PC/LINUX */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : initialisation de image1=NULL a l'ouverture */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : anomalie sur sous-echantillonnage en lecture */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : erreur d'orthographe sur LATITUDE_ARGUMENT */ -/* et Look_Angles */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : erreur d'ecriture detector_id lookangle pour */ -/* PAN */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : erreur conversion jour julien dans CAI */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : Initialisation du champ COD_PIX (OCT,I2 ou UND)*/ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : erreur d'ecriture detector_id lookangle pour */ -/* PAN */ -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : FA : indice ind_tab_gain non initialise dans boucle */ -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : FA : correction anomalie ecriture SOURCE_ID */ -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : FA : pas d'ecriture <badlines> si pas de badlines */ -/*****************************************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : FA : erreur calcul de la datation des attitudes */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : FA : erreur initialisation BYTEORDER en creation */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : FA : mot cle lignes perdues LOST au lieu de LOSS */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : LEAD_XX.dat devient METADATA.DIM */ -/* IMAG_XX.bil (tif) devient IMAGERY.BIL (.TIF) */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : FA : Prise en compte date de la scene non shiftée */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'attribut href="" */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'attribut version="5.2" */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element PIXEL_ORIGIN */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element TIE_POINTS_CRS_Z */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Deplacement de Simplified_Location_Model */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element lc_List */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element pc_List */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout attribut href="http://www.spotimage.fr" */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element DATA_TYPE */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : remplacement de SATURATE par SATURATED */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : remplacement 255 par 1 dans les element LEVEL */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : remplacement de BAND par BAND_DESCRIPTION */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : ajout de l'unite dans PHYSICAL_UNIT */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element Bad_Line_List */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ds les dates, utilisation du . au lieu de , */ -/* Separation de la date et heure par "T" */ -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element Look_Angles_List */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element Angles_List */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element Angular_Speeds_List */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element Instrument_look_Angles_List */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : FA : SPECIAL_VALUE_TEXT NODATA a la place NO_DATA */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Version DIMAP passe de 2.0 à 2.9 */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Rajouter ALPHA_LEVEL unqiement pour SPOT4 MIR */ -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Rajout SCENE au début de chaine DATASET_NAME */ -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Enlever le signe + pour FRAME_ROW, FRAME_COL */ -/* et pour TIE_POINTS_DATA_X et TIE_POINTS_DATA_Y */ -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Blindage de la reconnaissance du fichier image */ -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : DM : Remplacer les appels systemes pour renommer un */ -/* fichier par la commande C rename */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA : DIMAP Ajouter un espace entre SCENE et numsat */ -/* dans le DATASET_NAME */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA : DIMAP dans le DATASET_FRAME, inversion des deux*/ -/* derniers vertex : à mettre dans l'ordre */ -/* NO,NE,SE,SO */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : DIMAP remplissage des tags HORIZONTAL_CS_CODE */ -/* et HORIZONTAL_CS_NAME avec des valeurs défauts */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : DIMAP tag LOOK_ANGLE_LIST valeurs de PSI_X et */ -/* PSI_Y 1er et dernier detecteur inverses */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : Prise en compte de la lecture sur systeme LE */ -/* pour inversion des octets SPOT1A4 */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA : Correction sprintf(nom_fic,"IMAGERY") au lieu */ -/* de sprintf(nom_fic,"IMAGERY",nom_rep) */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA : Correction de */ -/* sprintf(valeur,"%d", (ind_tab_gain+1+1500*i)) au lieu de */ -/* sprintf(valeur,"%f", (ind_tab_gain+1+1500*i)) */ -/*****************************************************************************/ -/* MOD : VERSION : 5.3 : DM : portage de la couche CAI dans plateforme */ -/* Microsof Visual C++ V6.0 */ -/*****************************************************************************/ - - - - -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# ifndef _MSC_VER -# include <strings.h> -# endif -#include <stdlib.h> -# include <sys/types.h> -# include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> -# include <malloc.h> -# include <math.h> -# include <unistd.h> -# include <limits.h> -#include <ctype.h> -#include <errno.h> -#include <time.h> - -#define _CAI_IMAGE -#define IN_CAI_SPOT - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Definition des CONSTANTES PROPRES */ -/*----------------------------------------------------------------------------*/ - -#define FREE(A) { if ((A)!=NULL) { free(A); (A)=NULL; } } -#define NOMBRE_DE_BITS "NBITS" -#define NOMBRE_DE_LIGNES "NROWS" -#define NOMBRE_DE_COLONNES "NCOLS" -#define NOMBRE_DE_CANAUX "NBANDS" -#define ORDRE_LECTURE_OCTETS "BYTEORDER" -#define NB_OCTETS_A_SAUTER "SKIPBYTES" -#define NB_SEC_PAR_JOUR 86400 -#define NB_MIN_PAR_JOUR 1440 -#define NB_HEURE_PAR_JOUR 24 -#define NB_JOURS_AN_BISSEX 366 -#define NB_JOURS_AN_NON_BISSEX 365 -#define NB_CENTIEME_PAR_JOUR 8640000 -#define ANNEE_DEBUT_JULIEN 1950 -#define PI 3.141592653589 - -/*----------------------------------------------------------------------------*/ -/* Declaration des OPERATION INTERNES (static) */ -/*----------------------------------------------------------------------------*/ - -static void cai_DMS_To_Float ( char DegMinSec [17] , double *Degre ); -static CAI_OK_KO cai_WriteElementXML ( FILE *desc , char *motCle , - char *valeur ); -static CAI_OK_KO cai_WriteOpenTagXML ( FILE *des , char *TagName ); -static CAI_OK_KO cai_WriteCloseTagXML ( FILE *des , char *TagName ); -static CAI_OK_KO cai_WriteNulTagXML ( FILE *des , char *TagName ); -static CAI_OK_KO cai_WriteEnteteXML ( FILE *des ); -static CAI_OK_KO cai_WriteElementXMLWithAttribute ( FILE *desc , - char *motCle , - char *valeur, - char *attribut, - char *valat , - int type); - -static void cai_JulToGreg ( long nbjours , double nbsec , char* dategreg ); -static double cai_DegreeToRadian ( double angle_degree ); -static int cai_addtime ( char ret[26] , char temps[18] , double milisec ); -static int cai_recup_nom_spot(char typspot,char * str_repertoire , - char * str_debut , - char **str_fichier ); -static CAI_OK_KO cai_lire_dimensions_spot5 ( char *fich_xml , int *nbcan , - int *nboct , int *nbcol , - int *nblig , char *byteorder , - int *skipbytes ); -static CAI_IMAGE *cai_ouvre_creation_spot1a4(char *repert, - char *nom_image, - int *nbca, - int *nboct_pix, - int *nbcol, - int *nblig, - char *label); -static CAI_IMAGE *cai_ouvre_creation_spot5TIF(char *repert, - char *nom_image, - int *nbca, - int *nboct_pix, - int *nbcol, - int *nblig, - char *label); -static CAI_IMAGE *cai_ouvre_creation_spot5BIL(char *repert, - char *nom_image, - int *nbca, - int *nboct_pix, - int *nbcol, - int *nblig, - char *label); -static char* cai_spot5_gettoken ( FILE *MyFile ); - -/*----------------------------------------------------------------------------*/ -/* Variables globales */ -/*----------------------------------------------------------------------------*/ - -char *type_machine; /* ordre rangement octets machine de travail */ -static char Command[1024]; /* commande envoye au shell */ - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ - -static char *rcs_id="$Header: cai_spot.c,v 1.3 01/05/31 10:47:53 cmf Exp $"; - - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_spot */ -/* ---------- */ -/* */ -/* ROLE : fonction de determination des images au format spot */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_spot(typspot,repert,tab_ima) */ -/* ----------------- */ -/* */ -/* typspot (E) (char) : type spot (1=1a4,b=5bil ou t=5tif) */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees */ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_spot (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -long int cai_liste_ima_spot (char typspot, char *repert, - char ***tab_ima) - - { - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - struct dirent *dp; /* structure resultat de la fonction readdir */ - struct stat buf_stat; /* structure contenant resultat stat */ - char *nom_entete_spot; /* nom fichier entete image SPOT */ - char *nom_trailer_spot; /* nom fichier trailer image SPOT */ - char *nom_fic_spot; /* nom fichier image SPOT */ - char *nom_vol_spot; /* nom fichier pour volume repertoire image SPOT */ - char *nom_NULL_spot; /* nom fichier volume NULL repertoire image SPOT */ - int nb_ima; /* nombre d'images lum identifiees */ - - int cr,i; /* compte rendu appel fonction */ - int v1,v2; /* comparaison nom repertoire avec . et .. */ - char path_rep[PATH_MAX]; /* chemin acces fichiers ds repertoire courant */ - -/*........................................ - INITIALISATION et ouverture du repertoire courant choisi - .........................................*/ - - nb_ima=0; - - dirp=opendir(repert); - - if(dirp!=NULL) - { -/*...................................... - - premiere passe pour comptabiliser les images du format donne - - POUR CHAQUE REPERTOIRE DU REPERTOIRE COURANT, - TEST POUR SAVOIR SI CE REPERTOIRE CONTIENT - TOUS LES FICHIER PROPRES AU FORMAT SPOT - ..........................................*/ - - while( (dp=readdir(dirp))!=NULL ) - { - - /********************************************/ - /* on ne doit pas tenir compte des . et .. */ - /* sous le repertoire courant */ - /*******************************************/ - - v1 = strcmp(dp->d_name, "."); - v2 = strcmp(dp->d_name, ".."); - - if ( (v1 != 0) && (v2 != 0) ) - { - sprintf(path_rep, "%s/%s", repert, dp->d_name); - - /*--------------------------------*/ - /*test sur exitence du repertoire */ - /*--------------------------------*/ - - cr = stat(path_rep,&buf_stat); - - if ( (cr!=-1) && ((buf_stat.st_mode&S_IFMT) == S_IFDIR) ) - { - /* verification existence des fichiers propres au format SPOT 1 a 4*/ - if (typspot == '1') - { - if ( - (cai_recup_nom_spot(typspot,path_rep,"lea",&nom_entete_spot) == 0) && - (cai_recup_nom_spot(typspot,path_rep,"tra",&nom_trailer_spot) == 0) && - (cai_recup_nom_spot(typspot,path_rep,"ima",&nom_fic_spot) == 0) && - (cai_recup_nom_spot(typspot,path_rep,"vol",&nom_vol_spot) == 0) && - ( cai_recup_nom_spot(typspot,path_rep,"NUL",&nom_NULL_spot) == 0) ) - { - /*image SPOT1 4*/ - nb_ima=nb_ima+1; - } - } - else if (typspot == 'B') - { - /* verification existence des fichiers propres au format SPOT5 BIL */ -/*****************************************************************/ -/* MOD : VERSION : 4.7 : DM : LEAD_01.DAT devient METADATA.DIM */ -/*****************************************************************/ - if ( - (cai_recup_nom_spot(typspot,path_rep,"METADATA.DIM",&nom_entete_spot) == 0) && - (cai_recup_nom_spot(typspot,path_rep,"im",&nom_fic_spot) == 0) ) - { - /*image SPOT5 BIL*/ - nb_ima=nb_ima+1; - } - } - else if (typspot == 'T') - { - /* verification existence des fichiers propres au format SPOT5 TIF */ -/*****************************************************************/ -/* MOD : VERSION : 4.7 : DM : LEAD_01.DAT devient METADATA.DIM */ -/*****************************************************************/ - if ( - (cai_recup_nom_spot(typspot,path_rep,"METADATA.DIM",&nom_entete_spot) == 0) && - (cai_recup_nom_spot(typspot,path_rep,"im",&nom_fic_spot) == 0) ) - { - /*image SPOT5 TIF*/ - nb_ima=nb_ima+1; - } - } - } /*fin if cr*/ - - } /*fin if (v1 v2)*/ - - } /*fin while*/ - - /*fermeture du repertoire*/ - (void)closedir(dirp); - -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT SPOT - ......................................*/ - *tab_ima = (char **) calloc( nb_ima,sizeof(char *) ); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - - POUR CHAQUE REPERTOIRE DU REPERTOIRE COURANT, - TEST POUR SAVOIR SI CE REPERTOIRE CONTIENT - TOUS LES FICHIER PROPRES AU FORMAT SPOT - SI C`EST LE CAS,STOCKAGE DANS LA LISTE - ..........................................*/ - - dirp=opendir(repert); - - nb_ima=0; - - while((dp=readdir(dirp))!=NULL) - { - - /**********************************************/ - /* on ne doit pas tenir compte des . et .. */ - /* sous le repertoire courant */ - /**********************************************/ - - v1 = strcmp(dp->d_name, "."); - v2 = strcmp(dp->d_name, ".."); - - if ( (v1 != 0) && (v2 != 0) ) - { - sprintf(path_rep, "%s/%s", repert,dp->d_name); - - /*-------------------------------------*/ - /* test sur exitence du repertoire */ - /*-------------------------------------*/ - - cr = stat(path_rep,&buf_stat); - - if ( (cr!=-1) && ((buf_stat.st_mode&S_IFMT) == S_IFDIR) ) - { - /* verification existence des fichiers propres au format SPOT 1 a 4*/ - if (typspot == '1') - { - if ( - (cai_recup_nom_spot(typspot,path_rep,"lea",&nom_entete_spot) == 0) && - (cai_recup_nom_spot(typspot,path_rep,"tra",&nom_trailer_spot) == 0) && - (cai_recup_nom_spot(typspot,path_rep,"ima",&nom_fic_spot) == 0) && - (cai_recup_nom_spot(typspot,path_rep,"vol",&nom_vol_spot) == 0) && - ( cai_recup_nom_spot(typspot,path_rep,"NUL",&nom_NULL_spot) == 0) ) - { - /*image SPOT1 4*/ - nb_ima=nb_ima+1; - strcpy( (*tab_ima)[nb_ima-1],dp->d_name ); - } - } - else if (typspot == 'B') - { - /* verification existence des fichiers propres au format SPOT5 BIL */ -/*****************************************************************/ -/* MOD : VERSION : 4.7 : DM : LEAD_01.DAT devient METADATA.DIM */ -/*****************************************************************/ - if ( - (cai_recup_nom_spot(typspot,path_rep,"METADATA.DIM",&nom_entete_spot) == 0) && - (cai_recup_nom_spot(typspot,path_rep,"im",&nom_fic_spot) == 0) ) - { - /*image SPOT5 BIL*/ - nb_ima=nb_ima+1; - strcpy( (*tab_ima)[nb_ima-1],dp->d_name ); - } - } - else if (typspot == 'T') - { - /* verification existence des fichiers propres au format SPOT5 TIF */ -/*****************************************************************/ -/* MOD : VERSION : 4.7 : DM : LEAD_01.DAT devient METADATA.DIM */ -/*****************************************************************/ - if ( - (cai_recup_nom_spot(typspot,path_rep,"METADATA.DIM",&nom_entete_spot) == 0) && - (cai_recup_nom_spot(typspot,path_rep,"im",&nom_fic_spot) == 0) ) - { - /*image SPOT5 TIF*/ - nb_ima=nb_ima+1; - strcpy( (*tab_ima)[nb_ima-1],dp->d_name ); - } - } - } /*fin if cr*/ - - }/*fin if (v1 v2)*/ - - }/*fin while*/ - - /*fermeture du repertoire*/ - (void)closedir(dirp); - - } - else - { - /* Erreur : Repertoire inexistant sous repertoire courant */ - nb_ima=-1; - } - - return(nb_ima); - -} -/* Fin de l'operation cai_liste_ima_spot*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_spot */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format spot */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_spot(typspot,nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* */ -/* typspot (E) (char) : type spot (1=1a4,b=5bil ou t=5tif) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_spot (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ /* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_lecture_spot(char typspot,char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ -DIR *dirp; /* pointeur sur structure ouverture repertoire */ -CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ -struct dirent *dp; /* structure resultat de la fonction readdir */ -char fichier_clefs[1024]; /* Nom du fichier des donnees auxiliaires */ -int i,j,k; /* Variables de boucle */ -int descrip_leader; /* Descripteur du fichier LEADER */ -int descrip_imagery; /* Descripteur du fichier IMAGERY */ -int descrip_volume; /* Descripteur du fichier VOLUME */ -long cr_lseek; /* Code retour de lseek */ -long cr_read; /* Code retour de read */ -long lg_saut; /* Nombre d'octets a sauter */ -int lg_enreg,lgtemp; /* longueur d'un enregistrement */ -int NbCan; /* nombre de canaux de l'image */ -int test1,test2,test3,test4,test5;/* test sur nom de fichiers */ -int lg_entete; /* longueur de l'entete fichier IMAGERY */ -int num,trouve; /* variable de test */ -char nom_fic[1024]; /* nom du fichier en-tete */ -char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence */ -char nom_rep[1024]; /* nom du repertoire image SPOT */ -char nom_fic_ima[1024]; /* nom du fichier imagery.dat */ -char nom_leader[1024]; /* nom du fichier leader */ -char path_rep[PATH_MAX]; /* chemin acces fichiers ds repertoire courant */ -char nom_fic_spot5[PATH_MAX];/* chemin acces fichier image tiff ou BIL SPOT5 */ -char nom_ima_spot5[PATH_MAX];/* nom du fichier image spot5 */ -char *pch0,*pch1; /* pointeur sur chaine de caracteres */ -char car[2],carpoint; /* variable de travail */ -int type_spot; /* type d'image spot */ -char byteorder[1]; /* Ordre de codage intel (LE) ou Motorola (BE) */ -int skipbytes; /* Taille entete pour les fichiers BIL SPOT5 */ -int Trouve; -CAI_OK_KO icr; - - -/* Donnees auxiliaires */ - -char TABLEAU[1][257]; /* Variable intermediaire */ - -/* premiere variable = pour le nombre d'elements = nbre de colonnes */ -/* deuxieme element = pour la taille de l'element */ - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - descrip_leader = 0; - descrip_imagery = 0; - descrip_volume = 0; - *nb_can=0; - *nb_lig=0; - *nb_col=0; - *nboct_pix=1; - type_spot=0; - trouve=0; - car[0]='/'; - -#ifdef _WIN - car[0]='\\'; -#endif - -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : initialisation de image1=NULL a l'ouverture */ -/*****************************************************************************/ - image1= NULL; - /*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - - type_machine = cai_test_pFpf(); - -/******************************************************************************/ -/* Determination du type d'image : SPOT 1 a 4 ou SPOT 5 */ -/******************************************************************************/ -sprintf(nom_rep, "%s%s%s", repert,car, nom_image); - -dirp=opendir(nom_rep); - - -if(dirp!=NULL) - { - while( ((dp=readdir(dirp))!=NULL )&& (trouve ==0)) - { - - /*---------------------------------------------*/ - /* on ne doit pas tenir compte des . et .. */ - /* sous le repertoire courant */ - /*---------------------------------------------*/ - - test1 = strcmp(dp->d_name, "."); - test2 = strcmp(dp->d_name, ".."); - - if ( (test1 != 0) && (test2 != 0) ) - { -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Blindage de la reconnaissance du fichier image */ -/*****************************************************************************/ - - /*---------------------------------------------*/ - /* on recherche le fichier Image */ - /*---------------------------------------------*/ - test3 = strncasecmp(dp->d_name,"IMAG", 4); - if (test3 == 0) - { - test4 = strcasecmp(dp->d_name,"imagery.tif"); - if (test4==0) /* format SPOT5TIF */ - { - type_spot = 2; - sprintf (nom_fic_spot5, "%s%s%s%s%s", repert, car, - nom_image, car,dp->d_name); - sprintf (nom_ima_spot5, "%s", dp->d_name); - trouve=1; - } - else - { - test4 = strcasecmp(dp->d_name,"imagery.bil"); - if (test4==0) /* format SPOT5BIL */ - { - type_spot = 3; - sprintf (nom_fic_spot5, "%s%s%s%s%s", repert, car, - nom_image, car,dp->d_name); - sprintf (nom_ima_spot5, "%s", dp->d_name); - trouve=1; - } - else /* format SPOT 1 a 4*/ - { - carpoint = '.'; - pch0 = strchr (dp->d_name, carpoint); - if (pch0 == NULL) - { - type_spot = 1; /* format SPOT 1 a 4*/ - sprintf(nom_fic_ima, "%s%s%s%s%s", repert, car, - nom_image, car,dp->d_name); - trouve=1; - } - else if (strcasecmp(pch0,".DAT")== 0) - { - type_spot = 1; /* format SPOT 1 a 4*/ - sprintf(nom_fic_ima, "%s%s%s%s%s", repert, car, - nom_image, car,dp->d_name); - trouve=1; - } - - } - } - } - } - - } - closedir(dirp); - } - - -if (type_spot == 0) -{ - sprintf (CAI_ERREUR,"Erreur : type d'image SPOT inconnu"); - goto ERREUR; -} -/*........................................................................*/ -/* Verication ed la coherence du type spot annonce et du type spot trouve */ -/*........................................................................*/ -if (((typspot == '1')&&(type_spot != 1))|| - ((typspot == 'T')&&(type_spot != 2))|| - ((typspot == 'B')&&(type_spot != 3))) -{ - sprintf (CAI_ERREUR, - "Erreur : L'image n'est pas du type SPOT annonce"); - goto ERREUR; -} - -/*=============================================*/ -/* TRAITEMENT D'UNE IMAGE AU FORMAT SPOT 1 A 4 */ -/*=============================================*/ -if (type_spot == 1) -{ - image1= NULL; - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - image1->ACCES_SPOT[0]=0; - image1->ACCES_SPOT[1]=0; - -/*****************************************************************************/ -/* tests sur les retours d'allocation memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_lecture"); - goto ERREUR; - } - -/******************************************************************************/ -/* Ouverture des fichiers LEADER et IMAGERY en lecture */ -/******************************************************************************/ - - sprintf(nom_rep, "%s%s%s", repert,car, nom_image); - dirp=opendir(nom_rep); - - if(dirp!=NULL) - { - while( (dp=readdir(dirp))!=NULL ) - { - - /*---------------------------------------------*/ - /* on ne doit pas tenir compte des . et .. */ - /* sous le repertoire courant */ - /*---------------------------------------------*/ - - test1 = strcmp(dp->d_name, "."); - test2 = strcmp(dp->d_name, ".."); - - if ( (test1 != 0) && (test2 != 0) ) - { - - test3 = strncasecmp(dp->d_name,"LEAD", 4); - test4 = strncasecmp(dp->d_name,"IMAG", 4); - test5 = strncasecmp(dp->d_name,"VOL", 3); - - /********************************************************/ - /* tests de determination du fichier LEADER sous repert */ - /********************************************************/ - - if (test3==0) - { - sprintf(path_rep, "%s%s%s%s%s", repert, car,nom_image, - car,dp->d_name); - - /*ouverture du fichier LEADER*/ - - descrip_leader = open (path_rep, O_RDONLY |O_BINARY); - if (descrip_leader == -1) - { - strcpy(CAI_ERREUR, - "Erreur d'ouverture du fichier LEADER SPOT"); - goto ERREUR; - } - /*---------------------------------------------------------*/ - /* Lecture de la taille d'un enregistrement dans LEADER */ - /*---------------------------------------------------------*/ - - cr_lseek = lseek ( descrip_leader , 8L , 1 ); - if ( cr_lseek == -1 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT"); - goto ERREUR; - } - - cr_read = read ( descrip_leader , &lg_enreg , 4 ); - if ( cr_read == -1 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT"); - goto ERREUR; - } - if (strcmp(type_machine,"LE")==0) - { - swab( (void*)&lg_enreg, (void*)&lgtemp,4 ); - cai_inverser_tableau((short *)&lg_enreg, (short *)&lgtemp,2); - } - - /*------------------------------------------------------*/ - /* Retour au debut du fichier LEADER */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( descrip_leader , 0L , 0 ); - if ( cr_lseek == -1 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT"); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Saut de lg_enreg + 996 octets dans LEADER */ - /*------------------------------------------------------*/ - - lg_saut = (long)(lg_enreg + 996); - cr_lseek = lseek ( descrip_leader , lg_saut , 0 ); - if ( cr_lseek == -1 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT"); - goto ERREUR; - } - /*------------------------------------------------------*/ - /* Lecture du nombre de colonnes dans LEADER */ - /*------------------------------------------------------*/ - - cr_read = read (descrip_leader, TABLEAU[0], 16); - if ( cr_read != 16 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT"); - goto ERREUR; - } - TABLEAU[0][16] = '\0'; /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for (i=0;i<16;i++) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sscanf ( TABLEAU[0], "%d", nb_col); - /*------------------------------------------------------*/ - /* Lecture du nombre de lignes dans LEADER */ - /*------------------------------------------------------*/ - - cr_read = read (descrip_leader, TABLEAU[0], 16); - if ( cr_read != 16 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT"); - goto ERREUR; - } - TABLEAU[0][16] = '\0'; /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for (i=0;i<16;i++) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sscanf ( TABLEAU[0], "%d", nb_lig); - - /*------------------------------------------------------*/ - /* Saut de 16 octets dans LEADER */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( descrip_leader , 16L , 1 ); - if ( cr_lseek == -1 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT"); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Lecture du nombre de canaux dans LEADER */ - /*------------------------------------------------------*/ - - cr_read = read (descrip_leader, TABLEAU[0], 16); - if ( cr_read != 16 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT"); - goto ERREUR; - } - TABLEAU[0][16] = '\0'; /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for (i=0;i<16;i++) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sscanf ( TABLEAU[0], "%d", nb_can); - } /*fin test3 (v==0)*/ - - else if (test5==0) - { - /********************************************************/ - /* tests de determination du fichier VOLUME sous repert */ - /********************************************************/ - - sprintf(path_rep, "%s%s%s%s%s", repert, car,nom_image, - car,dp->d_name); - /*ouverture du fichier VOLUME*/ - - descrip_volume = open (path_rep, O_RDONLY|O_BINARY ); - if (descrip_volume == -1) - { - strcpy(CAI_ERREUR, - "Erreur d'ouverture du fichier VOLUME SPOT"); - goto ERREUR; - } - } - /********************************************************/ - /* tests de determination du fichier IMAGERY sous repert */ - /********************************************************/ - - else if (test4==0) - { - - /*ouverture du fichier IMAGERY*/ - - descrip_imagery = open (nom_fic_ima, O_RDONLY|O_BINARY ); - if (descrip_imagery == -1) - { - strcpy(CAI_ERREUR, - "Erreur d'ouverture du fichier IMAGERY SPOT"); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Lecture de la taille de l'entete dans IMAGERY */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( descrip_imagery , 8L , 1); - if ( cr_lseek == -1 ) - { - strcpy(CAI_ERREUR, - "Erreur acces au fichier contenant donnees SPOT"); - goto ERREUR; - } - - cr_read = read ( descrip_imagery , &lg_entete , 4 ); - if ( cr_read == -1 ) - { - strcpy(CAI_ERREUR, - "Erreur acces au fichier contenant donnees SPOT"); - goto ERREUR; - } - if (strcmp(type_machine,"LE")==0) - { - swab( (void*)&lg_entete, (void*)&lgtemp,4 ); - cai_inverser_tableau((short *)&lg_entete, (short *)&lgtemp,2); - } - - } /*fin else if test4*/ - - } /*fin else test1 test2*/ - - } /*fin while*/ - - closedir(dirp); - - } /*fin if (dirp=!NULL)*/ - - -/* verification que tous les fichiers necessaires (lead,imag et vol ont ete trouves */ - if (descrip_leader == 0) - { - sprintf(CAI_ERREUR,"Erreur : Fichier Leader SPot1a4 absent"); - goto ERREUR; - } - if (descrip_imagery == 0) - { - sprintf(CAI_ERREUR,"Erreur : Fichier imagery SPot1a4 absent"); - goto ERREUR; - } - if (descrip_volume == 0) - { - sprintf(CAI_ERREUR,"Erreur : Fichier volume SPot1a4 absent"); - goto ERREUR; - } -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - sprintf(nom_fic_canal,"%s",nom_fic_ima); - - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_image,"%s",image1->NOM_FIC_CAN); - sscanf(nom_image,"%s",image1->NOM_UTIL_CAN); - image1->ACCES_CANAL_INT[i]=descrip_imagery; - image1->ACCES_SPOT[0]=descrip_leader; - image1->ACCES_SPOT[1]=descrip_volume; - image1->POS_OCTET[i]=lg_entete; - } - image1->TYPE_SPOT = type_spot; - image1->NBOCT_PIX = *nboct_pix; - - } /* fin TYPE IMAGE SPOT 1 a 4 */ - /*===========================*/ - -/*=============================================*/ -/* TRAITEMENT D'UNE IMAGE AU FORMAT SPOT 5 TIF */ -/*=============================================*/ - else if (type_spot == 2) - { - -/* Ouverture de l'image */ - image1 = cai_ouvre_lecture_image (nom_fic_spot5, "TIFF", - nb_can,nboct_pix,nb_col,nb_lig); - - if (image1 == NULL) - { - strcpy(CAI_ERREUR, - "Erreur acces au fichier image TIFF contenant donnees SPOT"); - goto ERREUR; - } - - image1->NB_CANAUX = *nb_can ; - image1->NBOCT_PIX = *nboct_pix ; - image1->NB_COL = *nb_col ; - image1->NB_LIG = *nb_lig ; - image1->TYPE_SPOT = type_spot; - image1->ACCES_SPOT[0]=0; - image1->ACCES_SPOT[1]=0; - - - } /* fin TYPE IMAGE SPOT 5 TIFF */ - /*============================*/ - -/*=============================================*/ -/* TRAITEMENT D'UNE IMAGE AU FORMAT SPOT 5 BIL */ -/*=============================================*/ - else - { - - image1= NULL; - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - image1->ACCES_SPOT[0]=0; - image1->ACCES_SPOT[1]=0; - -/*****************************************************************************/ -/* tests sur les retours d'allocation memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_lecture"); - goto ERREUR; - } - - /* Recherche du leader Dimap */ - dirp=opendir(nom_rep); - Trouve=0; - if(dirp!=NULL) - { - while( (dp=readdir(dirp))!=NULL ) - { - - /*---------------------------------------------*/ - /* on ne doit pas tenir compte des . et .. */ - /* sous le repertoire courant */ - /*---------------------------------------------*/ - - test1 = strcmp(dp->d_name, "."); - test2 = strcmp(dp->d_name, ".."); - - if ( (test1 != 0) && (test2 != 0) ) - { -/*****************************************************************/ -/* MOD : VERSION : 4.7 : DM : LEAD_01.DAT devient METADATA.DIM */ -/*****************************************************************/ - test3 = strncasecmp(dp->d_name,"METADATA.DIM", 12); - - /**************************************************************/ - /* tests de determination du fichier METADATA.DIM sous repert */ - /**************************************************************/ - if (test3==0) - { - sprintf(nom_leader, "%s%s%s%s%s", repert,car, nom_image, - car, dp->d_name); - - -/* Extraction du nombre de lig col can et nboct du fichier DIMAP */ -/*...............................................................*/ - icr = cai_lire_dimensions_spot5(nom_leader,nb_can,nboct_pix , - nb_col , nb_lig,byteorder, - &skipbytes ); - if (icr != CAI_OK) - { - goto ERREUR; - } - else - Trouve=1; - } - } /*fin else test1 test2*/ - - } /*fin while*/ - - closedir(dirp); - - } /*fin if (dirp=!NULL)*/ - - if (Trouve==0) - { - sprintf(CAI_ERREUR, - "Erreur Le fichier METADATA.DIM n'existe pas ou erreur de lecture"); - goto ERREUR; - } - - -/* INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - nom_fic[0]='\0'; - nom_fic_canal[0]='\0'; - - sprintf(nom_fic_canal,"%s",nom_fic_spot5); - - num=open(nom_fic_canal,O_RDONLY|O_BINARY,0); - if (num!= -1) - { - for (i=0;i<*nb_can;i=i+1) - { - sscanf(nom_ima_spot5,"%s",image1->NOM_FIC_CAN); - sscanf(nom_ima_spot5,"%s",image1->NOM_UTIL_CAN); - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=(*nb_col)*i*(*nboct_pix)+skipbytes; - } - image1->TYPE_SPOT = type_spot; - image1->NBOCT_PIX = *nboct_pix; - if (byteorder[0]=='M') - { - if (strcmp(type_machine,"BE")==0) - image1->INV_OCTETS=0; - else - image1->INV_OCTETS=1; - } - else - { - if (strcmp(type_machine,"LE")==0) - image1->INV_OCTETS=0; - else - image1->INV_OCTETS=1; - } - - } - else - { - strcpy(CAI_ERREUR, - "Erreur ouverture fichier BIL contenant donnees SPOT"); - goto ERREUR; - } - - } /* fin TYPE IMAGE SPOT 5 BIL */ - - /*===========================*/ - - -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : Initialisation du champ COD_PIX (OCT,I2 ou UND)*/ -/*****************************************************************************/ - if (*nboct_pix==1) - sprintf(image1->COD_PIX,"OCT"); - else if (*nboct_pix==2) - sprintf(image1->COD_PIX,"I2"); - else - sprintf(image1->COD_PIX,"UND"); - - - return(image1); - - -ERREUR: - if (descrip_leader !=0) close(descrip_leader); - if (descrip_imagery !=0) close(descrip_imagery); - if (descrip_volume !=0) close(descrip_volume); - if (image1!=NULL) free(image1); - return(NULL); -} -/* - Fin de l'operation cai_ouvre_lecture_spot -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_spot */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format spot et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_spot(typspot,nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* typspot (E) (char ) : type d'images spot 91a4,5tif ou 5bil) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_spot (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_IMAGE *cai_ouvre_creation_spot(char typspot,char *repert, - char *nom_image, - int *nbca, - int *nboct_pix, - int *nbcol, - int *nblig, - char *label) - -{ - - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int icr; /* Code retour de fonctions */ - -/*........................................ - INITIALISATIONS et allocation de place pour la structure CAI_IMAGE - .........................................*/ - icr = CAI_OK; - - -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : initialisation de image1=NULL a l'ouverture */ -/*****************************************************************************/ - image1= NULL; - -/*-------------------------------------------------------------*/ -/* test du type de machine sur laquelle est constituee l'image */ -/*-------------------------------------------------------------*/ - type_machine = cai_test_pFpf(); - - if (typspot=='1') - image1 = cai_ouvre_creation_spot1a4(repert,nom_image,nbca, - nboct_pix,nbcol,nblig,label); - else if (typspot=='B') - image1 = cai_ouvre_creation_spot5BIL(repert,nom_image,nbca, - nboct_pix,nbcol,nblig,label); - else if (typspot=='T') - image1 = cai_ouvre_creation_spot5TIF(repert,nom_image,nbca, - nboct_pix,nbcol,nblig,label); - if (image1==NULL) icr=CAI_KO; - - if (icr != CAI_OK) - { - if (image1!=NULL) free(image1); - image1 = NULL; - } - return(image1); - -} - -/* - Fin de l'operation cai_ouvre_creation_spot -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_spot */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image LUM */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_spot(image1, canal, */ -/* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_spot (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_lecture_canal_spot(CAI_IMAGE *image1,int *canal, - int *premiere_ligne, int *premiere_colonne, - int *nb_lig_lire, int *nb_col_lire, - int *pas_lig, int *pas_col, - unsigned char *data_image ) - - -{ -DIR *dirp; /* pointeur sur structure ouverture repertoire */ -struct dirent *dp; /* structure resultat de la fonction readdir */ -int descrip_imagery; /* descripteur du fichier imagery */ -int nb_can; /* nombre de canaux de l'image SPOT */ -int num,lig,i,j,k; /* variables de travail */ -long nb_oct; /* nb oct =1er octet a lire - position courante */ -long oct_lig; /* nb oct. par ligne en considerant taille pixel */ -long int offset; /* Deplacement dans le fichier */ -long cr_lseek; /* Code retour de lseek */ -long cr_read; /* Code retour de read */ -int lg_prefixe; /* longueur du prefixe d'une ligne */ -int lg_suffixe; /* longueur du suffixe d'une ligne */ -int lg_entete ; /* longueur de l'entete d'une ligne */ -char *nom_fic; /* nom contenant le chemin de l'image */ -char path_rep[PATH_MAX]; /* chemin acces fichiers ds repertoire courant */ -unsigned char *buf_lec; /* buffer lecture d'une ligne */ -long pt_oct; /* position courante dans le fichier image */ -unsigned char *pch, *deb; /* pointeur chaine pour transfert buffer sortie */ -int no_oct; /* numero du premier octet a lire */ -CAI_OK_KO icr; /* code retour fonction */ -int taille_image; /* Taille en octets de la zone a lire */ -unsigned char *data_image2; /* pointeur donnees image pour inversion octets */ - - -data_image2 = NULL; -if ( (image1->TYPE_SPOT < 1) || (image1->TYPE_SPOT > 3) ) - { - sprintf (CAI_ERREUR,"Erreur : type d'image SPOT inconnu"); - goto ERREUR; - } -/*=============================================*/ -/* TRAITEMENT D'UNE IMAGE AU FORMAT SPOT 1 A 4 */ -/*=============================================*/ -else if (image1->TYPE_SPOT == 1) - { -/*........................... - Initialisations diverses - ..........................*/ - - lg_prefixe = 32; - descrip_imagery = image1->ACCES_CANAL_INT[*canal-1]; - nb_can = image1->NB_CANAUX; - -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : anomalie sur sous-echantillonnage en lecture */ -/*****************************************************************************/ -/* Une ligne modifiee */ - oct_lig = image1->NBOCT_PIX*(image1->NB_COL); - - /*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - - buf_lec = (unsigned char *) calloc(oct_lig,sizeof(unsigned char)); - if (buf_lec == NULL) - { - sprintf(CAI_ERREUR,"ERREUR:Probleme allocation memoire\n"); - goto ERREUR; - } - - else - { - /*.................... - Initialisation - ......................*/ - lig=*premiere_ligne; - i=1; - pch=data_image; - lg_entete=image1->POS_OCTET[*canal-1]; - -/*..................... - Pour chaque ligne a lire - .......................................*/ - while (i <= *nb_lig_lire) - { -/*............................................ - Recherche de la position courante dans le fichier - ............................................*/ - pt_oct = lseek(descrip_imagery,0L,1); - - if ( pt_oct == -1 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier contenant donnees SPOT"); - goto ERREUR; - } - -/*................................ - Calcul du numero du 1er octet a lire - no_oct=(*nblig-1)*lg_entete*nbcanaux+lg_entete*(canal-1)+lg_prefixe+(*canal-1)*lg_entete - ....................................*/ - - no_oct = (lig-1)*lg_entete*nb_can+image1->POS_OCTET[*canal-1]+lg_prefixe+(*canal-1)*lg_entete; - -/*.................................. - Saut d'octets pour etre positionne sur la ligne a lire - .......................................*/ - nb_oct=(long)(no_oct-pt_oct); - lseek(descrip_imagery,nb_oct,1); - -/*........................................... - lecture d'une ligne image - ................................................*/ - cr_read=read(descrip_imagery,buf_lec,oct_lig); - - if (cr_read==-1) - { - strcpy(CAI_ERREUR,"Erreur lecture donnee image SPOT"); - goto ERREUR; - } - else - { -/*...................................... - Sauvegarde des donnees lues en tenant compte du pas - d'echantillonnage en colonne - ........................................*/ - deb = buf_lec+(*premiere_colonne-1)*image1->NBOCT_PIX; - j=1; - while (j <= *nb_col_lire) - { - for (k=0;k<image1->NBOCT_PIX;k=k+1) - { - *(pch+k)=*(deb+k); - } - j=j+1; - pch=pch+image1->NBOCT_PIX; - deb=deb+(*pas_col*image1->NBOCT_PIX); - - }/*fin while j*/ - - }/*fin else*/ - - i=i+1; - lig=lig+(*pas_lig); - - } /*fin while i*/ - - free(buf_lec); - } /*fin else*/ - - - - } /* fin TYPE IMAGE SPOT 1 a 4 */ - /*===========================*/ - -/*=============================================*/ -/* TRAITEMENT D'UNE IMAGE AU FORMAT SPOT 5 TIF */ -/*=============================================*/ - else if (image1->TYPE_SPOT == 2) - { - - icr = cai_lecture_canal_tiff (image1, canal, - premiere_ligne, premiere_colonne, - nb_lig_lire, nb_col_lire, pas_lig, - pas_col, data_image); - if (icr != CAI_OK) - goto ERREUR; - - } /* fin TYPE IMAGE SPOT 5 TIFF */ - /*============================*/ - -/*=============================================*/ -/* TRAITEMENT D'UNE IMAGE AU FORMAT SPOT 5 BIL */ -/*=============================================*/ - else - { - - icr = cai_lecture_canal_bil (image1, canal, premiere_ligne, - premiere_colonne, nb_lig_lire, nb_col_lire, - pas_lig, pas_col, data_image); - if (icr != CAI_OK) - goto ERREUR; - else - { -/* Si necessaire inversion des octets */ - if ((image1->INV_OCTETS==1)&&(image1->NBOCT_PIX !=1)) - { - taille_image = (*nb_lig_lire)*(*nb_col_lire)*(image1->NBOCT_PIX); - data_image2 = (unsigned char *) calloc(taille_image, - sizeof(unsigned char)); - - if (data_image2 == NULL) - { - strcpy(CAI_ERREUR, - "Erreur allocation memoire dans cai_lecture_canal"); - goto ERREUR; - } - swab( (void*)(data_image), (void*)(data_image2), taille_image); - for (i=0; i<taille_image;i++) - { - /*stockage dans data_image*/ - data_image[i] = data_image2[i]; - } - free(data_image2); - } - } - - } /* fin TYPE IMAGE SPOT 5 BIL */ - /*===========================*/ - - -/* Sortie normale */ - return (CAI_OK); - -/* Sortie degradee */ -ERREUR: - if (descrip_imagery>0) close(descrip_imagery); - return(NULL); - -} - -/* - Fin de l'operation cai_lecture_canal_spot -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_spot */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image spot */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_spot(image1, canal, */ -/* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de colonnes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_spot (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_ecriture_canal_spot (CAI_IMAGE *image1, - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) - -{ - long cr_write; /* code retour de write */ - unsigned char *buf_lec; /* Buffer des radiometries */ - int descrip_imagery; /* Descripteur du fichier IMAGERY */ - int lgrec; - int i_ligne, j, i; - CAI_OK_KO icr; - int nb_can, nboct_pix,nboct,compl; - int no_oct,nblig,nbcol; - long deplacement; /* deplacement a effectuer */ - long position_courante; /* position courante dans le fichier */ - -/* Variables intermediaires */ - - unsigned char BYTE[4]; - unsigned char COMP[5300]; - int VAR_LONG[2]; - short int TAB_SHORT; - char TAB[3]; - -/************************************************/ -/* TRAITEMENT DIFFERENT SUIVANT LE TYPE DE SPOT */ -/************************************************/ -icr = CAI_OK; -if (image1->TYPE_SPOT ==1) -{ -/*--------------------*/ -/* IMAGE SPOT1A4 */ -/*--------------------*/ - - /*........................... - Initialisations diverses - ..........................*/ - - i_ligne = 0; - lgrec = image1->POS_OCTET[*canal-1]; /*long entete image SPOT*/ - descrip_imagery = image1->ACCES_CANAL_INT[*canal-1]; - nb_can = image1->NB_CANAUX; - nboct_pix = image1->NBOCT_PIX; - nboct= (*nombre_colonnes_ecrire) * nboct_pix ; - compl= lgrec-nboct-100; - for (i=0;i<5300;i++) COMP[i]=0; - nbcol = image1->NB_COL; - -/*---------------------------------------------------------------------------*/ -/* ECRITURE DU FICHIER IMAGERY */ -/*---------------------------------------------------------------------------*/ - - /*......................................................*/ - /* Calcul de la position du premier octet a ecrire */ - /*......................................................*/ - - no_oct = lgrec+(*premiere_ligne-1)*lgrec*nb_can+lgrec*(*canal-1); - - /*......................................................*/ - /* Recuperation de la position courante */ - /*......................................................*/ - - position_courante = lseek ( descrip_imagery , 0L , 1 ); - - /*.......................................................*/ - /* Calcul du deplacement jusqu'a la 1ere ligne a ecrire */ - /*.......................................................*/ - - deplacement = no_oct - position_courante; - - /********************************************************/ - /* TANT QUE il y a des lignes a ecrire */ - /********************************************************/ - buf_lec=data_image; - while (i_ligne < (*nombre_lignes_ecrire)) - { - nblig=(*premiere_ligne)+i_ligne; - /*.............................................*/ - /* deplacement jusqu'a la ligne a ecrire */ - /*............................................*/ - - lseek ( descrip_imagery , deplacement , 1 ); - - /******************************/ - /* Pour le fichier IMAGE DATA */ - /******************************/ - - /*initialisation des infos de l'entete de l'image dest*/ - BYTE[0] = 237; - BYTE[1] = 237; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = lgrec; - VAR_LONG[0] = i_ligne+1; - - /*ecriture dans le fichier image dest*/ - cr_write = write ( descrip_imagery , VAR_LONG , 4); - if (cr_write != 4) - { - icr = CAI_KO; - goto FIN; - } - - cr_write = write ( descrip_imagery , BYTE , 4); - if (cr_write != 4) - { - icr = CAI_KO; - goto FIN; - } - - cr_write = write ( descrip_imagery , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - icr = CAI_KO; - goto FIN; - } - - /* Ecriture des prefixes : */ - - cr_write = write ( descrip_imagery, &nblig, 4); - if (cr_write != 4) - { - icr = CAI_KO; - goto FIN; - } - - strcpy ( TAB," "); - cr_write = write ( descrip_imagery , TAB, 2); - if (cr_write != 2) - { - icr = CAI_KO; - goto FIN; - } - - TAB_SHORT = (short)(*canal); - - cr_write = write ( descrip_imagery , &TAB_SHORT , 2); - if (cr_write !=2) - { - icr = CAI_KO; - goto FIN; - } - - cr_write = write ( descrip_imagery , COMP , 12); - if (cr_write != 12) - { - icr = CAI_KO; - goto FIN; - } - - /* Ecriture radiometries */ - - cr_write = write ( descrip_imagery , buf_lec ,nboct ); - if (cr_write != nboct) - { - icr = CAI_KO; - goto FIN; - } - - /* ecriture des octets de completion */ - cr_write = write ( descrip_imagery , COMP ,compl ); - if (cr_write != compl) - { - icr = CAI_KO; - goto FIN; - } - - /* Ecriture des suffixes : */ - - cr_write = write ( descrip_imagery , COMP , 24); - if (cr_write != 24) - { - icr = CAI_KO; - goto FIN; - } - - cr_write = write ( descrip_imagery , &nbcol , 4); - if (cr_write != 4) - { - icr = CAI_KO; - goto FIN; - } - - cr_write = write ( descrip_imagery , COMP, 40); - if (cr_write != 40) - { - icr = CAI_KO; - goto FIN; - } - - /********************************************************/ - /* mise a jour du deplacement jusqu'a la ligne */ - /* suivante */ - /********************************************************/ - - deplacement = ( nb_can - 1 ) * lgrec; - buf_lec = buf_lec+nboct; - - /********************************************************/ - /* incrementation du nombre de lignes */ - /********************************************************/ - - i_ligne++; - - } /*fin while*/ -} -else if (image1->TYPE_SPOT ==2) -{ -/*--------------------*/ -/* IMAGE SPOT5 TIFF */ -/*--------------------*/ - icr = cai_ecriture_canal_tiff (image1,canal,premiere_ligne, - nombre_lignes_ecrire , - nombre_colonnes_ecrire,data_image); -} -else if (image1->TYPE_SPOT ==3) -{ -/*--------------------*/ -/* IMAGE SPOT5 BIL */ -/*--------------------*/ - icr = cai_ecriture_canal_bil(image1,canal,premiere_ligne, - nombre_lignes_ecrire , - nombre_colonnes_ecrire,data_image); - -} - -FIN : - if (icr != CAI_OK) - strcpy(CAI_ERREUR,"Erreur ecriture du fichier Imagery"); - - return (icr); - -} - -/* - Fin de l'operation cai_ecriture_canal_spot -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_spot */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format spot et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_spot(typspot,image1) */ /* ------------------ */ -/* */ -/* typspot (E) (char ) : =1 spot1a4, =T spot5Tif,=B spot5Bil */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_spot (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - -CAI_OK_KO cai_ferme_spot (char typspot,CAI_IMAGE *image1) - -{ - - CAI_OK_KO iret; /* code retour de l'operation */ - int num; /* descripteur du fichier a fermer */ - int temp; /* variable temporaire */ - long pt_oct; /* position courante ds fichier image */ - -/*--------------------------*/ -/* Initialisations diverses */ -/*--------------------------*/ - iret=CAI_OK; - -/************************************************/ -/* TRAITEMENT DIFFERENT SUIVANT LE TYPE DE SPOT */ -/************************************************/ - if (typspot == '1') - { -/* SPOT1a4 */ - - num=image1->ACCES_CANAL_INT[0]; - -/*--------------------------------------------------*/ -/* Mise a jour de l'entete si ouverture en creation */ -/*--------------------------------------------------*/ - if (image1->MODE == CAI_ECRITURE) - { - pt_oct=lseek(num,0L,0); - -/*........................................*/ -/* Mise a jour du niveau de pretraitement */ -/*........................................*/ - pt_oct=lseek(num,53L,1); - pt_oct = write ( num,image1->NIVEAU , 2 ); - if ( pt_oct == 0 ) - { - sprintf ( CAI_ERREUR , - "Erreur : MAJ impossible entete a la fermeture fichier SPOT1a4\n"); - iret=CAI_KO; - goto ERREUR; - } - - } -/*............................................. - Fermeture du fichier qui contient tous les canaux - .............................................*/ - if (num>0) close(num); - - if (image1->ACCES_SPOT[0]!=0) close(image1->ACCES_SPOT[0]); - if (image1->ACCES_SPOT[1]!=0) close(image1->ACCES_SPOT[1]); - } - else if (typspot == 'T') - { -/* SPOT5TIF */ - iret = cai_ferme_tiff(image1); - } - else if (typspot == 'B') - { -/* SPOT5BIL */ - iret = cai_ferme_bil(image1); - } - - - - return (iret); - -ERREUR: - return(CAI_KO); - -} - -/* - Fin de l'operation cai_ferme_spot -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_spot */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stockee en spot et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_spot(typspot,repertoire,nom_ima)*/ /* ------------------ */ -/* typspot (E) (char ) : =1 spot1a4, =T spot5Tif,=B spot5Bil */ -/* repertoire (E) (char *) : repertoire de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_spot (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_dest_ima_spot (char typspot, char *repertoire , - char *nom_ima ) - -{ -char nom_fic[1024]; /* nom du repertoire a detruire */ - -/************************************************/ -/* Constitution du nom du repertoire image */ -/************************************************/ - -if ((long)strlen(repertoire)!= 0) -{ - sprintf( nom_fic, "%s/%s" ,repertoire,nom_ima); -} -else -{ - strcpy ( nom_fic , nom_ima); -} - -/*****************************************************/ -/* Destruction du repertoire et de tous ses fichiers */ -/*****************************************************/ - - sprintf(Command,"rm -R %s",nom_fic); - system(Command); - -return (CAI_OK); - -} -/* - Fin de l'operation cai_dest_ima_spot -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_spot */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture-ecriture d'une image au format */ -/* ----- spot et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_spot(typspot,nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* */ -/* typspot (E) (char) : type spot (1=1a4,b=5bil ou t=5tif) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_spot (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_modifie_spot(char typspot,char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ -DIR *dirp; /* pointeur sur structure ouverture repertoire */ -CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ -struct dirent *dp; /* structure resultat de la fonction readdir */ -char fichier_clefs[1024]; /* Nom du fichier des donnees auxiliaires */ -int i,j,k; /* Variables de boucle */ -int descrip_leader; /* Descripteur du fichier LEADER */ -int descrip_imagery; /* Descripteur du fichier IMAGERY */ -int descrip_volume; /* Descripteur du fichier VOLUME */ -long cr_lseek; /* Code retour de lseek */ -long cr_read; /* Code retour de read */ -long lg_saut; /* Nombre d'octets a sauter */ -int lg_enreg,lgtemp; /* longueur d'un enregistrement */ -int NbCan; /* nombre de canaux de l'image */ -int test1,test2,test3,test4,test5;/* test sur nom de fichiers */ -int lg_entete; /* longueur de l'entete fichier IMAGERY */ -int num,trouve; /* variable de test */ -char nom_fic[1024]; /* nom du fichier en-tete */ -char nom_fic_canal[1024]; /* nom fichier canal dont on teste existence */ -char nom_rep[1024]; /* nom du repertoire image SPOT */ -char nom_fic_ima[1024]; /* nom du fichier imagery.dat */ -char nom_leader[1024]; /* nom du fichier leader */ -char path_rep[PATH_MAX]; /* chemin acces fichiers ds repertoire courant */ -char nom_fic_spot5[PATH_MAX];/* chemin acces fichier image tiff ou BIL SPOT5 */ -char nom_ima_spot5[PATH_MAX];/* nom du fichier image spot5 */ -char *pch0; /* pointeur sur chaine de caracteres */ -char car[2]; /* variable de travail */ -int type_spot; /* type d'image spot */ -char byteorder[1]; /* Ordre de codage intel (LE) ou Motorola (BE) */ -int skipbytes; /* Taille entete pour les fichiers BIL SPOT5 */ -CAI_OK_KO icr; -int Trouve; - - -/* Donnees auxiliaires */ - -char TABLEAU[1][257]; /* Variable intermediaire */ - -/* premiere variable = pour le nombre d'elements = nbre de colonnes */ -/* deuxieme element = pour la taille de l'element */ - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ -*nb_can=0; -*nb_lig=0; -*nb_col=0; -*nboct_pix=1; - type_spot=0; - trouve=0; - car[0]='/'; - -#ifdef _WIN - car[0]='\\'; -#endif - -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : initialisation de image1=NULL a l'ouverture */ -/*****************************************************************************/ - image1= NULL; - - /*.................................. - determination ordre de rangement - des octets sur machine de travail - ......................................*/ - - type_machine = cai_test_pFpf(); - -/******************************************************************************/ -/* Determination du type d'image : SPOT 1 a 4 ou SPOT 5 */ -/******************************************************************************/ -sprintf(nom_rep, "%s%s%s", repert,car, nom_image); - -dirp=opendir(nom_rep); - - -if(dirp!=NULL) - { - while( ((dp=readdir(dirp))!=NULL )&& (trouve ==0)) - { - - /*---------------------------------------------*/ - /* on ne doit pas tenir compte des . et .. */ - /* sous le repertoire courant */ - /*---------------------------------------------*/ - - test1 = strcmp(dp->d_name, "."); - test2 = strcmp(dp->d_name, ".."); - - if ( (test1 != 0) && (test2 != 0) ) -{ -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Blindage de la reconnaissance du fichier image */ -/*****************************************************************************/ - - /*---------------------------------------------*/ - /* on recherche le fichier Image */ - /*---------------------------------------------*/ - test3 = strncasecmp(dp->d_name,"IMAG", 4); - if (test3 == 0) - { - test4 = strcasecmp(dp->d_name,"imagery.tif"); - if (test4==0) /* format SPOT5TIF */ - { - type_spot = 2; - sprintf (nom_fic_spot5, "%s%s%s%s%s", repert, car, - nom_image, car,dp->d_name); - sprintf (nom_ima_spot5, "%s", dp->d_name); - trouve=1; - } - else - { - test4 = strcasecmp(dp->d_name,"imagery.bil"); - if (test4==0) /* format SPOT5BIL */ - { - type_spot = 3; - sprintf (nom_fic_spot5, "%s%s%s%s%s", repert, car, - nom_image, car,dp->d_name); - sprintf (nom_ima_spot5, "%s", dp->d_name); - trouve=1; - } - else /* format SPOT 1 a 4*/ - { - car[0] = '.'; - pch0 = strchr (dp->d_name, car[0]); - if (pch0 == NULL) - { - type_spot = 1; /* format SPOT 1 a 4*/ - sprintf(nom_fic_ima, "%s/%s/%s", repert, - nom_image, dp->d_name); - trouve=1; - } - else if (strcasecmp(pch0,".DAT")== 0) - { - type_spot = 1; /* format SPOT 1 a 4*/ - sprintf(nom_fic_ima, "%s%s%s%s%s", repert, car, - nom_image, car,dp->d_name); - trouve=1; - } - - } - } - } - } - } - closedir(dirp); - } - - -if (type_spot == 0) -{ - sprintf (CAI_ERREUR,"Erreur : type d'image SPOT inconnu"); - goto ERREUR; -} -/*........................................................................*/ -/* Verication ed la coherence du type spot annonce et du type spot trouve */ -/*........................................................................*/ - if (((typspot == '1')&&(type_spot != 1))|| - ((typspot == 'T')&&(type_spot != 2))|| - ((typspot == 'B')&&(type_spot != 3))) - { - sprintf (CAI_ERREUR, - "Erreur : L'image n'est pas du type SPOT annonce"); - goto ERREUR; - } - -/*=============================================*/ -/* TRAITEMENT D'UNE IMAGE AU FORMAT SPOT 1 A 4 */ -/*=============================================*/ -if (type_spot == 1) -{ - image1= NULL; - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - image1->ACCES_SPOT[0]=0; - image1->ACCES_SPOT[1]=0; - -/*****************************************************************************/ -/* tests sur les retours d'allocation memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR, - "Erreur allocation memoire dans cai_ouvre_modifie_image spot1a4"); - goto ERREUR; - } - -/******************************************************************************/ -/* Ouverture des fichiers LEADER et IMAGERY en lecture */ -/******************************************************************************/ - - sprintf(nom_rep, "%s/%s", repert, nom_image); - - dirp=opendir(nom_rep); - - if(dirp!=NULL) - { - while( (dp=readdir(dirp))!=NULL ) - { - - /*---------------------------------------------*/ - /* on ne doit pas tenir compte des . et .. */ - /* sous le repertoire courant */ - /*---------------------------------------------*/ - - test1 = strcmp(dp->d_name, "."); - test2 = strcmp(dp->d_name, ".."); - - if ( (test1 != 0) && (test2 != 0) ) - { - - test3 = strncasecmp(dp->d_name,"LEAD", 4); - test4 = strncasecmp(dp->d_name,"IMAG", 4); - test5 = strncasecmp(dp->d_name,"VOL", 3); - - /********************************************************/ - /* tests de determination du fichier LEADER sous repert */ - /********************************************************/ - - if (test3==0) - { - sprintf(path_rep, "%s%s%s%s%s", repert, car,nom_image, - car,dp->d_name); - /*ouverture du fichier LEADER*/ - - descrip_leader = open (path_rep, O_RDWR|O_BINARY ); - if (descrip_leader == -1) - { - strcpy(CAI_ERREUR, - "Erreur d'ouverture du fichier LEADER SPOT1a4"); - goto ERREUR; - } - - /*---------------------------------------------------------*/ - /* Lecture de la taille d'un enregistrement dans LEADER */ - /*---------------------------------------------------------*/ - - cr_lseek = lseek ( descrip_leader , 8L , 1 ); - if ( cr_lseek == -1 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT1a4"); - goto ERREUR; - } - - cr_read = read ( descrip_leader , &lg_enreg , 4 ); - if ( cr_read == -1 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT1a4"); - goto ERREUR; - } - if (strcmp(type_machine,"LE")==0) - { - swab( (void*)&lg_enreg, (void*)&lgtemp,4 ); - cai_inverser_tableau((short *)&lg_enreg, (short *)&lgtemp,2); - } - - /*------------------------------------------------------*/ - /* Retour au debut du fichier LEADER */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( descrip_leader , 0L , 0 ); - if ( cr_lseek == -1 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT1a4"); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Saut de lg_enreg + 996 octets dans LEADER */ - /*------------------------------------------------------*/ - - lg_saut = (long)(lg_enreg + 996); - cr_lseek = lseek ( descrip_leader , lg_saut , 0 ); - if ( cr_lseek == -1 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT1a4"); - goto ERREUR; - } - /*------------------------------------------------------*/ - /* Lecture du nombre de colonnes dans LEADER */ - /*------------------------------------------------------*/ - - cr_read = read (descrip_leader, TABLEAU[0], 16); - if ( cr_read != 16 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT1a4"); - goto ERREUR; - } - TABLEAU[0][16] = '\0'; /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for (i=0;i<16;i++) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sscanf ( TABLEAU[0], "%d", nb_col); - - /*------------------------------------------------------*/ - /* Lecture du nombre de lignes dans LEADER */ - /*------------------------------------------------------*/ - - cr_read = read (descrip_leader, TABLEAU[0], 16); - if ( cr_read != 16 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT1a4"); - goto ERREUR; - } - TABLEAU[0][16] = '\0'; /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for (i=0;i<16;i++) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sscanf ( TABLEAU[0], "%d", nb_lig); - - /*------------------------------------------------------*/ - /* Saut de 16 octets dans LEADER */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( descrip_leader , 16L , 1 ); - if ( cr_lseek == -1 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT1a4"); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Lecture du nombre de canaux dans LEADER */ - /*------------------------------------------------------*/ - - cr_read = read (descrip_leader, TABLEAU[0], 16); - if ( cr_read != 16 ) - { - strcpy(CAI_ERREUR,"Erreur acces au fichier leader SPOT1a4"); - goto ERREUR; - } - TABLEAU[0][16] = '\0'; /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for (i=0;i<16;i++) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sscanf ( TABLEAU[0], "%d", nb_can); - } /*fin test3 (v==0)*/ - - else if (test5==0) - { - /********************************************************/ - /* tests de determination du fichier VOLUME sous repert */ - /********************************************************/ - - sprintf(path_rep, "%s%s%s%s%s", repert, car,nom_image, - car,dp->d_name); - - /*ouverture du fichier VOLUME*/ - - descrip_volume = open (path_rep, O_RDWR|O_BINARY ); - if (descrip_volume == -1) - { - strcpy(CAI_ERREUR, - "Erreur d'ouverture du fichier VOLUME SPOT1a4"); - goto ERREUR; - } - } - /********************************************************/ - /* tests de determination du fichier IMAGERY sous repert */ - /********************************************************/ - - else if (test4==0) - { - - /*ouverture du fichier IMAGERY*/ - - descrip_imagery = open (nom_fic_ima, O_RDWR |O_BINARY); - if (descrip_imagery == -1) - { - strcpy(CAI_ERREUR, - "Erreur d'ouverture du fichier IMAGERY SPOT1a4"); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Lecture de la taille de l'entete dans IMAGERY */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( descrip_imagery , 8L , 1); - if ( cr_lseek == -1 ) - { - strcpy(CAI_ERREUR, - "Erreur acces au fichier contenant donnees SPOT1a4"); - goto ERREUR; - } - - cr_read = read ( descrip_imagery , &lg_entete , 4 ); - if ( cr_read == -1 ) - { - strcpy(CAI_ERREUR, - "Erreur acces au fichier contenant donnees SPOT"); - goto ERREUR; - } - if (strcmp(type_machine,"LE")==0) - { - swab( (void*)&lg_entete, (void*)&lgtemp,4 ); - cai_inverser_tableau((short *)&lg_entete, - (short *)&lgtemp,2); - } - - } /*fin else if test4*/ - - } /*fin else test1 test2*/ - - } /*fin while*/ - - closedir(dirp); - - } /*fin if (dirp=!NULL)*/ - -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - for (i=0;i<*nb_can;i=i+1) - { - image1->ACCES_CANAL_INT[i]=descrip_imagery; - image1->ACCES_SPOT[0]=descrip_leader; - image1->ACCES_SPOT[1]=descrip_volume; - image1->POS_OCTET[i]=lg_entete; - } - image1->TYPE_SPOT = type_spot; - image1->NBOCT_PIX = *nboct_pix; - - } /* fin TYPE IMAGE SPOT 1 a 4 */ - /*===========================*/ - -/*=============================================*/ -/* TRAITEMENT D'UNE IMAGE AU FORMAT SPOT 5 TIF */ -/*=============================================*/ - else if (type_spot == 2) - { - -/* Ouverture de l'image */ - image1 = cai_ouvre_modifie_image (nom_fic_spot5, "TIFF", - nb_can,nboct_pix,nb_col,nb_lig); - - if (image1 == NULL) - { - strcpy(CAI_ERREUR, - "Erreur acces au fichier image TIFF contenant donnees SPOT5TIF"); - goto ERREUR; - } - - image1->NB_CANAUX = *nb_can ; - image1->NBOCT_PIX = *nboct_pix ; - image1->NB_COL = *nb_col ; - image1->NB_LIG = *nb_lig ; - image1->TYPE_SPOT = type_spot; - image1->ACCES_SPOT[0]=0; - image1->ACCES_SPOT[1]=0; - - - } /* fin TYPE IMAGE SPOT 5 TIFF */ - /*============================*/ - -/*=============================================*/ -/* TRAITEMENT D'UNE IMAGE AU FORMAT SPOT 5 BIL */ -/*=============================================*/ - else - { - - image1= NULL; - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - image1->ACCES_SPOT[0]=0; - image1->ACCES_SPOT[1]=0; - -/*****************************************************************************/ -/* tests sur les retours d'allocation memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR, - "Erreur allocation memoire dans cai_ouvre_modifie_image SPOT5TIF"); - goto ERREUR; - } - - /* Recherche du leader Dimap */ - dirp=opendir(nom_rep); - Trouve=0; - if(dirp!=NULL) - { - while( (dp=readdir(dirp))!=NULL ) - { - - /*---------------------------------------------*/ - /* on ne doit pas tenir compte des . et .. */ - /* sous le repertoire courant */ - /*---------------------------------------------*/ - - test1 = strcmp(dp->d_name, "."); - test2 = strcmp(dp->d_name, ".."); - - if ( (test1 != 0) && (test2 != 0) ) - { - -/*****************************************************************/ -/* MOD : VERSION : 4.7 : DM : LEAD_01.DAT devient METADATA.DIM */ -/*****************************************************************/ - test3 = strncasecmp(dp->d_name,"METADATA.DIM", 12); - - /**************************************************************/ - /* tests de determination du fichier METADATA.DIM sous repert */ - /**************************************************************/ - if (test3==0) - { - sprintf(nom_leader, "%s%s%s%s%s", repert,car, nom_image, - car, dp->d_name); - -/* Extraction du nombre de lig col can et nboct du fichier DIMAP */ -/*...............................................................*/ - icr = cai_lire_dimensions_spot5(nom_leader,nb_can,nboct_pix , - nb_col , nb_lig,byteorder, - &skipbytes ); - if (icr != CAI_OK) - { - goto ERREUR; - } - else - Trouve=1; - } - } /*fin else test1 test2*/ - - } /*fin while*/ - - closedir(dirp); - - } /*fin if (dirp=!NULL)*/ - - if (Trouve==0) - { - sprintf(CAI_ERREUR, - "Erreur Le fichier METADATA.DIM n'existe pas ou erreur de lecture"); - goto ERREUR; - } - - -/* INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - nom_fic_canal[0]='\0'; - - sprintf(nom_fic_canal,"%s",nom_fic_spot5); - - num=open(nom_fic_canal,O_RDWR|O_BINARY,0); - if (num!= -1) - { - for (i=0;i<*nb_can;i=i+1) - { - image1->ACCES_CANAL_INT[i]=num; - image1->POS_OCTET[i]=(*nb_col)*i*(*nboct_pix)+skipbytes; - } - image1->TYPE_SPOT = type_spot; - image1->NBOCT_PIX = *nboct_pix; - if (byteorder[0]=='M') - { - if (strcmp(type_machine,"BE")==0) - image1->INV_OCTETS=0; - else - image1->INV_OCTETS=1; - } - else - { - if (strcmp(type_machine,"LE")==0) - image1->INV_OCTETS=0; - else - image1->INV_OCTETS=1; - } - - } - else - { - strcpy(CAI_ERREUR, - "Erreur ouverture fichier BIL contenant donnees SPOT5"); - goto ERREUR; - } - - } /* fin TYPE IMAGE SPOT 5 BIL */ - /*===========================*/ - - return(image1); - - -ERREUR: - if (type_spot==1) - { - if (descrip_leader >0) close(descrip_leader); - if (descrip_imagery >0) close(descrip_imagery); - if (descrip_volume >0) close(descrip_volume); - } - else - icr = cai_ferme_spot(typspot,image1); - - if (image1!=NULL) free(image1); - return(NULL); -} - -/* - Fin de l'operation cai_ouvre_modifie_spot -*/ -/******************************************************************************/ -/* */ -/*OPERATION : cai_lead4to5spot */ -/* */ -/*ROLE : Cette operation genère un fichier XML de donnees auxiliaires SPOT5 */ -/* a partir du fichier Leader donne en parametre */ -/* */ -/*CONTEXTE D'APPEL : */ -/* */ -/*RETOUR : CAI_OK si tout va bien , CAI_KO sinon */ -/* */ -/******************************************************************************/ - -/* MOD : VERSION : 4.5 : FA : erreur d'ecriture detector id lookangle pour PAN*/ - -CAI_OK_KO cai_lead4to5spot ( CAI_IMAGE *desc_im , char *repertoire ) -{ - CAI_OK_KO cr; - /* Variables destinees aux noms des fichiers manipules */ - - FILE *des; - char chemin_descripteur[1024] ; - /* Variables destinees aux controles de la lecture des fichiers */ - /* int desc_lead;*/ - - int BadFlag[4],Bad,type; - int desc_lead , desc_vol , desc_img; - int detect_id; - int lg_enreg ; /* longueur de l'enregistrement et retour de read */ - long cr_lseek , lg_saut; /* retour de lseek et saut demande */ - long cr_read; - - int i , x , j , ind_gains;/* indices de boucle */ - int can; - char TABLEAU[4][257]; /* variable destinee a la lecture des octets */ - - /* Variables stockant les donnees auxiliaires lues */ - - int nb_col , nb_lig; /* nbre de lignes et de colonnes */ - int K , J , nb_bs; /* valeurs K,J,decalage et nbre canaux */ - int ind_max; - int anneecal , moiscal , jourcal; - - char scene_id[17] ; /* identifiant de scene */ - char grille_ref[8] ; /* grille de reference K J */ - char shift_val[2] ; /* shift value */ - char latc[17] , lonc[17] ; /* lat lon au centre de scene */ - - char latse[17] , latso[17]; /* lat lon aux 4 coins */ - char latne[17] , latno[17]; /* */ - char lonse[17] , lonso[17]; /* */ - char lonne[17] , lonno[17]; /* */ - char al[17] , bl[17] , cl[17]; - char ap[17] , bp[17] , cp[17]; - - double lat_c ,lon_c; /* valeurs en double des latitudes et */ - double lat_se, lat_so; /* longitudes au centre de scene et */ - double lon_se , lon_so; /* 4 coins de scene */ - double lat_ne , lat_no; - double lon_ne , lon_no; - double lat_nad , long_nad; - double yawdeg , yawrad; - - char colc1[17] , ligc1[17]; /* Lignes et colonnes aux 4 coins */ - char colc2[17] , ligc2[17]; - char colc3[17] , ligc3[17]; - char colc4[17] , ligc4[17]; - int nbl_c , nbc_c; /* x y ligne et colonne centre de scene */ - int ivaleur; - char Valeur[17]; - - char decal_lat[17]; /* Decalage latitude */ - char decal_lon[17]; /* Decalage longitude */ - char longnad[17]; /* latitude nadir */ - char latnad[17]; /* longitude nadir */ - char datecalib[11]; - char datecentre[17]; - char datecal[9]; - char relativedatecalib[16][20]; - int relativeannee , relativemois , relativejour ; - char mapproj[33] ; /* Projection cartographique */ - char gains_a[4][9]; /* coefficient de calibration */ - char gains_b[4][9]; /* offset de calibration */ - char nb_gains[4][5]; /* nombre de gains */ - char date[11] ; /* date d'acquisition */ - char stepnum[5] ; - char heure[10] ; /* heure d'acquisition */ - char coupled[3] , sec[3] ; /* minute , seconde */ - char niv_trait[17] ; /* niveau de traitement */ - char direct_playback[17] ; - char compression[17] ; - char instrument[6] ; /* instrument HRV */ - char time_angle[73][27]; - char timeyaw[3][27]; - float gain_value[16][1500]; - float dark_value[16][1500]; - float anglin ; - short int val,valtemp ; - float val_float ; - int type_gain , ind_gain_val , ind_dark_val ; - int instrument_index , ind_tab_gain ; - int line[73] , line_raw[2] ; - char yaw[73][20] ,pitch[73][20] ,roll[73][20] ; - char yaw_angle[2][20] , pitch_angle[2][20] , roll_angle[2][20]; - double psi_x_first[3] ,psi_y_first[3] ,psi_x_last[3] ,psi_y_last[3]; - double psideg , periodeligne ; - char lineperiod[13] , outofrange[3] ; - char ins_ind[2] ; - char sat_ind[2] ; - char mode_spect[17]; /* mode spectral */ - char satellite[5]; /* nom du satellite */ - int satellite_index ; - char revolution[17]; /* revolution number */ - char band_layout[17]; - char spect_ind[17]; /* indicateur de bandes */ - char sat_alt[9]; /* altitude du satellite */ - char nb_leader[9]; /* nb enregistrements leader */ - char lg_leader[9] ; /* lg enregistrements leader */ - char nb_imagery[9] ; /* nb enregistrements imagery */ - char lg_imagery[9] ; /* lg enregistrements imagery */ - char nbima_imagery[9] ; /* nb enregist imagery image */ - char nb_trailer[9] ; /* nb enregistrements trailer */ - char lg_trailer[9] ; /* lg enregistrements trailer */ - char fpixraw[9] , flineraw[9] , fpix1b[9] , fline1b[9]; - char taille_pixlig[17]; /* taille pixel sur les lignes */ - char taille_pixcol[17]; /* taille pixel sur les colonnes */ - char x0[33] , y0[33]; /* coordonnees en pixel 1,1 */ - char lgx[17] , lgy [17]; /* longueur image en X et Y */ - char im[17] , deltai[17] , jm[17] ,deltaj[17]; - char lm[17] , deltal[17] , pm[17] , deltap[17]; - char valeur[100]; - char prod_info[31]; - char mean[9]; - char lowtresh[4][9]; - char uptresh[4][9]; - char firstwave[4][20]; - double unwave ; - double wavelong ; - char wavelengthstep[4][20] , solar_irradiance[4][5]; - char spectral_sensitivitie[4][64][6]; - char shval[9] , segmentstart[9] , scenestart[9] , segmentend[9]; - char resampling[3]; - int utdatej , utdates; - char p7[17] ,p8[17] ,p9[17] ,p10[17] ; - char axis[13] , ascension[13] , latarg[13]; - char ex[17] , ey[17] , inclin[13]; - char coeffi[17] , ai[17] , bi[17] , ci[17] , di[17] , ei[17]; - char coeffj[17] , aj[17] , bj[17] , cj[17]; - char coeff_a[17] , aa[17] , ba[17] , ca[17] , da[17]; - char coeff_b[17] , ab[17] , bb[17] , cb[17] , db[17] , eb[17]; - char coeff_l[17] , a_l[17] , b_l[17] , d_l[17] , e_l[17] , c_l[17]; - char coeff_p[17] , a_p[17] , b_p[17] , c_p[17]; - char alswir[17] , blswir[17] , clswir[17] , apswir[17] , bpswir[17]; - char cpswir[17],car[2]; - int jourjul; - int datejul; - char clockvalue[13] ; - char clockperiod[13] ; - double period , pico ; - char boardtime[13]; - double X_loc[9] , Y_loc[9] , Z_loc[9]; - double X_vel[9] , Y_vel[9] , Z_vel[9]; - char time[9][28]; - char dorisused[3]; - char time_scenecenter[31]; - char timecenter[18]; - char angle_in[17] , angle_o[17]; /* angles incidence et orientation Nord */ - char sunazim[17], sunelev[17]; /* azimut et elevation solaire */ - char *profile; - - int signe , swir ; /* signe des lat lon ( +1 ou -1 ) */ - char mirror_step[17] ; /* nombre de pas mirroir */ - int nbpix ; /* nombre de pixels */ - char satn , insn; - char insid, codecapt; - char a0 , a1 , m0 , m1 , j0 , j1 , h0 , h1 , mi0 , mi1 , s0 , s1 ; - char aprim0 , aprim1 , mprim0 , mprim1 , jprim0 , jprim1 , hprim0 , hprim1 , miprim0 , miprim1 , sprim0 , sprim1 ; - char datasetname[40]; - char datasetname_centre[40]; - char dsetname[25]; - char dsetname_centre[25]; - char toto[32] , coeffa[17] , coeffb[17], coeffc[17] , coeffd[17]; - char coeffe[17] , coefff[17] , coeffap[17] , coeffbp[17] ; - char coeffcp[17] , coeffdp[17] , coeffep[17] , coefffp[17]; - char rlma[17] , rlmb[17], rlmc[17] , rlmd[17]; - char rlme[17] , rlmf[17] , rlmap[17] , rlmbp[17] ; - char rlmcp[17] , rlmdp[17] , rlmep[17] , rlmfp[17]; - long jours[9]; - long jourscenter ; - int nb_passage = 0; - double secondescenter ; - double secondes[9]; - double milisecondes[9]; - - /* variables destinees a lire dans le voldir */ - - char job_id[17] , produser[13] , product_type[17]; - char software_name[13] , processing_center[9]; - int product_sec , product_min , product_heure; - int product_annee , product_jour , product_mois; - char copyright[100] , source_description[200]; - - /* variables destinees a lire dans le imagery */ - - unsigned char bad_line[10000][4]; - -/* Initialisations diverses */ -/*--------------------------*/ - for (i=0 ; i<16 ; i++) - { - for (j=0 ; j<1500 ; j++) - { - gain_value[i][j] = 0.0; - dark_value[i][j] = 0.0; - } - } - signe=1; - desc_lead = desc_im->ACCES_SPOT[0]; - desc_vol = desc_im->ACCES_SPOT[1]; - desc_img = desc_im->ACCES_CANAL_INT[0]; - - car[0]='/'; - -#ifdef _WIN - car[0]='\\'; -#endif - - - /* construction du chemin complet du fichier xml a generer */ - sprintf ( chemin_descripteur , "%s%sSPOT_DIMAP.xml" , repertoire, car); - - /********************************************************/ - /* LECTURE DU FICHIER LEADER */ - /********************************************************/ - - cr_lseek = lseek ( desc_lead , 8L , 1 ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* lecture de la longueur de l'enregistrement */ - /*------------------------------------------------------*/ - lg_enreg = 0; - cr_read = read ( desc_lead , &lg_enreg , 4 ); - - if ( cr_read == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_read ); - goto ERREUR; - } - /*------------------------------------------------------*/ - /* Retour au debut du fichier */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 0L , 0 ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Saut de 52 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 52 , SEEK_SET ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /********************************************************/ - /* LEADER FILE DESCRIPTOR RECORD */ - /********************************************************/ - - /*------------------------------------------------------*/ - /* Lecture du code capteur */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 13 ); - - if ( cr_read != 13 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - TABLEAU[0][13] = '\0'; - - for ( i = 0 ; i < 13 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - codecapt = '\0'; - toto[0] ='\0'; - sscanf ( TABLEAU[0] , "%c%s" , &codecapt , toto ); - - /*------------------------------------------------------*/ - /* Retour au debut du fichier */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 0L , 0 ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Saut de lg_enreg + 20 octets */ - /*------------------------------------------------------*/ - - lg_saut = (long)( 3960 + 20); - - cr_lseek = lseek ( desc_lead , lg_saut , SEEK_SET ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /********************************************************/ - /* LEADER HEADER RECORD */ - /********************************************************/ - - /*------------------------------------------------------*/ - /* Lecture des coeeficients K et J */ - /*------------------------------------------------------*/ - - for ( x = 0 ; x < 2 ; x++ ) - { - cr_read = read ( desc_lead, TABLEAU[x], 3 ); - if ( cr_read != 3 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[x][3] = '\0'; - - for ( i = 0 ; i < 3 ; i++ ) - { - TABLEAU[x][i] = TABLEAU[x][i] & 0177; - } - } - K=0; - J=0; - sscanf ( TABLEAU[0], "%d", &K ); - sscanf ( TABLEAU[1], "%d", &J ); - sprintf ( grille_ref , "%.3d%.3d" , K , J ); - - /*------------------------------------------------------*/ - /* Lecture de shift value */ - /*------------------------------------------------------*/ - - /* sauter le slash */ - - cr_lseek = lseek ( desc_lead , 1 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - cr_read = read ( desc_lead , TABLEAU[0] , 1 ); - - if ( cr_read != 1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - TABLEAU[0][1] = '\0'; - - for ( i = 0 ; i < 1 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - shift_val[0]='\0'; - sscanf ( TABLEAU[0] , "%s" , shift_val ); - - /*------------------------------------------------------*/ - /* Saut de 8 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 8 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Lecture de l'identifiant de scene */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - TABLEAU[0][16] = '\0'; - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - - sprintf ( scene_id , "\0" ); - sscanf ( TABLEAU[0] , "%s" , scene_id ); - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : FA : Prise en compte date de la scene non shiftée */ -/****************************************************************************/ strcpy ( datecentre , scene_id ); - - /*------------------------------------------------------*/ - /* Lecture de shift along track ( decal_lat ) */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - TABLEAU[0][16] = '\0'; - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( decal_lat , "\0" ); - sscanf ( TABLEAU[0] , "%s" , decal_lat ); - - /*------------------------------------------------------*/ - /* Lecture de shift along track ( decal_lon ) */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - TABLEAU[0][16] = '\0'; - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( decal_lon, "\0" ); - sscanf ( TABLEAU[0] , "%s" , decal_lon ); - - /*------------------------------------------------------*/ - /* Lecture de la latitude du centre de la scene */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( latc , "\0" ); - lat_c=0; - sscanf ( TABLEAU[0] , "%s" , latc ); - cai_DMS_To_Float ( latc , &lat_c ); - - /*------------------------------------------------------*/ - /* Lecture de la longitude du centre de la scene */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( lonc , "\0" ); - lon_c=0; - sscanf ( TABLEAU[0] , "%s" , lonc ); - cai_DMS_To_Float ( lonc , &lon_c ); - - /*------------------------------------------------------*/ - /* lecture des coordonnees lignes au centre de scene */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - nbc_c = 0; - sscanf ( TABLEAU[0] , "%d" , &nbc_c ); - - /*------------------------------------------------------*/ - /* lecture des coordonnees colonnes au centre de scene */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead , TABLEAU[0] , 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - nbl_c = 0; - sscanf ( TABLEAU[0] , "%d" , &nbl_c ); - /*------------------------------------------------------*/ - /* Lecture de la latitude NO */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - sprintf ( latno , "\0" ); - - lat_no=0; - - sscanf ( TABLEAU[0] , "%s" , latno ); - cai_DMS_To_Float ( latno , &lat_no ); - - /*------------------------------------------------------*/ - /* Lecture de la longitude NO */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( lonno , "\0" ); - lon_no=0; - sscanf ( TABLEAU[0] , "%s" , lonno ); - cai_DMS_To_Float ( lonno , &lon_no ); - - /*------------------------------------------------------*/ - /* Lecture ligne coin NO */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( ligc1 , "\0" ); - sscanf ( TABLEAU[0] , "%s" ,ligc1 ); - - /*------------------------------------------------------*/ - /* Lecture colonne coin NO */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( colc1 , "\0" ); - sscanf ( TABLEAU[0] , "%s" , colc1 ); - - /*------------------------------------------------------*/ - /* Lecture de la latitude NE */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( latne , "\0" ); - sscanf ( TABLEAU[0] , "%s" , latne ); - cai_DMS_To_Float ( latne , &lat_ne ); - - /*------------------------------------------------------*/ - /* Lecture de la longitude NE */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( lonne , "\0" ); - sscanf ( TABLEAU[0] , "%s" , lonne ); - cai_DMS_To_Float ( lonne , &lon_ne ); - - /*------------------------------------------------------*/ - /* Lecture ligne coin NE */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( ligc2 , "\0" ); - sscanf ( TABLEAU[0] , "%s" , ligc2 ); - - /*------------------------------------------------------*/ - /* Lecture colonne coin NE */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( colc2 , "\0" ); - sscanf ( TABLEAU[0] , "%s" , colc2 ); - - /*------------------------------------------------------*/ - /* Lecture de la latitude SO */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( latso , "\0" ); - sscanf ( TABLEAU[0] , "%s" , latso ); - cai_DMS_To_Float ( latso , &lat_so ); - - /*------------------------------------------------------*/ - /* Lecture de la longitude SO */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( lonso , "\0" ); - sscanf ( TABLEAU[0] , "%s" , lonso ); - cai_DMS_To_Float ( lonso , &lon_so ); - - /*------------------------------------------------------*/ - /* Lecture ligne coin SO */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( ligc3 , "\0" ); - sscanf ( TABLEAU[0] , "%s" , ligc3 ); - - /*------------------------------------------------------*/ - /* Lecture colonne coin SO */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( colc3 , "\0" ); - sscanf ( TABLEAU[0] , "%s" , colc3 ); - - /*------------------------------------------------------*/ - /* Lecture de la latitude SE */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( latse , "\0" ); - sscanf ( TABLEAU[0] , "%s" , latse ); - cai_DMS_To_Float ( latse , &lat_se ); - - /*------------------------------------------------------*/ - /* Lecture de la longitude SE */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( lonse , "\0" ); - sscanf ( TABLEAU[0] , "%s" , lonse ); - cai_DMS_To_Float ( lonse , &lon_se ); - - /*------------------------------------------------------*/ - /* Lecture ligne coin SE */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf (ligc4 , "\0" ); - sscanf ( TABLEAU[0] , "%s" , ligc4 ); - - /*------------------------------------------------------*/ - /* Lecture colonne coin SE */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( colc4 , "\0" ); - sscanf ( TABLEAU[0] , "%s" , colc4 ); - - /*------------------------------------------------------*/ - /* Lecture latitude nadir centre */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( latnad , "\0" ); - lat_nad = 0; - sscanf ( TABLEAU[0] , "%s" , latnad ); - cai_DMS_To_Float ( latnad , &lat_nad ); - - /*------------------------------------------------------*/ - /* Lecture longitude nadir centre */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( longnad , "\0" ); - long_nad = 0; - sscanf ( TABLEAU[0] , "%s" , longnad ); - cai_DMS_To_Float ( longnad , &long_nad ); - - /*------------------------------------------------------*/ - /* Lecture de l'angle d'orientation */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead , TABLEAU[0] , 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( angle_o , "\0" ); - sscanf ( TABLEAU[0] , "%s" , angle_o ); - - /*------------------------------------------------------*/ - /* Lecture de l'angle d'incidence */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead , TABLEAU[0] , 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; /* Pour ne pas lire les char suivants */ - - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( angle_in , "\0" ); - sscanf ( TABLEAU[0] , "%s" , angle_in ); - - /*------------------------------------------------------*/ - /* Lecture de l'azimut solaire */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( sunazim , "\0" ); - sscanf ( TABLEAU[0] , "%s" , sunazim ); - - /*------------------------------------------------------*/ - /* Lecture de l'elevation solaire */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( sunelev , "\0" ); - sscanf ( TABLEAU[0] , "%s" , sunelev ); - - /*------------------------------------------------------*/ - /* Lecture de l'altitude du satellite */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( sat_alt , "\0" ); - sscanf ( TABLEAU[0] , "%s" , sat_alt ); - - /*------------------------------------------------------*/ - /* Saut de 72 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 72 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Lecture de la date */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - date[0]='\0'; - mi0='\0'; - mi1='\0'; - a0='\0'; - a1='\0'; - m0='\0'; - m1='\0'; - j0='\0'; - j1='\0'; - miprim0='\0'; - miprim1='\0'; - aprim0='\0'; - aprim1='\0'; - mprim0='\0'; - mprim1='\0'; - jprim0='\0'; - jprim1='\0'; - - sscanf ( TABLEAU[0] , "%s" , date ); - sscanf ( date , "%c%c%c%c%c%c%c%c" , &mi0 , &mi1 , &a0 , - &a1 , &m0 , &m1 , &j0 , &j1 ); - sprintf ( date , "%c%c%c%c-%c%c-%c%c" , mi0 , mi1 , a0 , a1 , m0 , m1 , j0 , j1 ); - - /*------------------------------------------------------*/ - /* Lecture de l'heure */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 9 ); - - if ( cr_read != 9 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][9] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 9 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - heure[0]='\0'; - toto[0]='\0'; - h0='\0'; - h1='\0'; - insid='\0'; - insn='\0'; - s1='\0'; - s0='\0'; - hprim0='\0'; - hprim1='\0'; - sprim1='\0'; - sprim0='\0'; - - satn='\0'; - sscanf ( TABLEAU[0] , "%s" , heure ); - - sscanf ( heure , "%c%c%c%c%c%c%s" , &h0 , &h1 , &mi0 , &mi1 , &s0 , &s1 , toto ); - - sprintf ( heure , "%c%c:%c%c:%c%c" , h0 , h1 , mi0 , mi1 , s0 , s1 ); - sscanf ( scene_id , "S%c%c%c%s" , &satn , &insid , &insn ,toto ); - - sprintf ( datasetname , "%c %.3d-%.3d %c%c/%c%c/%c%c %c%c:%c%c:%c%c %c %c\0" , - satn , K , J , a0 , a1 , m0 , m1 , j0 , j1 , h0 , - h1 , mi0 , mi1 , s0 , s1 , insn , codecapt ); - - sscanf ( &datecentre[15] , "%c" , &sprim1 ); - datecentre[15] = '\0' ; - sscanf ( &datecentre[14] , "%c" , &sprim0 ); - datecentre[14] = '\0' ; - sscanf ( &datecentre[13] , "%c" , &miprim1 ); - datecentre[13] = '\0' ; - sscanf ( &datecentre[12] , "%c" , &miprim0 ); - datecentre[12] = '\0' ; - sscanf ( &datecentre[11] , "%c" , &hprim1 ); - datecentre[11] = '\0' ; - sscanf ( &datecentre[10] , "%c" , &hprim0 ); - datecentre[10] = '\0' ; - sscanf ( &datecentre[9] , "%c" , &jprim1 ); - datecentre[9] = '\0' ; - sscanf ( &datecentre[8] , "%c" , &jprim0 ); - datecentre[8] = '\0' ; - sscanf ( &datecentre[7] , "%c" , &mprim1 ); - datecentre[7] = '\0' ; - sscanf ( &datecentre[6] , "%c" , &mprim0 ); - datecentre[6] = '\0' ; - sscanf ( &datecentre[5] , "%c" , &aprim1 ); - datecentre[5] = '\0' ; - sscanf ( &datecentre[4] , "%c" , &aprim0 ); - datecentre[4] = '\0' ; -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Rajout SCENE au début de chaine DATASET_NAME */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : DIMAP Ajouter un espace entre SCENE et numsat */ -/* dans le DATASET_NAME */ -/*****************************************************************************/ - sprintf ( datasetname_centre , "SCENE %c %.3d-%.3d %c%c/%c%c/%c%c %c%c:%c%c:%c%c %c %c\0" , - satn , K , J , aprim0 , aprim1 , mprim0 , mprim1 , jprim0 , jprim1 ,hprim0 , - hprim1 , miprim0 , miprim1 , sprim0 , sprim1 , insn , codecapt ); - sprintf ( dsetname , "%c%.3d%.3d%c%c%c%c%c%c%c%c%c%c%c%c%c%c\0" , - satn , K , J , a0 , a1 , m0 , m1 , j0 , j1 , h0 , - h1 , mi0 , mi1 , s0 , s1 , insn , codecapt ); - - sprintf ( dsetname_centre , "%c%.3d%.3d%c%c%c%c%c%c%c%c%c%c%c%c%c%c\0" , - satn , K , J , aprim0 , aprim1 , mprim0 , mprim1 , jprim0 , jprim1 , hprim0 , - hprim1 , miprim0 , miprim1 , sprim0 , sprim1 , insn , codecapt ); - - - /*------------------------------------------------------*/ - /* Saut de 15 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 15 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Lecture du nom de satellite */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 4); - - if ( cr_read != 4 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][4] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 4 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( satellite , "\0" ); - sscanf ( TABLEAU[0] , "%s" , satellite ); - - /*------------------------------------------------------*/ - /* Lecture du num de satellite */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - satellite_index = 0; - sscanf ( TABLEAU[0] ,"%d" , &satellite_index ); - - /*------------------------------------------------------*/ - /* Lecture du nom d'instrument */ - /*------------------------------------------------------*/ - - if ( satellite_index != 4 ) - { - cr_read = read ( desc_lead, TABLEAU[0], 3 ); - - if ( cr_read != 3 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][3] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 3 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - sprintf ( instrument , "\0" ); - sscanf ( TABLEAU[0] , "%s" , instrument ); - - cr_read = read ( desc_lead, TABLEAU[0], 13 ); - - if ( cr_read != 13 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][13] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 13 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - instrument_index=0; - sscanf ( TABLEAU[0] , "%d" , &instrument_index ); - } - else - { - cr_read = read ( desc_lead, TABLEAU[0], 5 ); - - if ( cr_read != 5 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][5] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 5 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( instrument , "\0" ); - sscanf ( TABLEAU[0] , "%s" , instrument ); - - cr_read = read ( desc_lead, TABLEAU[0], 11 ); - - if ( cr_read != 11 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][11] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 11 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - instrument_index=0; - sscanf ( TABLEAU[0] , "%d" , &instrument_index ); - } - - /*------------------------------------------------------*/ - /* Lecture du mode spectral */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( mode_spect , "\0" ); - sscanf ( TABLEAU[0] , "%s" , mode_spect ); - - /*------------------------------------------------------*/ - /* Lecture du revolution number */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( revolution , "\0" ); - sscanf ( TABLEAU[0] , "%s" , revolution ); - - /*------------------------------------------------------*/ - /* Lecture du nombre de pas mirroir */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( mirror_step , "\0" ); - sscanf ( TABLEAU[0] , "%s" , mirror_step ); - - /*------------------------------------------------------*/ - /* Lecture du mode de compression */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( compression , "\0" ); - sscanf ( TABLEAU[0] , "%s" , compression ); - - /*------------------------------------------------------*/ - /* Lecture du direct playback */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( direct_playback , "\0" ); - sscanf ( TABLEAU[0] , "%s" , direct_playback ); - - /*------------------------------------------------------*/ - /* Lecture du nombre_de_gains */ - /*------------------------------------------------------*/ - - for ( j=0 ; j < 4 ; j++ ) - { - cr_read = read ( desc_lead, TABLEAU[0], 4 ); - - if ( cr_read != 4 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][4] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i=0 ; i < 4 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - sprintf(nb_gains[j],"\0"); - sscanf ( TABLEAU[0] , "%s" , nb_gains[j] ); - } - - /*------------------------------------------------------*/ - /* Lecture du step_num */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 4 ); - - if ( cr_read != 4 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][4] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 4 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - sprintf ( stepnum , "\0" ); - sscanf ( TABLEAU[0] , "%s" , stepnum ); - - /*------------------------------------------------------*/ - /* Lecture du coupled mode */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 2 ); - - if ( cr_read != 2 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][2] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i=0 ; i < 2 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - sprintf ( coupled , "\0" ); - - sscanf ( TABLEAU[0] , "%s" , coupled ); - - /*------------------------------------------------------*/ - /* Saut de 250 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 250 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Lecture du nombre de colonnes */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i=0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - nb_col=0; - sscanf ( TABLEAU[0], "%d", &nb_col ); - - /*------------------------------------------------------*/ - /* Lecture du nombre de lignes */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i=0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - nb_lig=0; - sscanf ( TABLEAU[0], "%d", &nb_lig ); - - /*------------------------------------------------------*/ - /* Lecture de bands layout */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i=0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - sprintf ( band_layout, "\0" ); - sscanf ( TABLEAU[0] , "%s" , band_layout ); - - /*------------------------------------------------------*/ - /* Lecture du nombre de Bandes spectrales */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - nb_bs=0; - sscanf ( TABLEAU[0], "%d", &nb_bs ); - - /*------------------------------------------------------*/ - /* Lecture indicateur de Bandes spectrales */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - sprintf ( spect_ind , "\0" ); - strcpy ( spect_ind , TABLEAU[0] ); - - /*------------------------------------------------------*/ - /* Saut de 240 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 240 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture du niveau de traitement */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - sprintf ( niv_trait , "\0" ); - - sscanf ( TABLEAU[0] , "%s" , niv_trait ); - if (strlen(niv_trait)==0) sprintf ( niv_trait , "0" ); - - /*------------------------------------------------------*/ - /* Saut de 32 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 32 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture de resampling method */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( resampling , "\0" ); - sscanf ( TABLEAU[0] , "%s" , resampling ); - - /*-------------------------------------------------------*/ - /* Lecture de la taille des pixels sur les lignes */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( taille_pixlig , "\0" ); - sscanf ( TABLEAU[0] , "%s" , taille_pixlig ); - - /*-------------------------------------------------------*/ - /* Lecture de la taille des pixels sur les colonnes */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( taille_pixcol , "\0" ); - sscanf ( TABLEAU[0] , "%s" , taille_pixcol ); - - /*-------------------------------------------------------*/ - /* Lecture de la projection cartographique */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 32); - - if ( cr_read != 32 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][32] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 32 ; i++) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( mapproj , "\0" ); - sscanf ( TABLEAU[0] , "%s" , mapproj ); - - /*-------------------------------------------------------*/ - /* Lecture longueur image en Y */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( lgy , "\0" ); - sscanf ( TABLEAU[0] , "%s" , lgy ); - - /*-------------------------------------------------------*/ - /* Lecture longueur image en X */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( lgx , "\0" ); - sscanf ( TABLEAU[0] , "%s" , lgx ); - - /*-------------------------------------------------------*/ - /* Lecture Mean_Rectification_Elevation (2A) */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 9 ); - - if ( cr_read != 9 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][9] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 9 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( mean , "\0" ); - sscanf ( TABLEAU[0] , "%s" , mean ); - - /*------------------------------------------------------*/ - /* Saut de 143 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 143 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture coordonnees X pixel 1,1 */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( x0 , "\0" ); - sscanf ( TABLEAU[0] , "%s" , x0 ); - - /*-------------------------------------------------------*/ - /* Lecture coordonnees Y pixel 1,1 */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( y0, "\0" ); - sscanf ( TABLEAU[0] , "%s" , y0 ); - - /*------------------------------------------------------*/ - /* Saut de 96 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 96 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture date de calibration */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead , TABLEAU[0] , 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - sprintf ( datecal , "\0" ); - - jourcal=0; - moiscal=0; - anneecal=0; - sscanf ( TABLEAU[0] , "%s" , datecal ); - if (strlen(datecal) != 0) - { - sscanf ( &datecal[6] , "%d" , &jourcal ); - datecal[6] = '\0'; - sscanf ( &datecal[4] , "%d" , &moiscal ); - - datecal[4] = '\0'; - sscanf ( datecal, "%d" , &anneecal ); - } - sprintf ( datecalib , "%.4d-%.2d-%.2d" , anneecal , moiscal , jourcal ); - - /*-------------------------------------------------------*/ - /* Lecture coeff de calibration */ - /*-------------------------------------------------------*/ - - for ( j = 0; j < 4 ; j++ ) - { - cr_read = read ( desc_lead , TABLEAU[j] , 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[j][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[j][i] = TABLEAU[j][i] & 0177; - } - sprintf(gains_a[j],"\0"); - - sscanf ( TABLEAU[j] , "%s" , gains_a[j] ); - } - - /*------------------------------------------------------*/ - /* Saut de 480 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 480 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture offset de calibration */ - /*-------------------------------------------------------*/ - - for ( j = 0; j < 4 ; j++ ) - { - cr_read = read ( desc_lead, TABLEAU[j], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[j][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[j][i] = TABLEAU[j][i] & 0177; - } - - sprintf ( gains_b[j] , "\0" ); - - sscanf ( TABLEAU[j] , "%s" , gains_b[j] ); - } - - /*------------------------------------------------------*/ - /* Saut de 1191 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 608 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture shift val */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( shval , "\0" ); - sscanf ( TABLEAU[0] , "%s" , shval ); - - /*------------------------------------------------------*/ - /* Saut de 100 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 100 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture SWIR REGISTRATION FLAG */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - swir=0; - sscanf ( TABLEAU[0] , "%d" , &swir ); - - /*------------------------------------------------------*/ - /* Saut de 459 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 459 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture coeff a */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeffa , "\0" ); - - sscanf ( TABLEAU[0] , "%s" , coeffa ); - - /*-------------------------------------------------------*/ - /* Lecture coeff b */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeffb , "\0" ) ; - - sscanf ( TABLEAU[0] , "%s" , coeffb ); - - /*-------------------------------------------------------*/ - /* Lecture coeff c */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeffc , "\0" ); - sscanf ( TABLEAU[0] , "%s" , coeffc ); - - /*-------------------------------------------------------*/ - /* Lecture coeff d */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeffd , "\0" ); - sscanf ( TABLEAU[0] , "%s" , coeffd ); - - /*-------------------------------------------------------*/ - /* Lecture coeff e */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeffe , "\0" ); - - sscanf ( TABLEAU[0] , "%s" , coeffe ); - - /*-------------------------------------------------------*/ - /* Lecture coeff f */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coefff , "\0" ); - - sscanf ( TABLEAU[0] , "%s" , coefff ); - - /*-------------------------------------------------------*/ - /* Lecture coeff ap */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeffap , "\0" ); - - sscanf ( TABLEAU[0] , "%s" , coeffap ); - - /*-------------------------------------------------------*/ - /* Lecture coeff bp */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeffbp , "\0" ); - sscanf ( TABLEAU[0] , "%s" , coeffbp ); - - /*-------------------------------------------------------*/ - /* Lecture coeff cp */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeffcp , "\0" ) ; - - sscanf ( TABLEAU[0] , "%s" , coeffcp ); - - /*-------------------------------------------------------*/ - /* Lecture coeff dp */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeffdp , "\0" ); - sscanf ( TABLEAU[0] , "%s" , coeffdp ); - - /*-------------------------------------------------------*/ - /* Lecture coeff ep */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeffep , "\0" ); - - sscanf ( TABLEAU[0] , "%s" , coeffep ); - - /*-------------------------------------------------------*/ - /* Lecture coeff fp */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coefffp , "\0" ); - sscanf ( TABLEAU[0] , "%s" , coefffp ); - - /*------------------------------------------------------*/ - /* Saut de 269 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 269 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /********************************************************/ - /* LEADER EPHEMERIS/ATTITUDE RECORD */ - /********************************************************/ - - /*------------------------------------------------------*/ - /* Saut de 3384 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 20 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - printf ( " erreur69\n" ); - goto ERREUR; - } - - for ( j = 0; j < 9 ; j++ ) - { - /*-------------------------------------------------------*/ - /* Lecture X , Y , Z location points */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - X_loc[j] =0.0; - sscanf ( TABLEAU[0] , "%lf" , &X_loc[j] ); - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - Y_loc[j]= 0.0; - sscanf ( TABLEAU[0] , "%lf" , &Y_loc[j] ); - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12]='\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - Z_loc[j] =0.0; - sscanf ( TABLEAU[0] , "%lf" , &Z_loc[j] ); - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - X_vel[j] =0.0; - sscanf ( TABLEAU[0] , "%lf" , &X_vel[j] ); - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - Y_vel[j] =0.0; - sscanf ( TABLEAU[0] , "%lf" , &Y_vel[j] ); - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - Z_vel[j] =0.0; - sscanf ( TABLEAU[0] , "%lf" , &Z_vel[j] ); - - /*-------------------------------------------------------*/ - /* Lecture satellite time */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 5 ); - - if ( cr_read != 5 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][5]='\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 5 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - jours[j] =0 ; - sscanf ( TABLEAU[0] , "%ld" , &jours[j] ); - - cr_read = read ( desc_lead, TABLEAU[0], 23 ); - - if ( cr_read != 23 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][23] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 23 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sscanf ( TABLEAU[0] , "%s" , toto ); - secondes[j] = (double) atof ( toto ); - - cai_JulToGreg ( jours[j] , secondes[j] , time[j] ); - - } - - /*-------------------------------------------------------*/ - /* Lecture DORIS FLAG */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 2 ); - - if ( cr_read != 2 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][2] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 2 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - dorisused[0]='\0'; - sscanf ( TABLEAU[0] , "%s" , dorisused ); - - /*------------------------------------------------------*/ - /* Saut de 24 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 24 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture line period */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( lineperiod , "\0" ); - sscanf ( TABLEAU[0] , "%s" , lineperiod ); - periodeligne = atof ( lineperiod ) * 0.001; - - /*-------------------------------------------------------*/ - /* Lecture outofrange */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 2 ); - - if ( cr_read != 2 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][2] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 2 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( outofrange , "\0" ); - sscanf ( TABLEAU[0] , "%s" , outofrange ); - - /*------------------------------------------------------*/ - /* Saut de 4 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 4 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture timescenecenter */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 30 ); - - if ( cr_read != 30 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][30] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 30 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( timecenter , "\0" ); - sprintf ( time_scenecenter , "\0" ); - sscanf ( TABLEAU[0] , "%s" , time_scenecenter ); - if (time_scenecenter[0]!='\0') - { - strcpy ( timecenter , time_scenecenter ); - secondescenter = atof ( &time_scenecenter[5] ); - time_scenecenter[5] = '\0'; - jourscenter = 0; - sscanf ( time_scenecenter , "%ld" , &jourscenter ); - cai_JulToGreg ( jourscenter , secondescenter , time_scenecenter ); - } - /*------------------------------------------------------*/ - /* Saut de 6 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 6 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - for ( j = 0; j < 73 ; j++ ) - { - /*-------------------------------------------------------*/ - /* Lecture attitude line number */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 4 ); - - if ( cr_read != 4 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][4] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 4 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - line[j] = 0 ; - sscanf ( TABLEAU[0] , "%d" , &line[j] ); - -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : FA : erreur calcul de la datation des attitudes */ -/*****************************************************************************/ - - cai_addtime ( time_angle[j] , timecenter , - ((double) ( line[j] - nbc_c ))*periodeligne ); - - /*-------------------------------------------------------*/ - /* Lecture rotation yaw axis */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 5 ); - - if ( cr_read != 5 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][5] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 5 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - yawdeg = atof ( TABLEAU[0] ); - yawrad = cai_DegreeToRadian ( yawdeg ) * 0.000001; - - if ( j == 72 ) - { - strcpy ( yaw[j] , "" ); - sscanf ( TABLEAU[0] , "%s" , yaw[j] ); - if ( strcmp ( yaw[j] , "" ) !=0) - sprintf ( yaw[j] , "%.12lf" , yawrad ); - } - else - sprintf ( yaw[j] , "%.12lf" , yawrad ); - - /*-------------------------------------------------------*/ - /* Lecture rotation roll axis */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 5 ); - - if ( cr_read != 5 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][5] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 5 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - yawdeg = atof ( TABLEAU[0] ) * 0.000001; - yawrad = cai_DegreeToRadian ( yawdeg ); - sprintf ( roll[j] , "%.12lf" , yawrad ); - - /*-------------------------------------------------------*/ - /* Lecture rotation pitch axis */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 5 ); - - if ( cr_read != 5 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][5] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 5 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - yawdeg = atof ( TABLEAU[0] ) * 0.000001; - yawrad = cai_DegreeToRadian ( yawdeg ); - - sprintf ( pitch[j] , "%.12lf" , yawrad ); - - /*------------------------------------------------------*/ - /* Saut de 1 octet */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 1 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - } - - /*-------------------------------------------------------*/ - /* Lecture psi_x_first */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - /* sscanf ( TABLEAU[0] , "%s" , psi_x_first );*/ - - /*-------------------------------------------------------*/ - /* Lecture psi_x_last */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - /* sscanf ( TABLEAU[0] , "%s" , psi_x_last );*/ - - /*-------------------------------------------------------*/ - /* Lecture psi_y_first */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - /* sscanf ( TABLEAU[0] , "%s" , psi_y_first );*/ - - /*-------------------------------------------------------*/ - /* Lecture psi_y_last */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - /* sscanf ( TABLEAU[0] , "%s" , psi_x_last );*/ - - /*------------------------------------------------------*/ - /* Saut de 508 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 508 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - for ( j = 0; j < 2 ; j++ ) - { - /*-------------------------------------------------------*/ - /* Lecture line number raw scene */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - line_raw[j]= 0 ; - sscanf ( TABLEAU[0] , "%d" , &line_raw[j] ); - -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : FA : erreur calcul de la datation des attitudes */ -/*****************************************************************************/ - - cai_addtime ( timeyaw[j] , timecenter , - ((double) ( line_raw[j] - nbc_c ))*periodeligne ); - - /*-------------------------------------------------------*/ - /* Lecture yaw_angle */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - yawdeg = atof ( TABLEAU[0] ) * 0.000001; - yawrad = cai_DegreeToRadian ( yawdeg ); - - sprintf ( yaw_angle[j] , "%.12lf" , yawrad ); - - /*-------------------------------------------------------*/ - /* Lecture roll_angle */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - yawdeg = atof ( TABLEAU[0] ) * 0.000001; - yawrad = cai_DegreeToRadian ( yawdeg ); - - sprintf ( roll_angle[j] , "%.12lf" , yawrad ); - - /*-------------------------------------------------------*/ - /* Lecture pitch_angle */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - yawdeg = atof ( TABLEAU[0] ) * 0.000001; - yawrad = cai_DegreeToRadian ( yawdeg ); - - sprintf ( pitch_angle[j] , "%.12lf" , yawrad ); - - } - - if ( nb_bs == 1 ) - ind_max = nb_bs; - else - if ( nb_bs == 3 ) - ind_max = 2; - else - ind_max = 3; - - for ( j = 0; j < ind_max ; j++ ) - { - - /*-------------------------------------------------------*/ - /* Lecture psi_x_first */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - cai_DMS_To_Float ( TABLEAU[0] , &psideg ); - psi_x_first[j] = cai_DegreeToRadian ( psideg ); - - /*-------------------------------------------------------*/ - /* Lecture psi_x_last */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - cai_DMS_To_Float ( TABLEAU[0] , &psideg ); - psi_x_last[j] = cai_DegreeToRadian ( psideg ); - - /*-------------------------------------------------------*/ - /* Lecture psi_y_first */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - cai_DMS_To_Float ( TABLEAU[0] , &psideg ); - psi_y_first[j] = cai_DegreeToRadian ( psideg ); - - /*-------------------------------------------------------*/ - /* Lecture psi_y_last */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - psideg = 0.0; - cai_DMS_To_Float ( TABLEAU[0] , &psideg ); - psi_y_last[j] = cai_DegreeToRadian ( psideg ); - } - - /*-------------------------------------------------------*/ - /* saut different selon le nombre d'angles lus */ - /*-------------------------------------------------------*/ - - if ( ind_max == 1 ) - { - /* saut de 8*12 octets */ - - /*------------------------------------------------------*/ - /* Saut de 96 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 96 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - } - else - if ( ind_max == 2 ) - { - /* saut de 4*12 octets */ - - /*------------------------------------------------------*/ - /* Saut de 48 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 48 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - } - - /*-------------------------------------------------------*/ - /* Lecture date julienne */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 7 ); - - if ( cr_read != 7 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][7] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 7 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - jourjul=0; - sscanf ( TABLEAU[0] , "%d" , &jourjul ); - - cr_read = read ( desc_lead, TABLEAU[0], 5 ); - - if ( cr_read != 5 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][5] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 5 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - datejul=0; - sscanf ( TABLEAU[0] , "%d" , &datejul ); - - /*-------------------------------------------------------*/ - /* Lecture major axis */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( axis , "\0" ); - sscanf ( TABLEAU[0] , "%s" , axis ); - - /*-------------------------------------------------------*/ - /* Lecture ex */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( ex , "\0" ); - sscanf ( TABLEAU[0] , "%s" , ex ); - - /*-------------------------------------------------------*/ - /* Lecture ey */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( ey , "\0" ); - sscanf ( TABLEAU[0] , "%s" , ey ); - - /*-------------------------------------------------------*/ - /* Lecture inclinaison */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( inclin , "\0" ); - sscanf ( TABLEAU[0] , "%s" , inclin ); - - /*-------------------------------------------------------*/ - /* Lecture ascension */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( ascension , "\0" ); - sscanf ( TABLEAU[0] , "%s" , ascension ); - - /*-------------------------------------------------------*/ - /* Lecture latitude argument */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( latarg , "\0" ); - sscanf ( TABLEAU[0] , "%s" , latarg ); - - /*-------------------------------------------------------*/ - /* Lecture p7 */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( p7 , "\0" ); - sscanf ( TABLEAU[0] , "%s" , p7 ); - - /*-------------------------------------------------------*/ - /* Lecture p8 */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( p8 , "\0" ); - sscanf ( TABLEAU[0] , "%s" , p8 ); - - /*-------------------------------------------------------*/ - /* Lecture p9 */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( p9 , "\0" ); - sscanf ( TABLEAU[0] , "%s" , p9 ); - - /*-------------------------------------------------------*/ - /* Lecture p10 */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( p10 , "\0" ); - sscanf ( TABLEAU[0] , "%s" , p10 ); - - /*-------------------------------------------------------*/ - /* Lecture segmentstart */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( segmentstart , "\0" ); - sscanf ( TABLEAU[0] , "%s" , segmentstart ); - - /*-------------------------------------------------------*/ - /* Lecture scenestart */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( scenestart , "\0" ); - sscanf ( TABLEAU[0] , "%s" , scenestart ); - - /*-------------------------------------------------------*/ - /* Lecture segmentend */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( segmentend , "\0" ); - sscanf ( TABLEAU[0] , "%s" , segmentend ); - - /*-------------------------------------------------------*/ - /* Lecture UT date */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 7 ); - - if ( cr_read != 7 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][7] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 7 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - utdatej=0; - sscanf ( TABLEAU[0] , "%d" , &utdatej ); - - cr_read = read ( desc_lead, TABLEAU[0], 5 ); - - if ( cr_read != 5 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][5] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 5 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - utdates=0; - sscanf ( TABLEAU[0] , "%d" , &utdates ); - - /*-------------------------------------------------------*/ - /* Lecture clockvalue */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( clockvalue , "\0" ); - sscanf ( TABLEAU[0] , "%s" , clockvalue ); - - /*-------------------------------------------------------*/ - /* Lecture clockperiod */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( clockperiod , "\0" ); - sscanf ( TABLEAU[0] , "%s" , clockperiod ); - - /*-------------------------------------------------------*/ - /* Lecture boardtime */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( boardtime , "\0" ); - sscanf ( TABLEAU[0] , "%s" , boardtime ); - - /*------------------------------------------------------*/ - /* Saut de 528 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 528 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /********************************************************/ - /* LEADER RADIOMETRIC CALIBRATION RECORD */ - /********************************************************/ - ind_gain_val = 0; - ind_dark_val = 0; - - for ( ind_gains = 0 ; ind_gains < 16 ; ind_gains++ ) - { - - /*------------------------------------------------------*/ - /* Saut de 24 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 24 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Lecture du flag indiquant si c'est un gains ou dark */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 4 ); - - if ( cr_read != 4 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][4] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 4 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - type_gain =0; - sscanf ( TABLEAU[0] , "%d" , &type_gain ); - - /*------------------------------------------------------*/ - /* Saut de 20 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 20 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Lecture date calibration de cette bande */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - relativeannee=0; - sscanf ( &(TABLEAU[0][4]) , "%d" , &relativeannee ); - TABLEAU[0][4] = '\0'; - relativemois=0; - sscanf ( &(TABLEAU[0][2]) , "%d" , &relativemois ); - TABLEAU[0][2] = '\0'; - relativejour=0; - sscanf ( TABLEAU[0] , "%d" , &relativejour ); - - sprintf ( relativedatecalib[ind_gains] , "%.4d-%.2d-%.2d 00:00:00" , relativeannee , - relativemois , relativejour ); - - /*------------------------------------------------------*/ - /* Saut de 4 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 4 , SEEK_CUR ); - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - if ( type_gain == 1 ) - { - for ( ind_tab_gain = 0 ; ind_tab_gain < 1500 ; ind_tab_gain++ ) - { - - /*------------------------------------------------------*/ - /* Lecture des 1500 gains */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, &val , 2 ); - - if ( cr_read != 2 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - if (strcmp(type_machine,"LE")==0) - { - swab((void*)&val,(void*)&valtemp,2); - val=valtemp; - } - val_float = (float) val/10000.0; - gain_value[ind_gain_val][ind_tab_gain] = val_float ; - } - ind_gain_val++; - } - else if ( type_gain == 2 ) - { - for ( ind_tab_gain =0 ; ind_tab_gain < 1500 ; ind_tab_gain++ ) - { - - /*------------------------------------------------------*/ - /* Lecture des 1500 darks */ - /*------------------------------------------------------*/ - - cr_read = read ( desc_lead, &val, 2 ); - if ( cr_read != 2 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - if (strcmp(type_machine,"LE")==0) - { - swab((void*)&val,(void*)&valtemp,2); - val=valtemp; - } - val_float = (float) val/10.0; - dark_value[ind_dark_val][ind_tab_gain] = val_float ; - } - ind_dark_val++; - } - else - { -/* Valeurs non significatives . Saut de l'enregistrement */ - cr_lseek = lseek ( desc_lead , 3000 , SEEK_CUR ); - } - - /*------------------------------------------------------*/ - /* Saut de 900 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 900 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - } - - /********************************************************/ - /* LEADER MODELIZATION RECORD */ - /********************************************************/ - - /*------------------------------------------------------*/ - /* Saut de 16 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 16 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture first pixel of the raw scene */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( fpixraw , "\0" ); - sscanf ( TABLEAU[0] , "%s" , fpixraw ); - - /*-------------------------------------------------------*/ - /* Lecture first line of the raw scene */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( flineraw , "\0" ); - sscanf ( TABLEAU[0] , "%s" , flineraw ); - - /*-------------------------------------------------------*/ - /* Lecture first pixel 1b of the raw scene */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( fpix1b , "\0" ); - sscanf ( TABLEAU[0] , "%s" , fpix1b ); - - /*-------------------------------------------------------*/ - /* Lecture first line 1b of the raw scene */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( fline1b , "\0" ); - sscanf ( TABLEAU[0] , "%s" , fline1b ); - - /*------------------------------------------------------*/ - /* Saut de 32 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 32 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture al */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( al , "\0" ); - sscanf ( TABLEAU[0] , "%s" , al ); - - /*-------------------------------------------------------*/ - /* Lecture bl */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( bl , "\0" ); - sscanf ( TABLEAU[0] , "%s" , bl ); - - /*-------------------------------------------------------*/ - /* Lecture cl */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( cl , "\0" ); - sscanf ( TABLEAU[0] , "%s" , cl ); - - /*-------------------------------------------------------*/ - /* Lecture ap */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( ap , "\0" ); - sscanf ( TABLEAU[0] , "%s" , ap ); - - /*-------------------------------------------------------*/ - /* Lecture bp */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( bp , "\0" ); - sscanf ( TABLEAU[0] , "%s" , bp ); - - /*-------------------------------------------------------*/ - /* Lecture cp */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( cp , "\0" ); - sscanf ( TABLEAU[0] , "%s" , cp ); - - /*------------------------------------------------------*/ - /* Saut de 16 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 16 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture i_m */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( im , "\0" ); - sscanf ( TABLEAU[0] , "%s" , im ); - - /*-------------------------------------------------------*/ - /* Lecture delta_i */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( deltai , "\0" ); - sscanf ( TABLEAU[0] , "%s" , deltai ); - - /*-------------------------------------------------------*/ - /* Lecture j_m */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( jm , "\0" ); - sscanf ( TABLEAU[0] , "%s" , jm ); - - /*-------------------------------------------------------*/ - /* Lecture delta_j */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( deltaj , "\0" ); - sscanf ( TABLEAU[0] , "%s" , deltaj ); - - /*-------------------------------------------------------*/ - /* Lecture l_m */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( lm , "\0" ); - sscanf ( TABLEAU[0] , "%s" , lm ); - - /*-------------------------------------------------------*/ - /* Lecture delta_l */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( deltal , "\0" ); - sscanf ( TABLEAU[0] , "%s" , deltal ); - - /*-------------------------------------------------------*/ - /* Lecture p_m */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( pm , "\0" ); - sscanf ( TABLEAU[0] , "%s" , pm ); - - /*-------------------------------------------------------*/ - /* Lecture delta_p */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( deltap , "\0" ); - sscanf ( TABLEAU[0] , "%s" , deltap ); - - /*------------------------------------------------------*/ - /* Saut de 16 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 16 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture coeff_i */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeffi , "\0" ); - sscanf ( TABLEAU[0] , "%s" , coeffi ); - - /*-------------------------------------------------------*/ - /* Lecture ai */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( ai , "\0" ); - sscanf ( TABLEAU[0] , "%s" , ai ); - - /*-------------------------------------------------------*/ - /* Lecture bi */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( bi , "\0" ); - sscanf ( TABLEAU[0] , "%s" , bi ); - - /*-------------------------------------------------------*/ - /* Lecture ci */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( ci , "\0" ); - sscanf ( TABLEAU[0] , "%s" , ci ); - - /*-------------------------------------------------------*/ - /* Lecture di */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( di , "\0" ); - sscanf ( TABLEAU[0] , "%s" , di ); - - /*-------------------------------------------------------*/ - /* Lecture ei */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( ei , "\0" ); - sscanf ( TABLEAU[0] , "%s" , ei ); - - /*-------------------------------------------------------*/ - /* Lecture coeff_j */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeffj , "\0" ); - sscanf ( TABLEAU[0] , "%s" , coeffj ); - - /*-------------------------------------------------------*/ - /* Lecture aj */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( aj , "\0" ); - sscanf ( TABLEAU[0] , "%s" , aj ); - - /*-------------------------------------------------------*/ - /* Lecture bj */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( bj , "\0" ); - sscanf ( TABLEAU[0] , "%s" , bj ); - - /*-------------------------------------------------------*/ - /* Lecture cj */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( cj , "\0" ); - sscanf ( TABLEAU[0] , "%s" , cj ); - - /*-------------------------------------------------------*/ - /* Lecture coeff_a */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeff_a , "\0" ); - sscanf ( TABLEAU[0] , "%s" , coeff_a ); - - /*-------------------------------------------------------*/ - /* Lecture aa */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( aa , "\0" ); - sscanf ( TABLEAU[0] , "%s" , aa ); - - /*-------------------------------------------------------*/ - /* Lecture ba */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( ba , "\0" ); - sscanf ( TABLEAU[0] , "%s" , ba ); - - /*-------------------------------------------------------*/ - /* Lecture ca */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( ca , "\0" ); - sscanf ( TABLEAU[0] , "%s" , ca ); - - /*-------------------------------------------------------*/ - /* Lecture da */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( da , "\0" ); - sscanf ( TABLEAU[0] , "%s" , da ); - - /*-------------------------------------------------------*/ - /* Lecture coeff_b */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeff_b , "\0" ); - sscanf ( TABLEAU[0] , "%s" , coeff_b ); - - /*-------------------------------------------------------*/ - /* Lecture ab */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( ab , "\0" ); - sscanf ( TABLEAU[0] , "%s" , ab ); - - /*-------------------------------------------------------*/ - /* Lecture bb */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( bb , "\0" ); - sscanf ( TABLEAU[0] , "%s" , bb ); - - /*-------------------------------------------------------*/ - /* Lecture cb */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( cb , "\0" ); - sscanf ( TABLEAU[0] , "%s" , cb ); - - /*-------------------------------------------------------*/ - /* Lecture db */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( db , "\0" ); - sscanf ( TABLEAU[0] , "%s" , db ); - - /*-------------------------------------------------------*/ - /* Lecture eb */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( eb , "\0" ); - sscanf ( TABLEAU[0] , "%s" , eb ); - - /*------------------------------------------------------*/ - /* Saut de 16 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 16 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture coeff_l */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeff_l , "\0" ); - sscanf ( TABLEAU[0] , "%s" , coeff_l ); - /*-------------------------------------------------------*/ - /* Lecture a_l */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( a_l , "\0" ); - sscanf ( TABLEAU[0] , "%s" , a_l ); - - /*-------------------------------------------------------*/ - /* Lecture b_l */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( b_l , "\0" ); - sscanf ( TABLEAU[0] , "%s" , b_l ); - - /*-------------------------------------------------------*/ - /* Lecture c_l */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( c_l , "\0" ); - sscanf ( TABLEAU[0] , "%s" , c_l ); - - /*-------------------------------------------------------*/ - /* Lecture d_l */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( d_l , "\0" ); - sscanf ( TABLEAU[0] , "%s" , d_l ); - - /*-------------------------------------------------------*/ - /* Lecture e_l */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( e_l , "\0" ); - sscanf ( TABLEAU[0] , "%s" , e_l ); - - /*-------------------------------------------------------*/ - /* Lecture coeff_p */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( coeff_p , "\0" ); - sscanf ( TABLEAU[0] , "%s" , coeff_p ); - - /*-------------------------------------------------------*/ - /* Lecture a_p */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( a_p , "\0" ); - sscanf ( TABLEAU[0] , "%s" , a_p ); - - /*-------------------------------------------------------*/ - /* Lecture b_p */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( b_p , "\0" ); - sscanf ( TABLEAU[0] , "%s" , b_p ); - - /*-------------------------------------------------------*/ - /* Lecture c_p */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( c_p , "\0" ); - sscanf ( TABLEAU[0] , "%s" , c_p ); - - /*------------------------------------------------------*/ - /* Saut de 16 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 16 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture alswir */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( alswir , "\0" ); - sscanf ( TABLEAU[0] , "%s" , alswir ); - - /*-------------------------------------------------------*/ - /* Lecture blswir */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - ; - sprintf ( blswir , "\0" ); - sscanf ( TABLEAU[0] , "%s" , blswir ); - - /*-------------------------------------------------------*/ - /* Lecture clswir */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( clswir , "\0" ); - sscanf ( TABLEAU[0] , "%s" , clswir ); - - /*-------------------------------------------------------*/ - /* Lecture apswir */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - sprintf ( apswir , "\0" ); - sscanf ( TABLEAU[0] , "%s" , apswir ); - - /*-------------------------------------------------------*/ - /* Lecture bpswir */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( bpswir , "\0" ); - sscanf ( TABLEAU[0] , "%s" , bpswir ); - - /*-------------------------------------------------------*/ - /* Lecture cpswir */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( cpswir , "\0" ); - sscanf ( TABLEAU[0] , "%s" , cpswir ); - - /*------------------------------------------------------*/ - /* Saut de 16 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 16 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* lecture de reverse simplified location model */ - /*------------------------------------------------------*/ - - /*-------------------------------------------------------*/ - /* Lecture coeff rlma */ - /*-------------------------------------------------------*/ - - - TABLEAU[0][0]='\0'; - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - strcpy ( rlma , "\0" ); - sscanf ( TABLEAU[0] , "%s" , rlma ); - - /*-------------------------------------------------------*/ - /* Lecture coeff rlmb */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - strcpy ( rlmb , "\0" ); - sscanf ( TABLEAU[0] , "%s" , rlmb ); - - /*-------------------------------------------------------*/ - /* Lecture coeff rlmc */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - strcpy ( rlmc , "\0" ); - sscanf ( TABLEAU[0] , "%s" , rlmc); - - /*-------------------------------------------------------*/ - /* Lecture coeff rlmd */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - strcpy ( rlmd , "\0" ); - sscanf ( TABLEAU[0] , "%s" , rlmd ); - - /*-------------------------------------------------------*/ - /* Lecture coeff rlme */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - strcpy ( rlme , "\0" ); - sscanf ( TABLEAU[0] , "%s" , rlme ); - - /*-------------------------------------------------------*/ - /* Lecture coeff rlmf */ - /*-------------------------------------------------------*/ - - TABLEAU[0][0]='\0'; - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - strcpy ( rlmf , "\0" ); - sscanf ( TABLEAU[0] , "%s" , rlmf ); - - /*-------------------------------------------------------*/ - /* Lecture coeff rlmap */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - strcpy ( rlmap , "\0" ); - sscanf ( TABLEAU[0] , "%s" , rlmap ); - - /*-------------------------------------------------------*/ - /* Lecture coeff rlmbp */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - strcpy ( rlmbp , "\0" ); - sscanf ( TABLEAU[0] , "%s" , rlmbp ); - - /*-------------------------------------------------------*/ - /* Lecture coeff rlmcp */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( rlmcp , "\0" ); - sscanf ( TABLEAU[0] , "%s" , rlmcp ); - - /*-------------------------------------------------------*/ - /* Lecture coeff rlmdp */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( rlmdp , "\0" ); - sscanf ( TABLEAU[0] , "%s" , rlmdp ); - - /*-------------------------------------------------------*/ - /* Lecture coeff rlmep */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( rlmep , "\0" ); - sscanf ( TABLEAU[0] , "%s" , rlmep ); - - /*-------------------------------------------------------*/ - /* Lecture coeff rlmfp */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( rlmfp , "\0" ); - sscanf ( TABLEAU[0] , "%s" , rlmfp ); - - /*------------------------------------------------------*/ - /* Saut de 2792 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 2792 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /********************************************************/ - /* LEADER GROUND CONTROL POINT RECORD */ - /********************************************************/ - - /*------------------------------------------------------*/ - /* Saut de 3960 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 3960 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /********************************************************/ - /* LEADER HISTOGRAM RECORD */ - /********************************************************/ - - for ( j = 0; j < nb_bs ; j++ ) - { - - /*------------------------------------------------------*/ - /* Saut de 2470 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 2470 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture lowthresh */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( lowtresh[j] , "\0" ); - sscanf ( TABLEAU[0] , "%s" , lowtresh[j] ); - - /*-------------------------------------------------------*/ - /* Lecture upthresh */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( uptresh[j] , "\0" ); - sscanf ( TABLEAU[0] , "%s" , uptresh[j] ); - - /*-------------------------------------------------------*/ - /* Lecture firstwavelength */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - unwave =0.0; - - sscanf ( TABLEAU[0] , "%lf" , &unwave ); - sprintf ( firstwave[j] , "%.12lf" , unwave * 0.000001 ); - - /*-------------------------------------------------------*/ - /* Lecture wavelengthstep */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 4 ); - - if ( cr_read != 4 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][4] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 4 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - wavelong=0.0; - sscanf ( TABLEAU[0] , "%lf" , &wavelong ); - sprintf ( wavelengthstep[j] , "%.12lf" , wavelong * 0.000000001 ); - - /*-------------------------------------------------------*/ - /* Lecture des 64 coefficients */ - /*-------------------------------------------------------*/ - - for ( ind_tab_gain = 0 ; ind_tab_gain < 64 ; ind_tab_gain++ ) - { - cr_read = read ( desc_lead, TABLEAU[0], 5 ); - - if ( cr_read != 5 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][5] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 5 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( spectral_sensitivitie[j][ind_tab_gain] , "\0" ); - sscanf ( TABLEAU[0] , "%s" , spectral_sensitivitie[j][ind_tab_gain] ); - } - - /*-------------------------------------------------------*/ - /* Lecture solar_irradiance */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_lead, TABLEAU[0], 4 ); - - if ( cr_read != 4 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][4] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 4 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( solar_irradiance[j] , "\0" ); - sscanf ( TABLEAU[0] , "%s" , solar_irradiance[j] ); - - /*------------------------------------------------------*/ - /* Saut de 1138 octets */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_lead , 1138 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Leader octet %ld" , cr_lseek ); - goto ERREUR; - } - } - - /********************************************************/ - /* LECTURE DU FICHIER VOLUME DIRECTORY */ - /********************************************************/ - - /*------------------------------------------------------*/ - /* Retour au debut du fichier */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_vol , 0L , 0 ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Saut de 60 octects */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_vol , 60 , SEEK_SET ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture job_id */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_vol, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - sprintf ( job_id , "\0" ); - strcpy ( job_id , TABLEAU[0] ); - - /*-------------------------------------------------------*/ - /* Lecture product_type */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_vol, TABLEAU[0], 16 ); - - if ( cr_read != 16 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][16] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 16 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - sprintf( product_type, "\0" ); - strcpy ( product_type , TABLEAU[0] ); - - /*------------------------------------------------------*/ - /* Saut de 20 octects */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_vol , 20 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture product_date */ - /*-------------------------------------------------------*/ - - /*-------------------------------------------------------*/ - /* Lecture product_annee */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_vol, TABLEAU[0], 4 ); - - if ( cr_read != 4 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][4] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 4 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - product_annee=0; - sscanf ( TABLEAU[0] , "%d" , &product_annee ); - - /*-------------------------------------------------------*/ - /* Lecture product_mois */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_vol, TABLEAU[0], 2 ); - - if ( cr_read != 2 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][2] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 2 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - product_mois=0; - sscanf ( TABLEAU[0] , "%d" , &product_mois ); - - /*-------------------------------------------------------*/ - /* Lecture product_jour */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_vol, TABLEAU[0], 2 ); - - if ( cr_read != 2 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][2] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 2 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - product_jour=0; - sscanf ( TABLEAU[0] , "%d" , &product_jour ); - - /*-------------------------------------------------------*/ - /* Lecture product_heure */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_vol, TABLEAU[0], 2 ); - - if ( cr_read != 2 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][2] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 2 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - product_heure =0; - sscanf ( TABLEAU[0] , "%d" , &product_heure ); - - /*-------------------------------------------------------*/ - /* Lecture product_min */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_vol, TABLEAU[0], 2 ); - - if ( cr_read != 2 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][2] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 2 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - product_min=0; - sscanf ( TABLEAU[0] , "%d" , &product_min ); - - /*-------------------------------------------------------*/ - /* Lecture product_sec */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_vol, TABLEAU[0], 2 ); - - if ( cr_read != 2 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][2] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 2 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - product_sec=0; - sscanf ( TABLEAU[0] , "%d" , &product_sec ); - - /*------------------------------------------------------*/ - /* Saut de 2 octects */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_vol , 2 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture produser */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_vol, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( produser , "\0" ); - strcpy ( produser , TABLEAU[0] ); - - /*-------------------------------------------------------*/ - /* Lecture processing_center */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_vol, TABLEAU[0], 8 ); - - if ( cr_read != 8 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][8] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 8 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( processing_center , "\0" ); - strcpy ( processing_center , TABLEAU[0] ); - - /*-------------------------------------------------------*/ - /* Lecture software_name */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_vol, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( software_name , "\0" ); - strcpy ( software_name , TABLEAU[0] ); - - /*------------------------------------------------------*/ - /* Saut de 1296 octects */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_vol , 1296 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture source_description */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_vol, TABLEAU[0], 104 ); - - if ( cr_read != 104 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][104] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 104 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - sprintf ( source_description , "\0" ); - strcpy ( source_description , TABLEAU[0] ); - - /*------------------------------------------------------*/ - /* Saut de 18 octects */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_vol , 18 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture copyright */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_vol, TABLEAU[0], 14 ); - - if ( cr_read != 14 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][14] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 14 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - strcpy ( copyright , TABLEAU[0] ); - - /*------------------------------------------------------*/ - /* Saut de 2 octects */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_vol , 2 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - cr_read = read ( desc_vol, TABLEAU[0], 12 ); - - if ( cr_read != 12 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][12] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 12 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - strcat ( copyright , TABLEAU[0] ); - - /*------------------------------------------------------*/ - /* Saut de 2 octects */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_vol , 2 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - cr_read = read ( desc_vol, TABLEAU[0], 10 ); - - if ( cr_read != 10 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Volume Directory octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][10] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 10 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - strcat ( copyright , TABLEAU[0] ); - - /********************************************************/ - /* LECTURE DU FICHIER IMAGERY */ - /********************************************************/ - - /*------------------------------------------------------*/ - /* Retour au debut du fichier */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_img , 0L , 0 ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Imagery octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Saut de 186 octects */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_img , 186 , SEEK_SET ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Imagery octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*-------------------------------------------------------*/ - /* Lecture longueur enregistrement */ - /*-------------------------------------------------------*/ - - cr_read = read ( desc_img, TABLEAU[0], 6 ); - - if ( cr_read != 6 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Imagery octet %ld" , cr_lseek ); - goto ERREUR; - } - - TABLEAU[0][6] = '\0'; - - /* Pour ne pas lire les char suivants */ - /* On met un masque sur le 8ieme bit de chaque octet : */ - - for ( i = 0 ; i < 6 ; i++ ) - { - TABLEAU[0][i] = TABLEAU[0][i] & 0177; - } - - lg_enreg = 0; - sscanf ( TABLEAU[0] , "%d" , &lg_enreg ); - - /*------------------------------------------------------*/ - /* Retour au debut du fichier */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_img , 0L , SEEK_SET ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Imagery octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*------------------------------------------------------*/ - /* Saut de lg_enreg octects */ - /*------------------------------------------------------*/ - - cr_lseek = lseek ( desc_img , (long) lg_enreg , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Imagery octet %ld" , cr_lseek ); - goto ERREUR; - } - - for ( j = 0; j < nb_lig ; j++ ) - { - for ( can = 0 ; can < nb_bs ; can++ ) - { - /*---------------------------------------------------*/ - /* Saut de lg_enreg octects */ - /*---------------------------------------------------*/ - cr_lseek = lseek ( desc_img , (long) ( lg_enreg - 69 ), SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Imagery octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*----------------------------------------------------*/ - /* Lecture loss flag */ - /*----------------------------------------------------*/ - - cr_read = read ( desc_img , &bad_line[j][can] , 1 ); - - if ( cr_read != 1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Imagery octet %ld" , cr_lseek ); - goto ERREUR; - } - - /*---------------------------------------------------*/ - /* Saut de 68 octects */ - /*---------------------------------------------------*/ - - cr_lseek = lseek ( desc_img , 68 , SEEK_CUR ); - - if ( cr_lseek == -1 ) - { - sprintf ( CAI_ERREUR , "Erreur Lecture du fichier Imagery octet %ld" , cr_lseek ); - goto ERREUR; - } - } - } - - /********************************************************/ - /* OUVERTURE DU FICHIER XML PRODUIT */ - /********************************************************/ - - if ( ( des = fopen ( chemin_descripteur , "wb" ) ) == NULL ) - { - sprintf ( CAI_ERREUR , "Erreur Ouverture du fichier XML" ); - goto ERREUR; - } - - /********************************************************/ - /* ECRITURE DES DONNEES XML DANS LE FICHIER */ - /********************************************************/ - - /* Entete du document XML */ - - cr = cai_WriteEnteteXML ( des ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur Ecriture du fichier XML" ); - goto ERREUR; - } - - /* Element Dimap_document */ - - cr = cai_WriteOpenTagXML ( des , "Dimap_Document" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Dimap_Document" ); - goto ERREUR; - } - - /* Sous element Metadata_Id */ - - cr = cai_WriteOpenTagXML ( des , "Metadata_Id" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Metadata_Id" ); - goto ERREUR; - } - - /* sous element METADATA_FORMAT */ - /*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Version DIMAP passe de 2.0 à 2.9 */ -/*****************************************************************************/ - type=0; - cr = cai_WriteElementXMLWithAttribute ( des , "METADATA_FORMAT" , "DIMAP" , - "version" , "2.9" ,type); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element METADATA_FORMAT" ); - goto ERREUR; - } - - /* sous element METADATA_PROFILE */ - - profile = (char*) NULL; - profile = (char*) calloc ( strlen ( niv_trait ) + 11 , sizeof (char) ); - - sprintf ( profile , "SPOTSCENE_%s" , niv_trait ); - - cr = cai_WriteElementXML ( des , "METADATA_PROFILE" , profile ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element METADATA_PROFILE" ); - goto ERREUR; - } - - FREE ( profile ); - - /* Fermeture de l'element Metadata_Id */ - - cr = cai_WriteCloseTagXML ( des , "Metadata_Id" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Metadata_Id" ); - goto ERREUR; - } - - /* Sous element Dataset_Id */ - - cr = cai_WriteOpenTagXML ( des , "Dataset_Id" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Dataset_Id" ); - goto ERREUR; - } - - /* sous element DATASET_NAME */ - - cr = cai_WriteElementXML ( des , "DATASET_NAME" , datasetname_centre ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DATASET_NAME" ); - goto ERREUR; - } - - /* sous element COPYRIGHT */ - - cr = cai_WriteElementXML ( des , "COPYRIGHT" , copyright ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element COPYRIGHT" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'attribut href="" */ -/****************************************************************************/ - - /* sous element DATASET_TN_PATH */ - type=1; - cr = cai_WriteElementXMLWithAttribute ( des , "DATASET_TN_PATH" , "" , "href" , "" ,type); - - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DATASET_TN_PATH" ); - goto ERREUR; - } - - /* sous element DATASET_TN_FORMAT */ - - cr = cai_WriteElementXML ( des , "DATASET_TN_FORMAT" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DATASET_TN_FORMAT" ); - goto ERREUR; - } - - /* sous element DATASET_QL_PATH */ - type=1; - cr = cai_WriteElementXMLWithAttribute ( des , "DATASET_QL_PATH" , "" , "href" , "",type ); - - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DATASET_QL_PATH" ); - goto ERREUR; - } - - /* sous element DATASET_QL_FORMAT */ - - cr = cai_WriteElementXML ( des , "DATASET_QL_FORMAT" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DATASET_QL_FORMAT" ); - goto ERREUR; - } - - /* Fermeture de l'element Dataset_Id */ - - cr = cai_WriteCloseTagXML ( des , "Dataset_Id" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Dataset_Id" ); - goto ERREUR; - } - - /* Sous element Dataset_Frame */ - - cr = cai_WriteOpenTagXML ( des , "Dataset_Frame" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Dataset_Frame" ); - goto ERREUR; - } - - /* sous element Vertex */ - - cr = cai_WriteOpenTagXML ( des , "Vertex" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Vertex" ); - goto ERREUR; - } - - /* sous element FRAME_LON */ - - sprintf ( valeur , "%lf" , lon_no ); - - cr = cai_WriteElementXML ( des , "FRAME_LON" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_LON" ); - goto ERREUR; - } - - /* sous element FRAME_LAT */ - - sprintf ( valeur , "%lf" , lat_no ); - - cr = cai_WriteElementXML ( des , "FRAME_LAT" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_LAT" ); - goto ERREUR; - } -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Enlever le signe + pour FRAME_ROW, FRAME_COL */ -/*****************************************************************************/ -/* Coin NO */ -/***********/ - /* sous element FRAME_ROW */ - sscanf ( ligc1 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "FRAME_ROW" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_ROW" ); - goto ERREUR; - } - /* sous element FRAME_COL */ - sscanf ( colc1 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "FRAME_COL" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_COL" ); - goto ERREUR; - } - - /* Fermeture de l'element Vertex */ - - cr = cai_WriteCloseTagXML ( des , "Vertex" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Vertex" ); - goto ERREUR; - } - - /* sous element Vertex */ - - cr = cai_WriteOpenTagXML ( des , "Vertex" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Vertex" ); - goto ERREUR; - } - - /* sous element FRAME_LON */ - - sprintf ( valeur , "%f" , lon_ne ); - - cr = cai_WriteElementXML ( des , "FRAME_LON" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_LON" ); - goto ERREUR; - } - - /* sous element FRAME_LAT */ - - sprintf ( valeur , "%f" , lat_ne ); - - cr = cai_WriteElementXML ( des , "FRAME_LAT" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_LAT" ); - goto ERREUR; - } - /*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Enlever le signe + pour FRAME_ROW, FRAME_COL */ -/*****************************************************************************/ -/* Coin NE */ -/***********/ - /* sous element FRAME_ROW */ - sscanf ( ligc2 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "FRAME_ROW" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_ROW" ); - goto ERREUR; - } - /* sous element FRAME_COL */ - sscanf ( colc2 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "FRAME_COL" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_COL" ); - goto ERREUR; - } - - /* Fermeture de l'element Vertex */ - - cr = cai_WriteCloseTagXML ( des , "Vertex" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Vertex" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA : DIMAP dans le DATASET_FRAME, inversion des deux*/ -/* derniers vertex : à mettre dans l'ordre */ -/* NO,NE,SE,SO : inversion de c3 et c4 */ -/*****************************************************************************/ -/* Coin SE */ -/***********/ -/* sous element Vertex */ - - cr = cai_WriteOpenTagXML ( des , "Vertex" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Vertex" ); - goto ERREUR; - } - - /* sous element FRAME_LON */ - - sprintf ( valeur , "%lf" , lon_se ); - - cr = cai_WriteElementXML ( des , "FRAME_LON" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_LON" ); - goto ERREUR; - } - - /* sous element FRAME_LAT */ - - sprintf ( valeur , "%lf" , lat_se ); - - cr = cai_WriteElementXML ( des , "FRAME_LAT" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_LAT" ); - goto ERREUR; - } -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Enlever le signe + pour FRAME_ROW, FRAME_COL */ -/*****************************************************************************/ - - /* sous element FRAME_ROW */ - sscanf ( ligc4 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "FRAME_ROW" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_ROW" ); - goto ERREUR; - } - /* sous element FRAME_COL */ - sscanf ( colc4 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "FRAME_COL" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_COL" ); - goto ERREUR; - } - - /* Fermeture de l'element Vertex */ - - cr = cai_WriteCloseTagXML ( des , "Vertex" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Vertex" ); - goto ERREUR; - } -/***********/ -/* Coin SO */ -/***********/ - /* sous element Vertex */ - - cr = cai_WriteOpenTagXML ( des , "Vertex" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Vertex" ); - goto ERREUR; - } - - /* sous element FRAME_LON */ - - sprintf ( valeur , "%lf" , lon_so ); - - cr = cai_WriteElementXML ( des , "FRAME_LON" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_LON" ); - goto ERREUR; - } - - /* sous element FRAME_LAT */ - - sprintf ( valeur , "%lf" , lat_so ); - - cr = cai_WriteElementXML ( des , "FRAME_LAT" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_LAT" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Enlever le signe + pour FRAME_ROW, FRAME_COL */ -/*****************************************************************************/ -/* sous element FRAME_ROW */ - sscanf ( ligc3 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "FRAME_ROW" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_ROW" ); - goto ERREUR; - } - /* sous element FRAME_COL */ - sscanf ( colc3 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "FRAME_COL" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_COL" ); - goto ERREUR; - } - - /* Fermeture de l'element Vertex */ - - cr = cai_WriteCloseTagXML ( des , "Vertex" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Vertex" ); - goto ERREUR; - } - - /* sous element Scene_Center */ - - cr = cai_WriteOpenTagXML ( des , "Scene_Center" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Scene_Center" ); - goto ERREUR; - } - - /* sous element FRAME_LON */ - - sprintf ( valeur , "%lf" , lon_c ); - cr = cai_WriteElementXML ( des , "FRAME_LON" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_LON" ); - goto ERREUR; - } - /* sous element FRAME_LAT */ - - sprintf ( valeur , "%lf" , lat_c ); - - cr = cai_WriteElementXML ( des , "FRAME_LAT" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_LAT" ); - goto ERREUR; - } - /* sous element FRAME_ROW */ - - sprintf ( valeur , "%d" , nbc_c ); - cr = cai_WriteElementXML ( des , "FRAME_ROW" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_ROW" ); - goto ERREUR; - } - - /* sous element FRAME_COL */ - - sprintf ( valeur , "%d" , nbl_c ); - cr = cai_WriteElementXML ( des , "FRAME_COL" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FRAME_COL" ); - goto ERREUR; - } - - /* Fermeture de l'element Scene_Center */ - - cr = cai_WriteCloseTagXML ( des , "Scene_Center" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Scene_Center" ); - goto ERREUR; - } - - /* sous element SCENE_ORIENTATION */ - - cr = cai_WriteElementXML ( des , "SCENE_ORIENTATION" , angle_o ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SCENE_ORIENTATION" ); - goto ERREUR; - } - - /* Fermeture de l'element Dataset_Frame */ - - cr = cai_WriteCloseTagXML ( des , "Dataset_Frame" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Dataset_Frame" ); - goto ERREUR; - } - - /* sous element Dataset_Sources */ - - cr = cai_WriteOpenTagXML ( des , "Dataset_Sources" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Dataset_Sources" ); - goto ERREUR; - } - - /* sous element Source_Information */ - - cr = cai_WriteOpenTagXML ( des , "Source_Information" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Source_Information" ); - goto ERREUR; - } - - /* sous element SOURCE_TYPE */ - - cr = cai_WriteElementXML ( des , "SOURCE_TYPE" , "SCENE" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SOURCE_TYPE" ); - goto ERREUR; - } - - /* sous element SOURCE_ID */ - - cr = cai_WriteElementXML ( des , "SOURCE_ID" , dsetname_centre ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SOURCE_ID" ); - goto ERREUR; - } - - /* sous element SOURCE_DESCRIPTION */ - - cr = cai_WriteElementXML ( des , "SOURCE_DESCRIPTION" , source_description ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SOURCE_DESCRIPTION" ); - goto ERREUR; - } - - /* sous element Scene_Source */ - - cr = cai_WriteOpenTagXML ( des , "Scene_Source" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Scene_Source" ); - goto ERREUR; - } - - /* sous element GRID_REFERENCE */ - - cr = cai_WriteElementXML ( des , "GRID_REFERENCE" , grille_ref ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element GRID_REFERENCE" ); - goto ERREUR; - } - - /* sous element SHIFT_VALUE */ - - cr = cai_WriteElementXML ( des , "SHIFT_VALUE" , shift_val ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SHIFT_VALUE" ); - goto ERREUR; - } - - /* sous element IMAGING_DATE */ - - cr = cai_WriteElementXML ( des , "IMAGING_DATE" , date ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element IMAGING_DATE" ); - goto ERREUR; - } - - /* sous element IMAGING_TIME */ - - cr = cai_WriteElementXML ( des , "IMAGING_TIME" , heure ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element IMAGING_TIME" ); - goto ERREUR; - } - - /* sous element MISSION */ - - cr = cai_WriteElementXML ( des , "MISSION" , satellite ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element MISSION" ); - goto ERREUR; - } - - /* sous element MISSION_INDEX */ - - sprintf ( sat_ind , "%d" , satellite_index ); - - cr = cai_WriteElementXML ( des , "MISSION_INDEX" , sat_ind ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element MISSION_INDEX" ); - goto ERREUR; - } - - /* sous element INSTRUMENT */ - - cr = cai_WriteElementXML ( des , "INSTRUMENT" , instrument ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element INSTRUMENT" ); - goto ERREUR; - } - - /* sous element INSTRUMENT_INDEX */ - - sprintf ( ins_ind , "%d" , instrument_index ); - - cr = cai_WriteElementXML ( des , "INSTRUMENT_INDEX" , ins_ind ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element INSTRUMENT_INDEX" ); - goto ERREUR; - } - - /* sous element SENSOR_CODE */ - - sprintf ( valeur , "%c" , codecapt ); - cr = cai_WriteElementXML ( des , "SENSOR_CODE" , valeur ); - - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SENSOR_CODE" ); - goto ERREUR; - } - - /* sous element SCENE_PROCESSING_LEVEL */ - - cr = cai_WriteElementXML ( des , "SCENE_PROCESSING_LEVEL" , niv_trait ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SCENE_PROCESSING_LEVEL" ); - goto ERREUR; - } - - /* sous element INCIDENCE_ANGLE */ - - if ( angle_in[0] == 'L' ) - { - sprintf ( valeur , "-%s" , &angle_in[1] ); - } - else if (angle_in[0] != '\0') - { - sprintf ( valeur , "%s" , &angle_in[1] ); - } - else - sprintf(valeur, "\0"); - - cr = cai_WriteElementXML ( des , "INCIDENCE_ANGLE" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element INCIDENCE_ANGLE" ); - goto ERREUR; - } - - /* sous element SUN_AZIMUT */ - - cr = cai_WriteElementXML ( des , "SUN_AZIMUTH" , sunazim ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SUN_AZIMUT" ); - goto ERREUR; - } - - /* sous element SUN_ELEVATION */ - - cr = cai_WriteElementXML ( des , "SUN_ELEVATION" , sunelev ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SUN_ELEVATION" ); - goto ERREUR; - } - - /* sous element Imaging_Parameters */ - - cr = cai_WriteOpenTagXML ( des , "Imaging_Parameters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Imaging_Parameters" ); - goto ERREUR; - } - - /* sous element REVOLUTION_NUMBER */ - - cr = cai_WriteElementXML ( des , "REVOLUTION_NUMBER" , revolution ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element REVOLUTION_NUMBER" ); - goto ERREUR; - } - - /* sous element COMPRESSION_MODE */ - - cr = cai_WriteElementXML ( des , "COMPRESSION_MODE" , compression ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element COMPRESSION_MODE" ); - goto ERREUR; - } - - /* sous element DIRECT_PLAYBACK_INDICATOR */ - - cr = cai_WriteElementXML ( des , "DIRECT_PLAYBACK_INDICATOR" , direct_playback ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DIRECT_PLAYBACK_INDICATOR" ); - goto ERREUR; - } - - /* sous element REFOCUSING_STEP_NUM */ - - cr = cai_WriteElementXML ( des , "REFOCUSING_STEP_NUM" , stepnum ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element REFOCUSING_STEP_NUM" ); - goto ERREUR; - } - - /* sous element COUPLED_MODE_FLAG */ - - cr = cai_WriteElementXML ( des , "COUPLED_MODE_FLAG" , coupled ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element COUPLED_MODE_FLAG" ); - goto ERREUR; - } - - /* sous element SWATH_MODE */ - - cr = cai_WriteElementXML ( des , "SWATH_MODE" , "FULL" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SWATH_MODE" ); - goto ERREUR; - } - - /* Fermeture de l'element Imaging_Parameters */ - - cr = cai_WriteCloseTagXML ( des , "Imaging_Parameters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Imaging_Parameters" ); - goto ERREUR; - } - - /* Fermeture de l'element Scene_Source */ - - cr = cai_WriteCloseTagXML ( des , "Scene_Source" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Scene_Source" ); - goto ERREUR; - } - - /* Fermeture de l'element Source_Information */ - - cr = cai_WriteCloseTagXML ( des , "Source_Information" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Source_Information" ); - goto ERREUR; - } - - /* Fermeture de l'element Dataset_Sources */ - - cr = cai_WriteCloseTagXML ( des , "Dataset_Sources" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Dataset_Sources" ); - goto ERREUR; - } - - /* sous element Coordinate_Reference_System */ - - cr = cai_WriteOpenTagXML ( des , "Coordinate_Reference_System" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Coordinate_Reference_System" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'attribut version="5.2" */ -/*****************************************************************************/ - - /* sous element GEO_TABLES */ - type=0; - cr = cai_WriteElementXMLWithAttribute ( des , "GEO_TABLES" , "EPSG" , "version" , "5.2",type ); - - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element GEO_TABLES" ); - goto ERREUR; - } - - /* sous element Horizontal_CS */ - - cr = cai_WriteOpenTagXML ( des , "Horizontal_CS" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Horizontal_CS" ); - goto ERREUR; - } - - /* sous element HORIZONTAL_CS_TYPE */ - - cr = cai_WriteElementXML ( des , "HORIZONTAL_CS_TYPE" , "GEOGRAPHIC" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element HORIZONTAL_CS_TYPE" ); - goto ERREUR; - } -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : DIMAP remplissage des tags HORIZONTAL_CS_CODE */ -/* et HORIZONTAL_CS_NAME avec des valeurs défauts */ -/*****************************************************************************/ - /* sous element HORIZONTAL_CS_CODE */ - - cr = cai_WriteElementXML ( des , "HORIZONTAL_CS_CODE" , "epsg:4326" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element HORIZONTAL_CS_CODE" ); - goto ERREUR; - } - - /* sous element HORIZONTAL_CS_NAME */ - - cr = cai_WriteElementXML ( des , "HORIZONTAL_CS_NAME" , "WGS 84" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element HORIZONTAL_CS_NAME" ); - goto ERREUR; - } - - /* Fermeture de l'element Horizontal_CS */ - - cr = cai_WriteCloseTagXML ( des , "Horizontal_CS" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Horizontal_CS" ); - goto ERREUR; - } - - /* Fermeture de l'element Coordinate_Reference_System */ - - cr = cai_WriteCloseTagXML ( des , "Coordinate_Reference_System" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Coordinate_Reference_System" ); - goto ERREUR; - } - - /* sous element Raster_CS */ - - cr = cai_WriteOpenTagXML ( des , "Raster_CS" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Raster_CS" ); - goto ERREUR; - } - - /* sous element RASTER_CS_TYPE */ - - if ( strncmp ( niv_trait , "2A" , 2 ) ==0 ) - { - cr = cai_WriteElementXML ( des , "RASTER_CS_TYPE" , "CELL" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element RASTER_CS_TYPE" ); - goto ERREUR; - } - } - else - { - cr = cai_WriteElementXML ( des , "RASTER_CS_TYPE" , "POINT" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element RASTER_CS_TYPE" ); - goto ERREUR; - } - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element PIXEL_ORIGIN */ -/****************************************************************************/ - - /* sous element PIXEL_ORIGIN */ - - cr = cai_WriteElementXML ( des , "PIXEL_ORIGIN" , "1" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PIXEL_ORIGIN" ); - goto ERREUR; - } - - - /* Fermeture de l'element Raster_CS */ - - cr = cai_WriteCloseTagXML ( des , "Raster_CS" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Raster_CS" ); - goto ERREUR; - } - - /* sous element Geoposition */ - - cr = cai_WriteOpenTagXML ( des , "Geoposition" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Geoposition" ); - goto ERREUR; - } - - /* sous element Geoposition_Points */ - - cr = cai_WriteOpenTagXML ( des , "Geoposition_Points" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Geoposition_Points" ); - goto ERREUR; - } - - /* sous element Tie_Point */ - - cr = cai_WriteOpenTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Tie_Point" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_X */ - - sprintf ( valeur , "%lf" , lon_no ); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_X" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_Y */ - - sprintf ( valeur , "%lf" , lat_no ); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Y" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_Y" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element TIE_POINTS_CRS_Z */ -/****************************************************************************/ - - /* sous element TIE_POINTS_CRS_Z */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Z" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_Z" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_DATA_X */ -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Enlever le signe + pour TIE_POINTS_DATA_X et */ -/* TIE_POINTS_DATA_Y */ -/*****************************************************************************/ - sscanf ( ligc1 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_X" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_DATA_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_DATA_Y */ - sscanf ( colc1 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_Y" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_DATA_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Tie_Point */ - - cr = cai_WriteCloseTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Tie_Point" ); - goto ERREUR; - } - - /* sous element Tie_Point */ - - cr = cai_WriteOpenTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Tie_Point" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_X */ - - sprintf ( valeur , "%f" , lon_ne ); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_X" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_Y */ - - sprintf ( valeur , "%f" , lat_ne ); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Y" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_Y" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element TIE_POINTS_CRS_Z */ -/****************************************************************************/ - - /* sous element TIE_POINTS_CRS_Z */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Z" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_Z" ); - goto ERREUR; - } - - -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Enlever le signe + pour TIE_POINTS_DATA_X et */ -/* TIE_POINTS_DATA_Y */ -/*****************************************************************************/ - sscanf ( ligc2 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_X" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_DATA_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_DATA_Y */ - sscanf ( colc2 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_Y" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_DATA_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Tie_Point */ - - cr = cai_WriteCloseTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Tie_Point" ); - goto ERREUR; - } - - /* sous element Tie_Point */ - - cr = cai_WriteOpenTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Tie_Point" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_X */ - - sprintf ( valeur , "%lf" , lon_so ); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_X" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_Y */ - - sprintf ( valeur , "%lf" , lat_so ); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Y" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_Y" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element TIE_POINTS_CRS_Z */ -/****************************************************************************/ - - /* sous element TIE_POINTS_CRS_Z */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Z" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_Z" ); - goto ERREUR; - } - - -/*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Enlever le signe + pour TIE_POINTS_DATA_X et */ -/* TIE_POINTS_DATA_Y */ -/*****************************************************************************/ - /* sous element TIE_POINTS_DATA_X */ - - sscanf ( ligc3 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_X" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_DATA_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_DATA_Y */ - sscanf ( colc3 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_Y" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_DATA_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Tie_Point */ - - cr = cai_WriteCloseTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Tie_Point" ); - goto ERREUR; - } - - /* sous element Tie_Point */ - - cr = cai_WriteOpenTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Tie_Point" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_X */ - - sprintf ( valeur , "%lf" , lon_se ); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_X" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_Y */ - - sprintf ( valeur , "%lf" , lat_se ); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Y" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_Y" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element TIE_POINTS_CRS_Z */ -/****************************************************************************/ - - /* sous element TIE_POINTS_CRS_Z */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Z" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_Z" ); - goto ERREUR; - } - - - /*****************************************************************************/ -/* MOD : VERSION : 4.8 : FA : Enlever le signe + pour TIE_POINTS_DATA_X et */ -/* TIE_POINTS_DATA_Y */ -/*****************************************************************************/ - /* sous element TIE_POINTS_DATA_X */ - - sscanf ( ligc4 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_X" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_DATA_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_DATA_Y */ - sscanf ( colc4 , "%d" ,&ivaleur ); - sprintf(Valeur,"%d",ivaleur); - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_Y" , Valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_DATA_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Tie_Point */ - - cr = cai_WriteCloseTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Tie_Point" ); - goto ERREUR; - } - - /* Fermeture de l'element Geoposition_Points */ - - cr = cai_WriteCloseTagXML ( des , "Geoposition_Points" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Geoposition_Points" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Deplacement de Simplified_Location_Model */ -/*****************************************************************************/ - - /* sous element Simplified_Location_Model */ - - cr = cai_WriteOpenTagXML ( des , "Simplified_Location_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Simplified_Location_Model" ); - goto ERREUR; - } - - /* sous element Direct_Location_Model */ - - cr = cai_WriteOpenTagXML ( des , "Direct_Location_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Direct_Location_Model" ); - goto ERREUR; - } - - /* sous element lc_List */ - - cr = cai_WriteOpenTagXML ( des , "lc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc_List" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , coeffa ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , coeffb ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , coeffc ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , coeffd ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , coeffe ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , coefff ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element lc" ); - goto ERREUR; - } - - /* Fermeture de l'element lc_List */ - - cr = cai_WriteCloseTagXML ( des , "lc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc_List" ); - goto ERREUR; - } - - /* sous element pc_List */ - - cr = cai_WriteOpenTagXML ( des , "pc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc_List" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , coeffap ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , coeffbp ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , coeffcp ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , coeffdp ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , coeffep ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , coefffp ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element pc" ); - goto ERREUR; - } - - /* Fermeture de l'element pc_List */ - - cr = cai_WriteCloseTagXML ( des , "pc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc_List" ); - goto ERREUR; - } - - /* Fermeture de l'element Direct_Location_Model */ - - cr = cai_WriteCloseTagXML ( des , "Direct_Location_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Direct_Location_Model" ); - goto ERREUR; - } - - /* sous element Reverse_Location_Model */ - - cr = cai_WriteOpenTagXML ( des , "Reverse_Location_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Reverse_Location_Model" ); - goto ERREUR; - } - - /* sous element lc_List */ - - cr = cai_WriteOpenTagXML ( des , "lc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc_List" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , rlma ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , rlmb ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , rlmc ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , rlmd ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , rlme ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , rlmf ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element lc" ); - goto ERREUR; - } - - /* Fermeture de l'element lc_List */ - - cr = cai_WriteCloseTagXML ( des , "lc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc_List" ); - goto ERREUR; - } - - /* sous element pc_List */ - - cr = cai_WriteOpenTagXML ( des , "pc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc_List" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , rlmap ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , rlmbp ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , rlmcp ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , rlmdp ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , rlmep ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , rlmfp ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element pc" ); - goto ERREUR; - } - - /* Fermeture de l'element pc_List */ - - cr = cai_WriteCloseTagXML ( des , "pc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc_List" ); - goto ERREUR; - } - - /* Fermeture de l'element Reverse_Location_Model */ - - cr = cai_WriteCloseTagXML ( des , "Reverse_Location_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Reverse_Location_Model" ); - goto ERREUR; - } - - /* Fermeture de l'element Simplified_Location_Model */ - - cr = cai_WriteCloseTagXML ( des , "Simplified_Location_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Simplified_Location_Model" ); - goto ERREUR; - } - - /* Fermeture de l'element Geoposition */ - - cr = cai_WriteCloseTagXML ( des , "Geoposition" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Geoposition" ); - goto ERREUR; - } - - /* sous element Production */ - - cr = cai_WriteOpenTagXML ( des , "Production" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Production" ); - goto ERREUR; - } - - /* sous element DATASET_PRODUCER_NAME */ - - cr = cai_WriteElementXML ( des , "DATASET_PRODUCER_NAME" , processing_center ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DATASET_PRODUCER_NAME" ); - goto ERREUR; - } - -/******************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout attribut href="http://www.spotimage.fr" */ -/******************************************************************************/ - - /* sous element DATASET_PRODUCER_URL */ - type=1; - cr = cai_WriteElementXMLWithAttribute ( des , "DATASET_PRODUCER_URL" , "" , - "href" , "http://www.spotimage.fr" ,type); - - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DATASET_PRODUCER_URL" ); - goto ERREUR; - } - - /* sous element DATASET_PRODUCTION_DATE */ - - sprintf ( valeur , "%.4d-%.2d-%.2d %.2d:%.2d:%.2d" , product_annee , - product_mois , product_jour , product_heure , product_min , - product_sec ); - - cr = cai_WriteElementXML ( des , "DATASET_PRODUCTION_DATE" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DATASET_PRODUCTION_DATE" ); - goto ERREUR; - } - - /* sous element PRODUCT_TYPE */ - - cr = cai_WriteElementXML ( des , "PRODUCT_TYPE" , product_type ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PRODUCT_TYPE" ); - goto ERREUR; - } - - /* sous element PRODUCT_INFO */ - - sprintf ( prod_info , "Spot SYSTEM SCENE level %s" , niv_trait ); - - cr = cai_WriteElementXML ( des , "PRODUCT_INFO" , prod_info ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PRODUCT_INFO" ); - goto ERREUR; - } - - /* sous element JOB_ID */ - - cr = cai_WriteElementXML ( des , "JOB_ID" , job_id ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element JOB_ID" ); - goto ERREUR; - } - - /* sous element Production_Facility */ - - cr = cai_WriteOpenTagXML ( des , "Production_Facility" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Production_Facility" ); - goto ERREUR; - } - - /* sous element SOFTWARE_NAME */ - - cr = cai_WriteElementXML ( des , "SOFTWARE_NAME" , software_name ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SOFTWARE_NAME" ); - goto ERREUR; - } - - /* sous element SOFTWARE_VERSION */ - - cr = cai_WriteElementXML ( des , "SOFTWARE_VERSION" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SOFTWARE_VERSION" ); - goto ERREUR; - } - - /* sous element PROCESSING_CENTER */ - - cr = cai_WriteElementXML ( des , "PROCESSING_CENTER" , software_name ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PROCESSING_CENTER" ); - goto ERREUR; - } - - /* Fermeture de l'element Production_Facility */ - - cr = cai_WriteCloseTagXML ( des , "Production_Facility" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Production_Facility" ); - goto ERREUR; - } - - /* Fermeture de l'element Production */ - - cr = cai_WriteCloseTagXML ( des , "Production" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Production" ); - goto ERREUR; - } - - /* sous element Raster_Dimensions */ - - cr = cai_WriteOpenTagXML ( des , "Raster_Dimensions" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Raster_Dimensions" ); - goto ERREUR; - } - - /* sous element NCOLS */ - - sprintf ( valeur , "%d" , nb_col ); - cr = cai_WriteElementXML ( des , "NCOLS" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element NCOLS" ); - goto ERREUR; - } - - /* sous element NROWS */ - - sprintf ( valeur , "%d" , nb_lig ); - cr = cai_WriteElementXML ( des , "NROWS" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element NROWS" ); - goto ERREUR; - } - - /* sous element NBANDS */ - - sprintf ( valeur , "%d" , nb_bs ); - cr = cai_WriteElementXML ( des , "NBANDS" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element NBANDS" ); - goto ERREUR; - } - - /* Fermeture de l'element Raster_Dimensions */ - - cr = cai_WriteCloseTagXML ( des , "Raster_Dimensions" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Raster_Dimensions" ); - goto ERREUR; - } - - /* sous element Raster_Encoding */ - - cr = cai_WriteOpenTagXML ( des , "Raster_Encoding" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Raster_Encoding" ); - goto ERREUR; - } - - /* sous element NBITS */ - - cr = cai_WriteElementXML ( des , "NBITS" , "8" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element NBITS" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element DATA_TYPE */ -/****************************************************************************/ - - /* sous element DATA_TYPE */ - - cr = cai_WriteElementXML ( des , "DATA_TYPE" , "UNSIGNED" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DATA_TYPE" ); - goto ERREUR; - } - - /* sous element BYTEORDER */ - - cr = cai_WriteElementXML ( des , "BYTEORDER" , "M" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BYTEORDER" ); - goto ERREUR; - } - - /* sous element BANDS_LAYOUT */ - - cr = cai_WriteElementXML ( des , "BANDS_LAYOUT" , band_layout ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BANDS_LAYOUT" ); - goto ERREUR; - } - - /* sous element SKIPBYTES */ - - cr = cai_WriteElementXML ( des , "SKIPBYTES" , "0" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SKIPBYTES" ); - goto ERREUR; - } - - /* sous element COMPRESSION_NAME */ - - cr = cai_WriteElementXML ( des , "COMPRESSION_NAME" , "NONE" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element COMPRESSION_NAME" ); - goto ERREUR; - } - - /* Fermeture de l'element Raster_Encoding */ - - cr = cai_WriteCloseTagXML ( des , "Raster_Encoding" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Raster_Encoding" ); - goto ERREUR; - } - - /* sous element Data_Processing */ - - cr = cai_WriteOpenTagXML ( des , "Data_Processing" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Data_Processing" ); - goto ERREUR; - } - - /* sous element PROCESSING_LEVEL */ - - cr = cai_WriteElementXML ( des , "PROCESSING_LEVEL" , niv_trait ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PROCESSING_LEVEL" ); - goto ERREUR; - } - - /* sous element GEOMETRIC_PROCESSING */ - - if ( strncmp ( niv_trait , "2A" , 2 ) == 0) - { - cr = cai_WriteElementXML ( des , "GEOMETRIC_PROCESSING" , "CARTO" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element GEOMETRIC_PROCESSING" ); - goto ERREUR; - } - } - else - if ( ( strncmp ( niv_trait , "1A" , 2 ) == 0) || - ( strncmp ( niv_trait , "0" , 1 ) == 0) ) - { - cr = cai_WriteElementXML ( des , "GEOMETRIC_PROCESSING" , "RAW" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element GEOMETRIC_PROCESSING" ); - goto ERREUR; - } - } - else - { - cr = cai_WriteElementXML ( des , "GEOMETRIC_PROCESSING" , "SYSTEM" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element GEOMETRIC_PROCESSING" ); - goto ERREUR; - } - } - - /* sous element RADIOMETRIC_PROCESSING */ - - if ( strncmp ( niv_trait , "0" , 1 ) != 0) - { - cr = cai_WriteElementXML ( des , "RADIOMETRIC_PROCESSING" , "SYSTEM" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element RADIOMETRIC_PROCESSING" ); - goto ERREUR; - } - } - else - { - cr = cai_WriteElementXML ( des , "RADIOMETRIC_PROCESSING" , "NONE" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element RADIOMETRIC_PROCESSING" ); - goto ERREUR; - } - } - - /* sous element SPECTRAL_PROCESSING */ - - if ( ( codecapt == 'I' ) && ( nb_bs == 3 ) ) - { - cr = cai_WriteElementXML ( des , "SPECTRAL_PROCESSING" , "X" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SPECTRAL_PROCESSING" ); - goto ERREUR; - } - } - else - if ( ( codecapt == 'M' ) && ( nb_bs == 3 ) ) - { - cr = cai_WriteElementXML ( des , "SPECTRAL_PROCESSING" , "M+X" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SPECTRAL_PROCESSING" ); - goto ERREUR; - } - } - else - if ( ( codecapt == 'M' ) && ( nb_bs == 4 ) ) - { - cr = cai_WriteElementXML ( des , "SPECTRAL_PROCESSING" , "M+I" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SPECTRAL_PROCESSING" ); - goto ERREUR; - } - } - - /* sous element Processing_Options */ - - cr = cai_WriteOpenTagXML ( des , "Processing_Options" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Processing_Options" ); - goto ERREUR; - } - - /* sous element MEAN_RECTIFICATION_ELEVATION */ - - if ( strncmp ( niv_trait , "1B" , 2 ) == 0) - { - cr = cai_WriteElementXML ( des , "MEAN_RECTIFICATION_ELEVATION" , "0" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element MEAN_RECTIFICATION_ELEVATION" ); - goto ERREUR; - } - } - else - if ( strncmp ( niv_trait , "2A" , 2 ) == 0) - { - cr = cai_WriteElementXML ( des , "MEAN_RECTIFICATION_ELEVATION" , mean ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element MEAN_RECTIFICATION_ELEVATION" ); - goto ERREUR; - } - } - /* sous element Dynamic_Stretch */ - - cr = cai_WriteOpenTagXML ( des , "Dynamic_Stretch" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Dynamic_Stretch" ); - goto ERREUR; - } - - for ( i = 0 ; i < nb_bs ; i++ ) - { - /* sous element Thresholds */ - - cr = cai_WriteOpenTagXML ( des , "Thresholds" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Thresholds" ); - goto ERREUR; - } - - /* sous element BAND_INDEX */ - - sprintf ( valeur , "%d" , (i+1) ); - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BAND_INDEX" ); - goto ERREUR; - } - - /* sous element LOW_THRESHOLD */ - - cr = cai_WriteElementXML ( des , "LOW_THRESHOLD" , lowtresh[i] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element LOW_THRESHOLD" ); - goto ERREUR; - } - - /* sous element HIGH_THRESHOLD */ - - cr = cai_WriteElementXML ( des , "HIGH_THRESHOLD" , uptresh[i] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element HIGH_THRESHOLD" ); - goto ERREUR; - } - - /* Fermeture de l'element Thresholds */ - - cr = cai_WriteCloseTagXML ( des , "Thresholds" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Thresholds" ); - goto ERREUR; - } - } - /* Fermeture de l'element Dynamic_Stretch */ - - cr = cai_WriteCloseTagXML ( des , "Dynamic_Stretch" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Dynamic_Stretch" ); - goto ERREUR; - } - - /* sous element LINE_SHIFT */ - - cr = cai_WriteElementXML ( des , "LINE_SHIFT" , shval ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element LINE_SHIFT" ); - goto ERREUR; - } - - if ( ( strcmp ( niv_trait , "1A" ) != 0) && - ( strcmp ( niv_trait , "0" ) != 0) ) - { - /* sous element RESAMPLING_METHOD */ - - cr = cai_WriteElementXML ( des , "RESAMPLING_METHOD" , resampling ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element RESAMPLING_METHOD" ); - goto ERREUR; - } - - /* sous element Sampling_Step */ - - cr = cai_WriteOpenTagXML ( des , "Sampling_Step" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Sampling_Step" ); - goto ERREUR; - } - - /* sous element SAMPLING_STEP_X */ - - cr = cai_WriteElementXML ( des , "SAMPLING_STEP_X" , taille_pixlig ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SAMPLING_STEP_X" ); - goto ERREUR; - } - - /* sous element SAMPLING_STEP_Y */ - - cr = cai_WriteElementXML ( des , "SAMPLING_STEP_Y" , taille_pixcol ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SAMPLING_STEP_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Sampling_Step */ - - cr = cai_WriteCloseTagXML ( des , "Sampling_Step" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Sampling_Step" ); - goto ERREUR; - } - } - /* sous element SWIR_BAND_REGISTRATION_FLAG */ - - if ( swir == 1 ) - cr = cai_WriteElementXML ( des , "SWIR_BAND_REGISTRATION_FLAG" , "Y" ); - else - cr = cai_WriteElementXML ( des , "SWIR_BAND_REGISTRATION_FLAG" , "N" ); - - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SWIR_BAND_REGISTRATION_FLAG" ); - goto ERREUR; - } - - /* Fermeture de l'element Processing_Options */ - - cr = cai_WriteCloseTagXML ( des , "Processing_Options" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Processing_Options" ); - goto ERREUR; - } - - /* Fermeture de l'element Data_Processing */ - - cr = cai_WriteCloseTagXML ( des , "Data_Processing" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Data_Processing" ); - goto ERREUR; - } - - /* sous element Data_Access */ - - cr = cai_WriteOpenTagXML ( des , "Data_Access" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Data_Access" ); - goto ERREUR; - } - - /* sous element DATA_FILE_ORGANISATION */ - - cr = cai_WriteElementXML ( des , "DATA_FILE_ORGANISATION" , "BAND_COMPOSITE" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DATA_FILE_ORGANISATION" ); - goto ERREUR; - } - - /* sous element DATA_FILE_FORMAT */ - - cr = cai_WriteElementXML ( des , "DATA_FILE_FORMAT" , "RAW" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DATA_FILE_FORMAT" ); - goto ERREUR; - } - - /* sous element Data_File */ - - cr = cai_WriteOpenTagXML ( des , "Data_File" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Data_File" ); - goto ERREUR; - } - - /* sous element DATA_FILE_PATH */ - - cr = cai_WriteElementXML ( des , "DATA_FILE_PATH" , "./" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DATA_FILE_PATH" ); - goto ERREUR; - } - - /* Fermeture de l'element Data_File */ - - cr = cai_WriteCloseTagXML ( des , "Data_File" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Data_File" ); - goto ERREUR; - } - - /* Fermeture de l'element Data_Access */ - - cr = cai_WriteCloseTagXML ( des , "Data_Access" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Data_Access" ); - goto ERREUR; - } - - /* sous element Image_Display */ - - cr = cai_WriteOpenTagXML ( des , "Image_Display" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Image_Display" ); - goto ERREUR; - } - - /* sous element Band_Display_Order */ - - cr = cai_WriteOpenTagXML ( des , "Band_Display_Order" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Band_Display_Order" ); - goto ERREUR; - } - - if ( strncasecmp ( mode_spect , "PM" , 2) == 0) - { - - /* sous element RED_CHANNEL */ - - cr = cai_WriteElementXML ( des , "RED_CHANNEL" , "1" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element RED_CHANNEL" ); - goto ERREUR; - } - /* sous element GREEN_CHANNEL */ - - cr = cai_WriteElementXML ( des , "GREEN_CHANNEL" , "1" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element GREEN_CHANNEL" ); - goto ERREUR; - } - /* sous element BLUE_CHANNEL */ - - cr = cai_WriteElementXML ( des , "BLUE_CHANNEL" , "1" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BLUE_CHANNEL" ); - goto ERREUR; - } - } - else - if ( ( strncasecmp ( mode_spect , "XS" , 2) == 0)|| - ( strncasecmp ( mode_spect , "XI" , 2) == 0) ) - { - /* sous element RED_CHANNEL */ - - cr = cai_WriteElementXML ( des , "RED_CHANNEL" , "3" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element RED_CHANNEL" ); - goto ERREUR; - } - /* sous element GREEN_CHANNEL */ - - cr = cai_WriteElementXML ( des , "GREEN_CHANNEL" , "2" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element GREEN_CHANNEL" ); - goto ERREUR; - } - - /* sous element BLUE_CHANNEL */ - - cr = cai_WriteElementXML ( des , "BLUE_CHANNEL" , "1" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BLUE_CHANNEL" ); - goto ERREUR; - } - } - - /* Fermeture de l'element Band_Display_Order */ - - cr = cai_WriteCloseTagXML ( des , "Band_Display_Order" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Band_Display_Order" ); - goto ERREUR; - } - - /* sous element Special_Value */ - - cr = cai_WriteOpenTagXML ( des , "Special_Value" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Special_Value" ); - goto ERREUR; - } - - /* sous element SPECIAL_VALUE_INDEX */ - - cr = cai_WriteElementXML ( des , "SPECIAL_VALUE_INDEX" , "0" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SPECIAL_VALUE_INDEX" ); - goto ERREUR; - } -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : FA : SPECIAL_VALUE_TEXT NODATA a la place NO_DATA */ -/*****************************************************************************/ - /* sous element SPECIAL_VALUE_TEXT */ - - cr = cai_WriteElementXML ( des , "SPECIAL_VALUE_TEXT" , "NODATA" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SPECIAL_VALUE_TEXT" ); - goto ERREUR; - } - - /* sous element Special_Value_Color */ - - cr = cai_WriteOpenTagXML ( des , "Special_Value_Color" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Special_Value_Color" ); - goto ERREUR; - } - - /* sous element RED_LEVEL */ - - cr = cai_WriteElementXML ( des , "RED_LEVEL" , "0" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element RED_LEVEL" ); - goto ERREUR; - } - - /* sous element GREEN_LEVEL */ - - cr = cai_WriteElementXML ( des , "GREEN_LEVEL" , "0" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element GREEN_LEVEL" ); - goto ERREUR; - } - - /* sous element BLUE_LEVEL */ - - cr = cai_WriteElementXML ( des , "BLUE_LEVEL" , "0" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BLUE_LEVEL" ); - goto ERREUR; - } -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Rajouter ALPHA_LEVEL unqiement pour SPOT4 MIR */ -/*****************************************************************************/ - - if ((nb_bs == 4)&&(satellite_index==4)) - { - /* sous element ALPHA_LEVEL */ - - cr = cai_WriteElementXML ( des , "ALPHA_LEVEL" , "0" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element ALPHA_LEVEL" ); - goto ERREUR; - } - } - - /* Fermeture de l'element Special_Value_Color */ - - cr = cai_WriteCloseTagXML ( des , "Special_Value_Color" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Special_Value_Color" ); - goto ERREUR; - } - - /* Fermeture de l'element Special_Value */ - - cr = cai_WriteCloseTagXML ( des , "Special_Value" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Special_Value" ); - goto ERREUR; - } - - /* sous element Special_Value */ - - cr = cai_WriteOpenTagXML ( des , "Special_Value" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Special_Value" ); - goto ERREUR; - } - - /* sous element SPECIAL_VALUE_INDEX */ - - cr = cai_WriteElementXML ( des , "SPECIAL_VALUE_INDEX" , "255" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SPECIAL_VALUE_INDEX" ); - goto ERREUR; - } - -/******************************************************************************/ -/* MOD : VERSION : 4.7 : DM : remplacement de SATURATE par SATURATED */ -/******************************************************************************/ - - /* sous element SPECIAL_VALUE_TEXT */ - - cr = cai_WriteElementXML ( des , "SPECIAL_VALUE_TEXT" , "SATURATED" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SPECIAL_VALUE_TEXT" ); - goto ERREUR; - } - - /* sous element Special_Value_Color */ - - cr = cai_WriteOpenTagXML ( des , "Special_Value_Color" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Special_Value_Color" ); - goto ERREUR; - } - -/******************************************************************************/ -/* MOD : VERSION : 4.7 : DM : remplacement de 255 par 1 dans les element LEVEL*/ -/******************************************************************************/ - - /* sous element RED_LEVEL */ - - cr = cai_WriteElementXML ( des , "RED_LEVEL" , "1" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element RED_LEVEL" ); - goto ERREUR; - } - - /* sous element GREEN_LEVEL */ - - cr = cai_WriteElementXML ( des , "GREEN_LEVEL" , "1" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element GREEN_LEVEL" ); - goto ERREUR; - } - - /* sous element BLUE_LEVEL */ - - cr = cai_WriteElementXML ( des , "BLUE_LEVEL" , "1" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BLUE_LEVEL" ); - goto ERREUR; - } -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Rajouter ALPHA_LEVEL uniquement pour SPOT4 MIR */ -/*****************************************************************************/ - - if ((nb_bs == 4)&&(satellite_index==4)) - { - /* sous element ALPHA_LEVEL */ - - cr = cai_WriteElementXML ( des , "ALPHA_LEVEL" , "1" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element ALPHA_LEVEL" ); - goto ERREUR; - } - } - - /* Fermeture de l'element Special_Value_Color */ - - cr = cai_WriteCloseTagXML ( des , "Special_Value_Color" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Special_Value_Color" ); - goto ERREUR; - } - - /* Fermeture de l'element Special_Value */ - - cr = cai_WriteCloseTagXML ( des , "Special_Value" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Special_Value" ); - goto ERREUR; - } - - /* Fermeture de l'element Image_Display */ - - cr = cai_WriteCloseTagXML ( des , "Image_Display" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Image_Display" ); - goto ERREUR; - } - - /* sous element Image_Interpretation */ - - cr = cai_WriteOpenTagXML ( des , "Image_Interpretation" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Image_Interpretation" ); - goto ERREUR; - } - - for ( j = 0; j < nb_bs ; j++ ) - { - /* sous element Spectral_Band_Info */ - - cr = cai_WriteOpenTagXML ( des , "Spectral_Band_Info" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Spectral_Band_Info" ); - goto ERREUR; - } - - /* sous element BAND_INDEX */ - - sprintf ( valeur , "%d" , (j+1) ); - - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BAND_INDEX" ); - goto ERREUR; - } - - /* sous element BAND_DESCRIPTION */ - - if ( nb_bs == 1 ) - sprintf ( valeur , "PAN" ); - else - if ( ( ( j == 0) || ( j == 1 ) ) || ( j == 2 ) ) - sprintf ( valeur , "XS%d" , (j+1) ); - else - if ( j == 3 ) - sprintf ( valeur , "SWIR" ); - -/******************************************************************************/ -/* MOD : VERSION : 4.7 : DM : remplacement de BAND par BAND_DESCRIPTION */ -/******************************************************************************/ - - cr = cai_WriteElementXML ( des , "BAND_DESCRIPTION" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BAND_DESCRIPTION" ); - goto ERREUR; - } - - /* sous element PHYSICAL_CALIBRATION_DATE */ - - cr = cai_WriteElementXML ( des , "PHYSICAL_CALIBRATION_DATE" , datecalib ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PHYSICAL_CALIBRATION_DATE" ); - goto ERREUR; - } - - /* sous element PHYSICAL_BIAIS */ - - cr = cai_WriteElementXML ( des , "PHYSICAL_BIAIS" , gains_b[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PHYSICAL_BIAIS" ); - goto ERREUR; - } - - /* sous element PHYSICAL_GAIN */ - - cr = cai_WriteElementXML ( des , "PHYSICAL_GAIN" , gains_a[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PHYSICAL_GAIN" ); - goto ERREUR; - } - -/******************************************************************************/ -/* MOD : VERSION : 4.7 : DM : ajout de l'unite dans PHYSICAL_UNIT */ -/******************************************************************************/ - - /* sous element PHYSICAL_UNIT */ - - cr = cai_WriteElementXML ( des , "PHYSICAL_UNIT" , "equivalent radiance (W.m-2.Sr-1.um-1)" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PHYSICAL_UNIT" ); - goto ERREUR; - } - - /* Fermeture de l'element Spectral_Band_Info */ - - cr = cai_WriteCloseTagXML ( des , "Spectral_Band_Info" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Spectral_Band_Info" ); - goto ERREUR; - } - } - - /* Fermeture de l'element Image_Interpretation */ - - cr = cai_WriteCloseTagXML ( des , "Image_Interpretation" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Image_Interpretation" ); - goto ERREUR; - } - - /* sous element Data_Strip */ - - cr = cai_WriteOpenTagXML ( des , "Data_Strip" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Data_Strip" ); - goto ERREUR; - } - - /* sous element Satellite_Time */ - - cr = cai_WriteOpenTagXML ( des , "Satellite_Time" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Satellite_Time" ); - goto ERREUR; - } - - /* sous element UT_DATE */ - - sprintf ( valeur , "%.7d %.5d.000000" , utdatej , utdates ); - cr = cai_WriteElementXML ( des , "UT_DATE" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element UT_DATE" ); - goto ERREUR; - } - - /* sous element CLOCK_VALUE */ - - cr = cai_WriteElementXML ( des , "CLOCK_VALUE" , clockvalue ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element CLOCK_VALUE" ); - goto ERREUR; - } - - /* sous element CLOCK_PERIOD */ - - if ( clockperiod[0] != '\0' ) - sscanf ( clockperiod , "%lf" , &period ); - else - period = 0.0; - pico =0.000000000001; - period = period * pico; - - sprintf ( valeur , "%.12lf" , period ); - - cr = cai_WriteElementXML ( des , "CLOCK_PERIOD" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element CLOCK_PERIOD" ); - goto ERREUR; - } - - /* sous element BOARD_TIME */ - - cr = cai_WriteElementXML ( des , "BOARD_TIME" , boardtime ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BOARD_TIME" ); - goto ERREUR; - } - - /* Fermeture de l'element Satellite_Time */ - - cr = cai_WriteCloseTagXML ( des , "Satellite_Time" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Satellite_Time" ); - goto ERREUR; - } - - /* sous element Ephemeris */ - - cr = cai_WriteOpenTagXML ( des , "Ephemeris" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Ephemeris" ); - goto ERREUR; - } - - /* sous element SATELLITE_ALTITUDE */ - - cr = cai_WriteElementXML ( des , "SATELLITE_ALTITUDE" , sat_alt ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SATELLITE_ALTITUDE" ); - goto ERREUR; - } - - /* sous element NADIR_LAT */ - - sprintf ( valeur , "%lf" , lat_nad ); - cr = cai_WriteElementXML ( des , "NADIR_LAT" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element NADIR_LAT" ); - goto ERREUR; - } - - /* sous element NADIR_LON */ - - sprintf ( valeur , "%lf" , long_nad ); - cr = cai_WriteElementXML ( des , "NADIR_LON" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element NADIR_LON" ); - goto ERREUR; - } - - /* sous element Points */ - - cr = cai_WriteOpenTagXML ( des , "Points" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Points" ); - goto ERREUR; - } - - for ( j = 0; j < 8 ; j++ ) - { - /* sous element Point */ - - cr = cai_WriteOpenTagXML ( des , "Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Point" ); - goto ERREUR; - } - - /* sous element Location */ - - cr = cai_WriteOpenTagXML ( des , "Location" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Location" ); - goto ERREUR; - } - - /* sous element X */ - - sprintf ( valeur , "%.3lf" , X_loc[j]*1000.0 ); - cr = cai_WriteElementXML ( des , "X" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element X" ); - goto ERREUR; - } - - /* sous element Y */ - - sprintf ( valeur , "%.3lf" , Y_loc[j]*1000.0 ); - cr = cai_WriteElementXML ( des , "Y" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Y" ); - goto ERREUR; - } - - /* sous element Z */ - - sprintf ( valeur , "%.3lf" , Z_loc[j]*1000.0 ); - cr = cai_WriteElementXML ( des , "Z" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Z" ); - goto ERREUR; - } - - /* Fermeture de l'element Location */ - - cr = cai_WriteCloseTagXML ( des , "Location" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Location" ); - goto ERREUR; - } - - /* sous element Velocity */ - - cr = cai_WriteOpenTagXML ( des , "Velocity" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Velocity" ); - goto ERREUR; - } - - /* sous element X */ - - sprintf ( valeur , "%.3lf" , X_vel[j]*1000.0 ); - cr = cai_WriteElementXML ( des , "X" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element X" ); - goto ERREUR; - } - - /* sous element Y */ - - sprintf ( valeur , "%.3lf" , Y_vel[j]*1000.0 ); - cr = cai_WriteElementXML ( des , "Y" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Y" ); - goto ERREUR; - } - - /* sous element Z */ - - sprintf ( valeur , "%.3lf" , Z_vel[j]*1000.0 ); - cr = cai_WriteElementXML ( des , "Z" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Z" ); - goto ERREUR; - } - - /* Fermeture de l'element Velocity */ - - cr = cai_WriteCloseTagXML ( des , "Velocity" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Velocity" ); - goto ERREUR; - } - - /* sous element TIME */ - - cr = cai_WriteElementXML ( des , "TIME" , time[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIME" ); - goto ERREUR; - } - - /* Fermeture de l'element Point */ - - cr = cai_WriteCloseTagXML ( des , "Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Point" ); - goto ERREUR; - } - } - - if ( X_loc[8] != 0.0 ) - { - /* sous element Point */ - - cr = cai_WriteOpenTagXML ( des , "Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Point" ); - goto ERREUR; - } - - /* sous element Location */ - - cr = cai_WriteOpenTagXML ( des , "Location" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Location" ); - goto ERREUR; - } - - /* sous element X */ - - sprintf ( valeur , "%.3lf" , X_loc[8] ); - - cr = cai_WriteElementXML ( des , "X" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element X" ); - goto ERREUR; - } - - /* sous element Y */ - - sprintf ( valeur , "%.3lf" , Y_loc[8] ); - cr = cai_WriteElementXML ( des , "Y" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Y" ); - goto ERREUR; - } - - /* sous element Z */ - - sprintf ( valeur , "%.3lf" , Z_loc[8] ); - cr = cai_WriteElementXML ( des , "Z" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Z" ); - goto ERREUR; - } - - /* Fermeture de l'element Location */ - - cr = cai_WriteCloseTagXML ( des , "Location" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Location" ); - goto ERREUR; - } - - /* sous element Velocity */ - - cr = cai_WriteOpenTagXML ( des , "Velocity" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Velocity" ); - goto ERREUR; - } - - /* sous element X */ - - sprintf ( valeur , "%.3lf" , X_vel[8]*1000.0 ); - cr = cai_WriteElementXML ( des , "X" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element X" ); - goto ERREUR; - } - - /* sous element Y */ - - sprintf ( valeur , "%lf" , Y_vel[8]*1000.0 ); - cr = cai_WriteElementXML ( des , "Y" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Y" ); - goto ERREUR; - } - - /* sous element Z */ - - sprintf ( valeur , "%.3lf" , Z_vel[8]*1000.0 ); - cr = cai_WriteElementXML ( des , "Z" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Z" ); - goto ERREUR; - } - - /* Fermeture de l'element Velocity */ - - cr = cai_WriteCloseTagXML ( des , "Velocity" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Velocity" ); - goto ERREUR; - } - - /* sous element TIME */ - - cr = cai_WriteElementXML ( des , "TIME" , time[8] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIME" ); - goto ERREUR; - } - - /* Fermeture de l'element Point */ - - cr = cai_WriteCloseTagXML ( des , "Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Point" ); - goto ERREUR; - } - - } - /* Fermeture de l'element Points */ - - cr = cai_WriteCloseTagXML ( des , "Points" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Points" ); - goto ERREUR; - } - - /* sous element DORIS_USED */ - - cr = cai_WriteElementXML ( des , "DORIS_USED" , dorisused ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DORIS_USED" ); - goto ERREUR; - } - - if ( satellite_index == 4 ) - { - /* sous element Orbital_Bulletin */ - - cr = cai_WriteOpenTagXML ( des , "Orbital_Bulletin" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Orbital_Bulletin" ); - goto ERREUR; - } - - /* sous element UT_DATE */ - - sprintf ( valeur , "%.7d %.5d.000000" , jourjul , datejul ); - cr = cai_WriteElementXML ( des , "UT_DATE" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element UT_DATE" ); - goto ERREUR; - } - - /* sous element ELLIPSE_AXIS */ - - cr = cai_WriteElementXML ( des , "ELLIPSE_AXIS" , axis ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element ELLIPSE_AXIS" ); - goto ERREUR; - } - - /* sous element ELLIPSE_ECCENTRICITY_VECTOR_EX */ - - cr = cai_WriteElementXML ( des , "ELLIPSE_ECCENTRICITY_VECTOR_EX" , ex ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element ELLIPSE_ECCENTRICITY_VECTOR_EX" ); - goto ERREUR; - } - - /* sous element ELLIPSE_ECCENTRICITY_VECTOR_EY */ - - cr = cai_WriteElementXML ( des , "ELLIPSE_ECCENTRICITY_VECTOR_EY" , ey ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element ELLIPSE_ECCENTRICITY_VECTOR_EY" ); - goto ERREUR; - } - - /* sous element ELLIPSE_INCLINATION */ - - cr = cai_WriteElementXML ( des , "ELLIPSE_INCLINATION" , inclin ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element ELLIPSE_INCLINATION" ); - goto ERREUR; - } - - /* sous element RIGHT_ASCENSION */ - - cr = cai_WriteElementXML ( des , "RIGHT_ASCENSION" , ascension ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element RIGHT_ASCENSION" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : erreur d'orthographe sur LATITUDE_ARGUMENT */ -/* et Look_Angles */ -/*****************************************************************************/ - - /* sous element LATITUDE_ARGUMENT */ - - cr = cai_WriteElementXML ( des , "LATITUDE_ARGUMENT" , latarg ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element LATITUDE_ARGUMENT" ); - goto ERREUR; - } - - /* sous element P7 */ - - cr = cai_WriteElementXML ( des , "P7" , p7 ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element P7" ); - goto ERREUR; - } - - /* sous element P8 */ - - cr = cai_WriteElementXML ( des , "P8" , p8 ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element P8" ); - goto ERREUR; - } - - /* sous element P9 */ - - cr = cai_WriteElementXML ( des , "P9" , p9 ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element P9" ); - goto ERREUR; - } - - /* sous element P10 */ - - cr = cai_WriteElementXML ( des , "P10" , p10 ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element P10" ); - goto ERREUR; - } - - /* Fermeture de l'element Orbital_Bulletin */ - - cr = cai_WriteCloseTagXML ( des , "Orbital_Bulletin" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Orbital_Bulletin" ); - goto ERREUR; - } - - } - - /* Fermeture de l'element Ephemeris */ - - cr = cai_WriteCloseTagXML ( des , "Ephemeris" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Ephemeris" ); - goto ERREUR; - } - - /* sous element Satellite_Attitudes */ - - cr = cai_WriteOpenTagXML ( des , "Satellite_Attitudes" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Satellite_Attitudes" ); - goto ERREUR; - } - - /* sous element Raw_Attitudes */ - - cr = cai_WriteOpenTagXML ( des , "Raw_Attitudes" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Raw_Attitudes" ); - goto ERREUR; - } - - /* sous element Aocs_Attitude */ - - cr = cai_WriteOpenTagXML ( des , "Aocs_Attitude" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Aocs_Attitude" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element Angles_List */ -/*****************************************************************************/ - - /* sous element Angles_List */ - - cr = cai_WriteOpenTagXML ( des , "Angles_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Angles_List" ); - goto ERREUR; - } - - for ( j = 0; j < 2 ; j++ ) - { - /* sous element Angles */ - - cr = cai_WriteOpenTagXML ( des , "Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Angles" ); - goto ERREUR; - } - - /* sous element TIME */ - - cr = cai_WriteElementXML ( des , "TIME" , timeyaw[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIME" ); - goto ERREUR; - } - - /* sous element YAW */ - - cr = cai_WriteElementXML ( des , "YAW" , yaw_angle[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element YAW" ); - goto ERREUR; - } - - /* sous element PITCH */ - - cr = cai_WriteElementXML ( des , "PITCH" , pitch_angle[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PITCH" ); - goto ERREUR; - } - - /* sous element ROLL */ - - cr = cai_WriteElementXML ( des , "ROLL" , roll_angle[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element ROLL" ); - goto ERREUR; - } - - /* sous element OUT_OF_RANGE */ - - cr = cai_WriteElementXML ( des , "OUT_OF_RANGE" , "N" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element OUT_OF_RANGE" ); - goto ERREUR; - } - - /* Fermeture de l'element Angles */ - - cr = cai_WriteCloseTagXML ( des , "Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Angles" ); - goto ERREUR; - } - } - - /* Fermeture de l'element Angles_List */ - - cr = cai_WriteCloseTagXML ( des , "Angles_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Angles_List" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element Angular_Speeds_List */ -/*****************************************************************************/ - - /* sous element Angular_Speeds_List */ - - cr = cai_WriteOpenTagXML ( des , "Angular_Speeds_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Angular_Speeds_List" ); - goto ERREUR; - } - - for ( j = 0; j < 72 ; j++ ) - { - /* sous element Angular_Speeds */ - - cr = cai_WriteOpenTagXML ( des , "Angular_Speeds" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Angular_Speeds" ); - goto ERREUR; - } - - /* sous element TIME */ - - cr = cai_WriteElementXML ( des , "TIME" , time_angle[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIME" ); - goto ERREUR; - } - - /* sous element YAW */ - - cr = cai_WriteElementXML ( des , "YAW" , yaw[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element YAW" ); - goto ERREUR; - } - - /* sous element PITCH */ - - cr = cai_WriteElementXML ( des , "PITCH" , pitch[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PITCH" ); - goto ERREUR; - } - - /* sous element ROLL */ - - cr = cai_WriteElementXML ( des , "ROLL" , roll[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element ROLL" ); - goto ERREUR; - } - - /* sous element OUT_OF_RANGE */ - - cr = cai_WriteElementXML ( des , "OUT_OF_RANGE" , outofrange ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element OUT_OF_RANGE" ); - goto ERREUR; - } - - /* Fermeture de l'element Angular_Speeds */ - - cr = cai_WriteCloseTagXML ( des , "Angular_Speeds" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Angular_Speeds" ); - goto ERREUR; - } - } - - if ( strcmp ( yaw[72] , "" ) != 0) - { - /* sous element Angular_Speeds */ - - cr = cai_WriteOpenTagXML ( des , "Angular_Speeds" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Angular_Speeds" ); - goto ERREUR; - } - - /* sous element TIME */ - - cr = cai_WriteElementXML ( des , "TIME" , time_angle[72] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIME" ); - goto ERREUR; - } - - /* sous element YAW */ - - cr = cai_WriteElementXML ( des , "YAW" , yaw[72] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element YAW" ); - goto ERREUR; - } - - /* sous element PITCH */ - - cr = cai_WriteElementXML ( des , "PITCH" , pitch[72] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PITCH" ); - goto ERREUR; - } - - /* sous element ROLL */ - - cr = cai_WriteElementXML ( des , "ROLL" , roll[72] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element ROLL" ); - goto ERREUR; - } - - /* sous element OUT_OF_RANGE */ - - cr = cai_WriteElementXML ( des , "OUT_OF_RANGE" , outofrange ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element OUT_OF_RANGE" ); - goto ERREUR; - } - - /* Fermeture de l'element Angular_Speeds */ - - cr = cai_WriteCloseTagXML ( des , "Angular_Speeds" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Angular_Speeds" ); - goto ERREUR; - } - } - - /* Fermeture de l'element Angular_Speeds_List */ - - cr = cai_WriteCloseTagXML ( des , "Angular_Speeds_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Angular_Speeds_List" ); - goto ERREUR; - } - - /* Fermeture de l'element Aocs_Attitude */ - - cr = cai_WriteCloseTagXML ( des , "Aocs_Attitude" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Aocs_Attitude" ); - goto ERREUR; - } - - /* Fermeture de l'element Raw_Attitudes */ - - cr = cai_WriteCloseTagXML ( des , "Raw_Attitudes" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Raw_Attitudes" ); - goto ERREUR; - } - - /* Fermeture de l'element Satellite_Attitudes */ - - cr = cai_WriteCloseTagXML ( des , "Satellite_Attitudes" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Satellite_Attitudes" ); - goto ERREUR; - } - - /* sous element Sensor_Configuration */ - - cr = cai_WriteOpenTagXML ( des , "Sensor_Configuration" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Sensor_Configuration" ); - goto ERREUR; - } - - /* sous element Time_Stamp */ - - cr = cai_WriteOpenTagXML ( des , "Time_Stamp" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Time_Stamp " ); - goto ERREUR; - } - - /* sous element LINE_PERIOD */ - - sprintf ( valeur , "%.12lf" , periodeligne ); - cr = cai_WriteElementXML ( des , "LINE_PERIOD" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element LINE_PERIOD" ); - goto ERREUR; - } - - /* sous element SCENE_CENTER_TIME */ - - cr = cai_WriteElementXML ( des , "SCENE_CENTER_TIME" , time_scenecenter ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SCENE_CENTER_TIME" ); - goto ERREUR; - } - - /* sous element SCENE_CENTER_LINE */ - - sprintf ( valeur , "%d" , nbc_c ); - cr = cai_WriteElementXML ( des , "SCENE_CENTER_LINE" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SCENE_CENTER_LINE" ); - goto ERREUR; - } - - /* sous element SCENE_CENTER_COL */ - - sprintf ( valeur , "%d" , nbl_c ); - cr = cai_WriteElementXML ( des , "SCENE_CENTER_COL" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SCENE_CENTER_COL" ); - goto ERREUR; - } - - /* Fermeture de l'element Time_Stamp */ - - cr = cai_WriteCloseTagXML ( des , "Time_Stamp" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Time_Stamp" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element Instrument_look_Angles_List */ -/*****************************************************************************/ - - /* sous element Instrument_Look_Angles_List */ - - cr = cai_WriteOpenTagXML ( des , "Instrument_Look_Angles_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Instrument_Look_Angles_List" ); - goto ERREUR; - } - - j = 0; - while ( ( j < nb_bs ) && ( j < 3 ) ) - { - /* sous element Instrument_Look_Angles */ - - cr = cai_WriteOpenTagXML ( des , "Instrument_Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Instrument_Look_Angles" ); - goto ERREUR; - } - - /* sous element VALIDITY_DATE */ - - cr = cai_WriteElementXML ( des , "VALIDITY_DATE" , datecalib ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element VALIDITY_DATE" ); - goto ERREUR; - } - - /* sous element BAND_INDEX */ - - sprintf ( valeur , "%d" , (j+1) ); - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BAND_INDEX" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element Look_Angles_List */ -/*****************************************************************************/ - - /* sous element Look_Angles_List */ - - cr = cai_WriteOpenTagXML ( des , "Look_Angles_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Look_Angles_List" ); - goto ERREUR; - } - - /* sous element Look_Angles */ - - cr = cai_WriteOpenTagXML ( des , "Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Look_Angles" ); - goto ERREUR; - } - - /* sous element DETECTOR_ID */ - - cr = cai_WriteElementXML ( des , "DETECTOR_ID" , "1" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DETECTOR_ID" ); - goto ERREUR; - } -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : DIMAP tag LOOK_ANGLE_LIST valeurs de PSI_X et */ -/* PSI_Y 1er et dernier detecteur inverses */ -/*****************************************************************************/ - - /* sous element PSI_X */ - - sprintf ( valeur , "%lf" , psi_x_last[0] ); - cr = cai_WriteElementXML ( des , "PSI_X" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PSI_X" ); - goto ERREUR; - } - - /* sous element PSI_Y */ - - sprintf ( valeur , "%lf" , psi_y_last[0] ); - cr = cai_WriteElementXML ( des , "PSI_Y" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PSI_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Look_Angles */ - - cr = cai_WriteCloseTagXML ( des , "Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Look_Angles" ); - goto ERREUR; - } - - /* sous element Look_Angle */ - - cr = cai_WriteOpenTagXML ( des , "Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Look_Angles" ); - goto ERREUR; - } - - /* sous element DETECTOR_ID */ - -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : erreur d'ecriture detector_id lookangle pour */ -/* PAN */ -/*****************************************************************************/ - - if ( nb_bs == 1 ) - detect_id = 6000; - else - detect_id = 3000; - - sprintf ( valeur , "%d" , detect_id ); - - cr = cai_WriteElementXML ( des , "DETECTOR_ID" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DETECTOR_ID" ); - goto ERREUR; - } - - /* sous element PSI_X */ - - sprintf ( valeur , "%lf" , psi_x_first[0] ); - cr = cai_WriteElementXML ( des , "PSI_X" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PSI_X" ); - goto ERREUR; - } - - /* sous element PSI_Y */ - - sprintf ( valeur , "%lf" , psi_y_first[0] ); - cr = cai_WriteElementXML ( des , "PSI_Y" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PSI_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Look_Angles */ - - cr = cai_WriteCloseTagXML ( des , "Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Look_Angles" ); - goto ERREUR; - } - - /* Fermeture de l'element Look_Angles_List */ - - cr = cai_WriteCloseTagXML ( des , "Look_Angles_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Look_Angles_List" ); - goto ERREUR; - } - - /* Fermeture de l'element Instrument_Look_Angles */ - - cr = cai_WriteCloseTagXML ( des , "Instrument_Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Instrument_Look_Angles" ); - goto ERREUR; - } - j++; - } - - while ( ( nb_bs != 1 ) && ( j < nb_bs + 1 ) ) - { - /* sous element Instrument_Look_Angles */ - - cr = cai_WriteOpenTagXML ( des , "Instrument_Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Instrument_Look_Angles" ); - goto ERREUR; - } - - /* sous element VALIDITY_DATE */ - - cr = cai_WriteElementXML ( des , "VALIDITY_DATE" , datecalib ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element VALIDITY_DATE" ); - goto ERREUR; - } - - /* sous element BAND_INDEX */ - - sprintf ( valeur , "%d" , (j+1) ); - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BAND_INDEX" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element Look_Angles_List */ -/*****************************************************************************/ - - /* sous element Look_Angles_List */ - - cr = cai_WriteOpenTagXML ( des , "Look_Angles_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Look_Angles_List" ); - goto ERREUR; - } - - - /* sous element Look_Angles */ - - cr = cai_WriteOpenTagXML ( des , "Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Look_Angles" ); - goto ERREUR; - } - - /* sous element DETECTOR_ID */ - - cr = cai_WriteElementXML ( des , "DETECTOR_ID" , "1" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DETECTOR_ID" ); - goto ERREUR; - } -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : DIMAP tag LOOK_ANGLE_LIST valeurs de PSI_X et */ -/* PSI_Y 1er et dernier detecteur inverses */ -/*****************************************************************************/ - - /* sous element PSI_X */ - - sprintf ( valeur , "%lf" , psi_x_last[j-2] ); - cr = cai_WriteElementXML ( des , "PSI_X" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PSI_X" ); - goto ERREUR; - } - - /* sous element PSI_Y */ - - sprintf ( valeur , "%lf" , psi_y_last[j-2] ); - cr = cai_WriteElementXML ( des , "PSI_Y" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PSI_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Look_Angles */ - - cr = cai_WriteCloseTagXML ( des , "Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Look_Angles" ); - goto ERREUR; - } - - /* sous element Look_Angles */ - - cr = cai_WriteOpenTagXML ( des , "Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Look_Angles" ); - goto ERREUR; - } - - /* sous element DETECTOR_ID */ - -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : erreur d'ecriture detector_id lookangle pour */ -/* PAN */ -/*****************************************************************************/ - - if ( nb_bs == 1 ) - detect_id = 6000; - else - detect_id = 3000; - - sprintf ( valeur , "%d" , detect_id ); - - cr = cai_WriteElementXML ( des , "DETECTOR_ID" , valeur ); - - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DETECTOR_ID" ); - goto ERREUR; - } - - /* sous element PSI_X */ - - sprintf ( valeur , "%lf" , psi_x_first[j-2] ); - cr = cai_WriteElementXML ( des , "PSI_X" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PSI_X" ); - goto ERREUR; - } - - /* sous element PSI_Y */ - - sprintf ( valeur , "%lf" , psi_y_first[j-2] ); - cr = cai_WriteElementXML ( des , "PSI_Y" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PSI_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Look_Angles */ - - cr = cai_WriteCloseTagXML ( des , "Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Look_Angles" ); - goto ERREUR; - } - - /* Fermeture de l'element Look_Angles_List */ - - cr = cai_WriteCloseTagXML ( des , "Look_Angles_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Look_Angles_List" ); - goto ERREUR; - } - - /* Fermeture de l'element Instrument_Look_Angles */ - - cr = cai_WriteCloseTagXML ( des , "Instrument_Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Instrument_Look_Angles" ); - goto ERREUR; - } - j++; - - } - - /* Fermeture de l'element Instrument_Look_Angles_List */ - - cr = cai_WriteCloseTagXML ( des , "Instrument_Look_Angles_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Instrument_Look_Angles_List" ); - goto ERREUR; - } - - /* sous element Mirror_Position */ - - cr = cai_WriteOpenTagXML ( des , "Mirror_Position" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Mirror_Position" ); - goto ERREUR; - } - - /* sous element STEP_COUNT */ - - cr = cai_WriteElementXML ( des , "STEP_COUNT" , mirror_step ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element STEP_COUNT" ); - goto ERREUR; - } - - /* Fermeture de l'element Mirror_Position */ - - cr = cai_WriteCloseTagXML ( des , "Mirror_Position" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Mirror_Position" ); - goto ERREUR; - } - - /* Fermeture de l'element Sensor_Configuration */ - - cr = cai_WriteCloseTagXML ( des , "Sensor_Configuration" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Sensor_Configuration" ); - goto ERREUR; - } - - /* sous element Frame_Counters */ - - cr = cai_WriteOpenTagXML ( des , "Frame_Counters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Frame_Counters" ); - goto ERREUR; - } - - /* sous element SEGMENT_START */ - - cr = cai_WriteElementXML ( des , "SEGMENT_START" , segmentstart ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SEGMENT_START" ); - goto ERREUR; - } - - /* sous element SCENE_START */ - - cr = cai_WriteElementXML ( des , "SCENE_START" , scenestart ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SCENE_START" ); - goto ERREUR; - } - - /* sous element SEGMENT_END */ - - cr = cai_WriteElementXML ( des , "SEGMENT_END" , segmentend ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SEGMENT_END" ); - goto ERREUR; - } - - /* Fermeture de l'element Frame_Counters */ - - cr = cai_WriteCloseTagXML ( des , "Frame_Counters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Frame_Counters" ); - goto ERREUR; - } - - /* sous element Data_Strip_Coordinates */ - - cr = cai_WriteOpenTagXML ( des , "Data_Strip_Coordinates" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Data_Strip_Coordinates" ); - goto ERREUR; - } - - /* sous element FIRST_PIXEL_RAW */ - - cr = cai_WriteElementXML ( des , "FIRST_PIXEL_RAW" , fpixraw ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FIRST_PIXEL_RAW" ); - goto ERREUR; - } - - /* sous element FIRST_LINE_RAW */ - - cr = cai_WriteElementXML ( des , "FIRST_LINE_RAW" , flineraw ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FIRST_LINE_RAW" ); - goto ERREUR; - } - - /* sous element FIRST_PIXEL_1B */ - - cr = cai_WriteElementXML ( des , "FIRST_PIXEL_1B" , fpix1b ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FIRST_PIXEL_1B" ); - goto ERREUR; - } - - /* sous element FIRST_LINE_1B */ - - cr = cai_WriteElementXML ( des , "FIRST_LINE_1B" , fline1b ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FIRST_LINE_1B" ); - goto ERREUR; - } - - /* Fermeture de l'element Data_Strip_Coordinates */ - - cr = cai_WriteCloseTagXML ( des , "Data_Strip_Coordinates" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Data_Strip_Coordinates" ); - goto ERREUR; - } - - /* sous element Models */ - - cr = cai_WriteOpenTagXML ( des , "Models" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Models" ); - goto ERREUR; - } - - /* sous element OneB_Model */ - - cr = cai_WriteOpenTagXML ( des , "OneB_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element OneB_Model" ); - goto ERREUR; - } - - /* sous element Coordinate_Normalization */ - - cr = cai_WriteOpenTagXML ( des , "Coordinate_Normalization" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Coordinate_Normalization" ); - goto ERREUR; - } - - /* sous element LINES_I_M */ - - cr = cai_WriteElementXML ( des , "LINES_I_M" , im ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element LINES_I_M" ); - goto ERREUR; - } - - /* sous element LINES_DELTA_I */ - - cr = cai_WriteElementXML ( des , "LINES_DELTA_I" , deltai ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element LINES_DELTA_I" ); - goto ERREUR; - } - - /* sous element COLUMNS_J_M */ - - cr = cai_WriteElementXML ( des , "COLUMNS_J_M" , jm ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element COLUMNS_J_M" ); - goto ERREUR; - } - - /* sous element COLUMNS_DELTA_J */ - - cr = cai_WriteElementXML ( des , "COLUMNS_DELTA_J" , deltaj ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element COLUMNS_DELTA_J" ); - goto ERREUR; - } - - /* sous element LINES_L_M */ - - cr = cai_WriteElementXML ( des , "LINES_L_M" , lm ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element LINES_L_M" ); - goto ERREUR; - } - - /* sous element LINES_DELTA_L */ - - cr = cai_WriteElementXML ( des , "LINES_DELTA_L" , deltal ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element LINES_DELTA_L" ); - goto ERREUR; - } - - /* sous element COLUMNS_P_M */ - - cr = cai_WriteElementXML ( des , "COLUMNS_P_M" , pm ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element COLUMNS_P_M" ); - goto ERREUR; - } - - /* sous element COLUMNS_DELTA_P */ - - cr = cai_WriteElementXML ( des , "COLUMNS_DELTA_P" , deltap ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element COLUMNS_DELTA_P" ); - goto ERREUR; - } - - /* Fermeture de l'element Coordinate_Normalization */ - - cr = cai_WriteCloseTagXML ( des , "Coordinate_Normalization" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Coordinate_Normalization" ); - goto ERREUR; - } - - /* sous element Direct_OneB_Model */ - - cr = cai_WriteOpenTagXML ( des , "Direct_OneB_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Direct_OneB_Model" ); - goto ERREUR; - } - - /* sous element I */ - - cr = cai_WriteOpenTagXML ( des , "I" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element I" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , coeffi ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , ai ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , bi ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , ci ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , di ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , ei ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* Fermeture de l'element I */ - - cr = cai_WriteCloseTagXML ( des , "I" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element I" ); - goto ERREUR; - } - - /* sous element J */ - - cr = cai_WriteOpenTagXML ( des , "J" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element J" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , coeffj ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , aj ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , bj ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , cj ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* Fermeture de l'element J */ - - cr = cai_WriteCloseTagXML ( des , "J" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element J" ); - goto ERREUR; - } - - /* Fermeture de l'element Direct_OneB_Model */ - - cr = cai_WriteCloseTagXML ( des , "Direct_OneB_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Direct_OneB_Model" ); - goto ERREUR; - } - - /* sous element Reverse_OneB_Model */ - - cr = cai_WriteOpenTagXML ( des , "Reverse_OneB_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Reverse_OneB_Model" ); - goto ERREUR; - } - - /* sous element L */ - - cr = cai_WriteOpenTagXML ( des , "L" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element L" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , coeff_l ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , a_l ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , b_l ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , c_l ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , d_l ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , e_l ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* Fermeture de l'element L */ - - cr = cai_WriteCloseTagXML ( des , "L" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element L" ); - goto ERREUR; - } - - /* sous element P */ - - cr = cai_WriteOpenTagXML ( des , "P" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element P" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , coeff_p ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , a_p ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , b_p ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , c_p ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* Fermeture de l'element P */ - - cr = cai_WriteCloseTagXML ( des , "P" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element P" ); - goto ERREUR; - } - - /* Fermeture de l'element Reverse_OneB_Model */ - - cr = cai_WriteCloseTagXML ( des , "Reverse_OneB_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Reverse_OneB_Model" ); - goto ERREUR; - } - - /* sous element A */ - - cr = cai_WriteOpenTagXML ( des , "A" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element A" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , coeff_a ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , aa ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , ba ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , ca ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , da ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* Fermeture de l'element A */ - - cr = cai_WriteCloseTagXML ( des , "A" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element A" ); - goto ERREUR; - } - - /* sous element B */ - - cr = cai_WriteOpenTagXML ( des , "B" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element B" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , coeff_b ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , ab ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , bb ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , cb ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , db ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , eb ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element c" ); - goto ERREUR; - } - - /* Fermeture de l'element B */ - - cr = cai_WriteCloseTagXML ( des , "B" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element B" ); - goto ERREUR; - } - - /* Fermeture de l'element OneB_Model */ - - cr = cai_WriteCloseTagXML ( des , "OneB_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element OneB_Model" ); - goto ERREUR; - } - - /* sous element Attitude_Model */ - - cr = cai_WriteOpenTagXML ( des , "Attitude_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Attitude_Model" ); - goto ERREUR; - } - - /* sous element D_L */ - - cr = cai_WriteOpenTagXML ( des , "D_L" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element D_L" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , al ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , bl ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , cl ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element abc" ); - goto ERREUR; - } - - /* Fermeture de l'element D_L */ - - cr = cai_WriteCloseTagXML ( des , "D_L" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element D_L" ); - goto ERREUR; - } - - /* sous element D_P */ - - cr = cai_WriteOpenTagXML ( des , "D_P" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element D_P" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , ap ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , bp ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , cp ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element abc" ); - goto ERREUR; - } - - /* Fermeture de l'element D_P */ - - cr = cai_WriteCloseTagXML ( des , "D_P" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element D_P" ); - goto ERREUR; - } - - /* Fermeture de l'element Attitude_Model */ - - cr = cai_WriteCloseTagXML ( des , "Attitude_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Attitude_Model" ); - goto ERREUR; - } - - /* sous element SWIR_Registration_Model */ - - cr = cai_WriteOpenTagXML ( des , "SWIR_Registration_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SWIR_Registration_Model" ); - goto ERREUR; - } - - /* sous element D_L */ - - cr = cai_WriteOpenTagXML ( des , "D_L" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element D_L" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , alswir ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , blswir ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , clswir ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element abc" ); - goto ERREUR; - } - - /* Fermeture de l'element D_L */ - - cr = cai_WriteCloseTagXML ( des , "D_L" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element D_L" ); - goto ERREUR; - } - - /* sous element D_P */ - - cr = cai_WriteOpenTagXML ( des , "D_P" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element D_P" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , apswir ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , bpswir ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , cpswir ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element abc" ); - goto ERREUR; - } - - /* Fermeture de l'element D_P */ - - cr = cai_WriteCloseTagXML ( des , "D_P" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element D_P" ); - goto ERREUR; - } - - /* Fermeture de l'element SWIR_Registration_Model */ - - cr = cai_WriteCloseTagXML ( des , "SWIR_Registration_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SWIR_Registration_Model" ); - goto ERREUR; - } - - /* Fermeture de l'element Models */ - - cr = cai_WriteCloseTagXML ( des , "Models" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Models" ); - goto ERREUR; - } - /* sous element Sensor_Calibration */ - - cr = cai_WriteOpenTagXML ( des , "Sensor_Calibration" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Sensor_Calibration" ); - goto ERREUR; - } - - /* sous element METHOD */ - - cr = cai_WriteElementXML ( des , "METHOD" , "system" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element METHOD" ); - - goto ERREUR; - } - - /* sous element Calibration */ - - cr = cai_WriteOpenTagXML ( des , "Calibration" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Calibration" ); - goto ERREUR; - } - - for ( j = 0; j < nb_bs ; j++ ) - { - /* sous element Band_Parameters */ - - cr = cai_WriteOpenTagXML ( des , "Band_Parameters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Band_Parameters" ); - goto ERREUR; - } - - /* sous element BAND_INDEX */ - sprintf ( valeur , "%d" , (j+1) ); - - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BAND_INDEX" ); - goto ERREUR; - } - - /* sous element Gain_Section */ - - cr = cai_WriteOpenTagXML ( des , "Gain_Section" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Gain_Section" ); - goto ERREUR; - } - - /* sous element GAIN_NUMBER */ - - cr = cai_WriteElementXML ( des , "GAIN_NUMBER" , nb_gains[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element GAIN_NUMBER" ); - goto ERREUR; - } - - /* sous element GAIN_ANALOG_VALUE */ - - cr = cai_WriteElementXML ( des , "GAIN_ANALOG_VALUE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element GAIN_ANALOG_VALUE" ); - goto ERREUR; - } - - /* sous element Pixel_Parameters */ - - cr = cai_WriteOpenTagXML ( des , "Pixel_Parameters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Pixel_Parameters" ); - goto ERREUR; - } - - /* sous element G_DATE */ - - cr = cai_WriteElementXML ( des , "G_DATE" , relativedatecalib[2*j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element G_DATE" ); - goto ERREUR; - } - - /* sous element DC_DATE */ - - cr = cai_WriteElementXML ( des , "DC_DATE" , relativedatecalib[2*j+nb_bs*2] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DC_DATE" ); - goto ERREUR; - } - - /* sous element Cells */ - - cr = cai_WriteOpenTagXML ( des , "Cells" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Cells" ); - goto ERREUR; - } - - if ( nb_bs == 1 ) - { - for ( i = 0 ; i < 4 ; i ++ ) - { /* MOD : VERSION 4.6 : FA : initialisation de ind_tab_gain dans la boucle */ - for ( ind_tab_gain = 0 ; ind_tab_gain < 1500 ; ind_tab_gain ++ ) - { - - /* sous element Cell */ - - cr = cai_WriteOpenTagXML ( des , "Cell" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Cell" ); - goto ERREUR; - } - - /* sous element G */ - - sprintf ( valeur , "%5.4f" , gain_value[i][ind_tab_gain] ); - - cr = cai_WriteElementXML ( des , "G" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element G" ); - goto ERREUR; - } - - /* sous element DARK_CURRENT */ - - sprintf ( valeur , "%2.1f" , dark_value[i][ind_tab_gain] ); - - cr = cai_WriteElementXML ( des , "DARK_CURRENT" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DARK_CURRENT" ); - goto ERREUR; - } - - /* Fermeture de l'element Cell */ - - cr = cai_WriteCloseTagXML ( des , "Cell" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Cell" ); - goto ERREUR; - } - } - } - } - else - { - for ( i = 2*j ; i < 2*j+2 ; i++ ) - { - for ( ind_tab_gain = 0 ; ind_tab_gain < 1500 ; ind_tab_gain ++ ) - { - /* sous element Cell */ - - cr = cai_WriteOpenTagXML ( des , "Cell" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Cell" ); - goto ERREUR; - } - - /* sous element G */ - - sprintf ( valeur , "%5.4f" , gain_value[i][ind_tab_gain] ); - - cr = cai_WriteElementXML ( des , "G" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element G" ); - goto ERREUR; - } - - /* sous element DARK_CURRENT */ - - sprintf ( valeur , "%2.1f" , dark_value[i][ind_tab_gain] ); - - cr = cai_WriteElementXML ( des , "DARK_CURRENT" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DARK_CURRENT" ); - goto ERREUR; - } - - /* Fermeture de l'element Cell */ - - cr = cai_WriteCloseTagXML ( des , "Cell" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Cell" ); - goto ERREUR; - } - } - } - } - - /* Fermeture de l'element Cells */ - - cr = cai_WriteCloseTagXML ( des , "Cells" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Cells" ); - goto ERREUR; - } - - /* Fermeture de l'element Pixel_Parameters */ - - cr = cai_WriteCloseTagXML ( des , "Pixel_Parameters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Pixel_Parameters" ); - goto ERREUR; - } - - /* Fermeture de l'element Gain_Section */ - - cr = cai_WriteCloseTagXML ( des , "Gain_Section" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Gain_Section" ); - goto ERREUR; - } - - /* sous element Dead_Detectors */ - - cr = cai_WriteOpenTagXML ( des , "Dead_Detectors" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Dead_Detectors" ); - goto ERREUR; - } - - /* sous element VALIDITY_DATE */ - - cr = cai_WriteElementXML ( des , "VALIDITY_DATE" , - relativedatecalib[2*j+1] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element VALIDITY_DATE" ); - goto ERREUR; - } - - /* sous element Bad_Pixels */ - - cr = cai_WriteOpenTagXML ( des , "Bad_Pixels" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Pixels" ); - goto ERREUR; - } - - if ( nb_bs == 1 ) - { - for ( i = 0 ; i < 4 ; i ++ ) - { - for ( ind_tab_gain = 0; ind_tab_gain < 1500 ; ind_tab_gain ++ ) - { - if ( gain_value[i][ind_tab_gain] == (float) 0 ) - { - /* sous element Bad_Pixel */ - - cr = cai_WriteOpenTagXML ( des , "Bad_Pixel" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Pixel" ); - goto ERREUR; - } - - /* sous element PIXEL_INDEX */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA : Correction de */ -/* sprintf(valeur,"%d", (ind_tab_gain+1+1500*i)) au lieu de */ -/* sprintf(valeur,"%f", (ind_tab_gain+1+1500*i)) */ -/*****************************************************************************/ - - sprintf ( valeur , "%d" , (ind_tab_gain+1+1500*i) ); - cr = cai_WriteElementXML ( des , "PIXEL_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PIXEL_INDEX" ); - goto ERREUR; - } - - /* sous element BAD_PIXEL_STATUS */ - - cr = cai_WriteElementXML ( des , - "BAD_PIXEL_STATUS" , "ABERRANT" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BAD_PIXEL_STATUS" ); - goto ERREUR; - } - - /* Fermeture de l'element Bad_Pixel */ - - cr = cai_WriteCloseTagXML ( des , "Bad_Pixel" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Pixel" ); - goto ERREUR; - } - } - } - } - } - else - { - nb_passage = 0; - for ( i = 2*j ; i < j*2 + 2 ; i++ ) - { - for ( ind_tab_gain = 0 ; ind_tab_gain < 1500 ; ind_tab_gain ++ ) - { - if ( gain_value[i][ind_tab_gain] == (float) 0 ) - { - /* sous element Bad_Pixel */ - - cr = cai_WriteOpenTagXML ( des , "Bad_Pixel" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Pixel" ); - goto ERREUR; - } - - /* sous element PIXEL_INDEX */ - - sprintf ( valeur , "%d" , ( ind_tab_gain+1+1500*nb_passage ) ); - cr = cai_WriteElementXML ( des , "PIXEL_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element PIXEL_INDEX" ); - goto ERREUR; - } - - /* sous element BAD_PIXEL_STATUS */ - - cr = cai_WriteElementXML ( des , - "BAD_PIXEL_STATUS" , "ABERRANT" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BAD_PIXEL_STATUS" ); - goto ERREUR; - } - - /* Fermeture de l'element Bad_Pixel */ - - cr = cai_WriteCloseTagXML ( des , "Bad_Pixel" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Pixel" ); - goto ERREUR; - } - } - } - if ( nb_passage == 0 ) - nb_passage = 1; - else - nb_passage = 0; - - } - } - - /* Fermeture de l'element Bad_Pixels */ - - cr = cai_WriteCloseTagXML ( des , "Bad_Pixels" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Pixels" ); - goto ERREUR; - } - - /* Fermeture de l'element Dead_Detectors */ - - cr = cai_WriteCloseTagXML ( des , "Dead_Detectors" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Dead_Detectors" ); - goto ERREUR; - } - - /* Fermeture de l'element Band_Parameters */ - - cr = cai_WriteCloseTagXML ( des , "Band_Parameters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Band_Parameters" ); - goto ERREUR; - } - } - /* Fermeture de l'element Calibration */ - - cr = cai_WriteCloseTagXML ( des , "Calibration" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Calibration" ); - goto ERREUR; - } - - /* sous element Spectral_Sensitivities */ - - cr = cai_WriteOpenTagXML ( des , "Spectral_Sensitivities" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Spectral_Sensitivities" ); - goto ERREUR; - } - - - for ( j = 0; j < nb_bs ; j++ ) - { - - /* sous element Band_Spectral_Sensitivities */ - - cr = cai_WriteOpenTagXML ( des , "Band_Spectral_Sensitivities" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Band_Spectral_Sensitivities" ); - goto ERREUR; - } - - sprintf( valeur , "%d" , ( j+1 ) ); - /* sous element BAND_INDEX */ - - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BAND_INDEX" ); - goto ERREUR; - } - - /* sous element FIRST_WAVELENGTH_VALUE */ - - cr = cai_WriteElementXML ( des , - "FIRST_WAVELENGTH_VALUE" , firstwave[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element FIRST_WAVELENGTH_VALUE" ); - goto ERREUR; - } - - /* sous element WAVELENGTH_STEP */ - - cr = cai_WriteElementXML ( des , - "WAVELENGTH_STEP" , wavelengthstep[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element WAVELENGTH_STEP" ); - goto ERREUR; - } - - /* sous element CALIBRATION_DATE */ - - cr = cai_WriteElementXML ( des , "CALIBRATION_DATE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element CALIBRATION_DATE" ); - goto ERREUR; - } - - /* sous element Spectral_Sensitivity_Values */ - - cr = cai_WriteOpenTagXML ( des , "Spectral_Sensitivity_Values" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Spectral_Sensitivity_Values" ); - goto ERREUR; - } - - for ( ind_tab_gain = 0 ; ind_tab_gain < 64 ; ind_tab_gain++ ) - { - - /* sous element SPECTRAL_SENSITIVITY_VALUE */ - - cr = cai_WriteElementXML ( des , "SPECTRAL_SENSITIVITY_VALUE" , - spectral_sensitivitie[j][ind_tab_gain] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SPECTRAL_SENSITIVITY_VALUE" ); - goto ERREUR; - } - } - - /* Fermeture de l'element Spectral_Sensitivity_Values */ - - cr = cai_WriteCloseTagXML ( des , "Spectral_Sensitivity_Values" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Spectral_Sensitivity_Values" ); - goto ERREUR; - } - - /* Fermeture de l'element Band_Spectral_Sensitivities */ - - cr = cai_WriteCloseTagXML ( des , "Band_Spectral_Sensitivities" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Band_Spectral_Sensitivities" ); - goto ERREUR; - } - } - - /* Fermeture de l'element Spectral_Sensitivities */ - - cr = cai_WriteCloseTagXML ( des , "Spectral_Sensitivities" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Spectral_Sensitivities" ); - goto ERREUR; - } - - /* sous element Solar_Irradiance */ - - cr = cai_WriteOpenTagXML ( des , "Solar_Irradiance" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Solar_Irradiance" ); - goto ERREUR; - } - - for ( j = 0; j < nb_bs ; j++ ) - { - sprintf ( valeur , "%d" , ( j+1 ) ); - /* sous element Band_Solar_Irradiance */ - - cr = cai_WriteOpenTagXML ( des , "Band_Solar_Irradiance" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Band_Solar_Irradiance" ); - goto ERREUR; - } - - /* sous element BAND_INDEX */ - - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BAND_INDEX" ); - goto ERREUR; - } - - /* sous element SOLAR_IRRADIANCE_VALUE */ - - cr = cai_WriteElementXML ( des , "SOLAR_IRRADIANCE_VALUE" , - solar_irradiance[j] ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element SOLAR_IRRADIANCE_VALUE" ); - goto ERREUR; - } - - /* Fermeture de l'element Band_Solar_Irradiance */ - - cr = cai_WriteCloseTagXML ( des , "Band_Solar_Irradiance" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Band_Solar_Irradiance" ); - goto ERREUR; - } - } - /* Fermeture de l'element Solar_Irradiance */ - - cr = cai_WriteCloseTagXML ( des , "Solar_Irradiance" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Solar_Irradiance" ); - goto ERREUR; - } - - /* Fermeture de l'element Sensor_Calibration */ - - cr = cai_WriteCloseTagXML ( des , "Sensor_Calibration" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Sensor_Calibration" ); - goto ERREUR; - } - -/* MOD : VERSION : 4.6 : FA : pas d'écriture <badlines> si pas de badlines */ -/* le test s'effectue pour chaque canal */ - Bad=0; - for (can=0;can<nb_bs;can++) - BadFlag[can]=0; - can=0; - j=0; - while ((can<nb_bs)&&(BadFlag[can]==0)) - { - j=0; - while ((j<nb_lig)&&(BadFlag[can]==0)) - { - if ( bad_line[j][can] != 0) - { - BadFlag[can]=1; - Bad=1; - } - j=j+1; - } - can=can+1; - } - - if (Bad==1) - { - - /* sous element Bad_Lines */ - - cr = cai_WriteOpenTagXML ( des , "Bad_Lines" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Lines" ); - goto ERREUR; - } - } - - for ( can = 0 ; can < nb_bs ; can++ ) - { - if (BadFlag[can]==1) - { - - sprintf ( valeur , "%d" , (can+1) ); - - /* sous element Band_Bad_Lines */ - - cr = cai_WriteOpenTagXML ( des , "Band_Bad_Lines" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Band_Bad_Lines" ); - goto ERREUR; - } - - /* sous element BAND_INDEX */ - - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BAND_INDEX" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element Bad_Line_List */ -/*****************************************************************************/ - - /* sous element Bad_Line_List */ - - cr = cai_WriteOpenTagXML ( des , "Bad_Line_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Line_List" ); - goto ERREUR; - } - - for ( j = 0; j < nb_lig ; j++ ) - { - if ( bad_line[j][can] == 1 ) - { - /* sous element Bad_Line */ - - cr = cai_WriteOpenTagXML ( des , "Bad_Line" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Line" ); - goto ERREUR; - } - - /* sous element BL_INDEX */ - - sprintf ( valeur , "%d" , ( j+1 ) ); - - cr = cai_WriteElementXML ( des , "BL_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BL_INDEX" ); - goto ERREUR; - } - - /* sous element BL_STATUS */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : FA : mot cle lignes perdues LOST au lieu de LOSS */ -/*****************************************************************************/ - cr = cai_WriteElementXML ( des , "BL_STATUS" , "LOST" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BL_STATUS" ); - goto ERREUR; - } - - /* Fermeture de l'element Bad_Line */ - - cr = cai_WriteCloseTagXML ( des , "Bad_Line" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Line" ); - goto ERREUR; - } - } - else - { - if ( bad_line[j][can] == 2 ) - { - /* sous element Bad_Line */ - - cr = cai_WriteOpenTagXML ( des , "Bad_Line" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Line" ); - goto ERREUR; - } - - /* sous element BL_INDEX */ - - sprintf ( valeur , "%d" , ( j+1 ) ); - - cr = cai_WriteElementXML ( des , "BL_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BL_INDEX" ); - goto ERREUR; - } - - /* sous element BL_STATUS */ - - cr = cai_WriteElementXML ( des , "BL_STATUS" , "DEGRADED" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element BL_STATUS" ); - goto ERREUR; - } - - /* Fermeture de l'element Bad_Line */ - - cr = cai_WriteCloseTagXML ( des , "Bad_Line" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Line" ); - goto ERREUR; - } - } - } - } /* Fin boucle sur les lignes */ - - /* Fermeture de l'element Bad_Line_List */ - - cr = cai_WriteCloseTagXML ( des , "Bad_Line_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Line_List" ); - goto ERREUR; - } - - /* Fermeture de l'element Band_Bad_Lines */ - - cr = cai_WriteCloseTagXML ( des , "Band_Bad_Lines" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Band_Bad_Lines" ); - goto ERREUR; - } - - } - } - if (Bad==1) - { - - /* Fermeture de l'element Bad_Lines */ - - cr = cai_WriteCloseTagXML ( des , "Bad_Lines" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Bad_Lines" ); - goto ERREUR; - } - - } - /* Fermeture de l'element Data_Strip */ - - cr = cai_WriteCloseTagXML ( des , "Data_Strip" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Data_Strip" ); - goto ERREUR; - } - - /* Fermeture de l'element Dimap_Document */ - - cr = cai_WriteCloseTagXML ( des , "Dimap_Document" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Dimap_Document" ); - goto ERREUR; - } - - /* fermeture du fichier descripteur */ - - if (des!=NULL) fclose ( des ); - return CAI_OK; - - ERREUR: - return CAI_KO; - } -/* - Fin de l'operation cai_lead4to5spot -*/ - -/******************************************************************************/ -/******************************************************************************/ -/* */ -/* Definition des OPERATIONS INTERNES */ -/* */ -/******************************************************************************/ -/******************************************************************************/ - -/******************************************************************************/ -/* */ -/*OPERATION : cai_ElementWriteXML */ -/* */ -/*ROLE : Cette operation ecrit un element XML dans le fichier donne en */ -/* parametre */ -/* */ -/*CONTEXTE D'APPEL : */ -/* */ -/* RETOUR : CAI_OK ou CAI_KO */ -/* */ -/******************************************************************************/ - -static CAI_OK_KO cai_WriteElementXML ( FILE *desc , char *motCle , char *valeur ) - { - char *BaliseXmlOpen; - char *BaliseXmlClose; - - BaliseXmlOpen = (char*) NULL; - BaliseXmlOpen = (char*) calloc ( strlen ( motCle ) + 3 , sizeof ( char ) ); - - BaliseXmlClose = (char*) NULL; - BaliseXmlClose = (char*) calloc ( strlen ( motCle ) + 4 , sizeof ( char ) ); - - sprintf ( BaliseXmlOpen , "<%s>" , motCle ); - sprintf ( BaliseXmlClose , "</%s>" , motCle ); - - fprintf ( desc , "%s%s%s\n" , BaliseXmlOpen , valeur , BaliseXmlClose ); - - FREE ( BaliseXmlClose ); - FREE ( BaliseXmlOpen ); - return CAI_OK; - - } -/* - Fin de l'operation cai_WriteElementXML -*/ -/******************************************************************************/ -/* */ -/*OPERATION : cai_ElementWriteXMLWithAttribute */ -/* */ -/*ROLE : Cette operation ecrit un element XML dans le fichier donne en */ -/* parametre */ -/* */ -/*CONTEXTE D'APPEL : */ -/* */ -/* RETOUR : CAI_OK ou CAI_KO */ -/* */ -/******************************************************************************/ - -static CAI_OK_KO cai_WriteElementXMLWithAttribute ( FILE *desc , - char *motCle , - char *valeur, - char *attribut, - char *valat , - int type) - { - char *BaliseXmlOpen; - char *BaliseXmlClose; - - BaliseXmlOpen = (char*) NULL; - BaliseXmlOpen = (char*) calloc ( strlen ( motCle ) + - strlen ( attribut ) + - strlen ( valat ) + 10 , sizeof ( char ) ); - - BaliseXmlClose = (char*) NULL; - BaliseXmlClose = (char*) calloc ( strlen ( motCle ) + 4 , sizeof ( char ) ); - if (type==0) - sprintf ( BaliseXmlOpen , "<%s %s='%s'>" , motCle , attribut , valat ); - else - sprintf ( BaliseXmlOpen , "<%s %s=\"%s\">" , motCle , attribut , valat ); - sprintf ( BaliseXmlClose , "</%s>" , motCle ); - - fprintf ( desc , "%s%s%s\n" , BaliseXmlOpen , valeur , BaliseXmlClose ); - - FREE ( BaliseXmlClose ); - FREE ( BaliseXmlOpen ); - return CAI_OK; - - } - -/******************************************************************************/ -/* */ -/*OPERATION : cai_WriteOpenTagXML */ -/* */ -/*ROLE : Cette operation ecrit une balise ouvrante XML dans le fichier donne */ -/* en parametre */ -/* */ -/*CONTEXTE D'APPEL : */ -/* */ -/* RETOUR : CAI_OK ou CAI_KO */ -/* */ -/******************************************************************************/ - -static CAI_OK_KO cai_WriteOpenTagXML ( FILE *des , char *TagName ) - { - fprintf ( des , "<%s>\n" , TagName ); - return CAI_OK; - } -/* - Fin de l'operation cai_WriteOpenTagXML -*/ - -/******************************************************************************/ -/* */ -/*OPERATION : cai_WriteCloseTagXML */ -/* */ -/*ROLE : Cette operation ecrit une balise fermante XML dans le fichier donne */ -/* en parametre */ -/* */ -/*CONTEXTE D'APPEL : */ -/* */ -/* RETOUR : CAI_OK ou CAI_KO */ -/* */ -/******************************************************************************/ - -static CAI_OK_KO cai_WriteCloseTagXML ( FILE *des , char *TagName ) - { - fprintf ( des , "</%s>\n" , TagName ); - return CAI_OK; - } -/* - Fin de l'operation cai_WriteCloseTagXML -*/ - -/******************************************************************************/ -/* */ -/*OPERATION : cai_WriteNulTagXML */ -/* */ -/*ROLE : Cette operation ecrit une balise vide XML dans le fichier donne */ -/* en parametre */ -/* */ -/*CONTEXTE D'APPEL : */ -/* */ -/* RETOUR : CAI_OK ou CAI_KO */ -/* */ -/******************************************************************************/ - -static CAI_OK_KO cai_WriteNulTagXML ( FILE *des , char *TagName ) - { - fprintf ( des , "<%s/>\n" , TagName ); - return CAI_OK; - } -/* - Fin de l'operation cai_WriteNulTagXML -*/ - -/******************************************************************************/ -/* */ -/*OPERATION : cai_WriteEnteteXML */ -/* */ -/*ROLE : Cette operation ecrit l'entete d'un document XML */ -/* */ -/*CONTEXTE D'APPEL : */ -/* */ -/* RETOUR : CAI_OK ou CAI_KO */ -/* */ -/******************************************************************************/ - -static CAI_OK_KO cai_WriteEnteteXML ( FILE *des ) - { - fprintf ( des , "<?xml version='1.0'?>\n" ); - return CAI_OK; } -/* - Fin de l'operation cai_WriteEnteteXML -*/ - -/******************************************************************************/ -/* */ -/*OPERATION : cai_DMS_To_Float */ -/* */ -/*ROLE : Cette operation convertie une latitude/longitude exprimee en DDDMMSS */ -/* sous forme de chaine de caracteres en Flotants */ -/* */ -/*CONTEXTE D'APPEL : */ -/* */ -/* RETOUR : la donnee exprimee en double */ -/* */ -/******************************************************************************/ - -static void cai_DMS_To_Float ( char DegMinSec [17] , double *Degre ) - { - /*-------------------------------*/ - /* debut du code de l'operation */ - /*-------------------------------*/ - int i; - int signe = 1; - long int ValD = 0 , ValM = 0; - double ValS = 0.0; - char ValDeg[4] = ""; - char ValMin[3] = ""; - char ValSec[6] = ""; - - if (strlen(DegMinSec) != 0) - { - /* Traitement du signe */ - - if ( (DegMinSec[0] == 'N') || (DegMinSec[0] == 'E') ) - signe = 1; - - if ( (DegMinSec[0] == 'S') || (DegMinSec[0] == 'W') ) - signe = -1; - - if ( (DegMinSec[0] == 'R') || ( DegMinSec[0] == '+') ) - signe = 1; - - if ( (DegMinSec[0] == 'L') || ( DegMinSec[0] == '-') ) - signe = -1; - - /* Traitement de la valeur absolue */ - - for ( i = 0 ; i < 3 ; i++ ) - ValDeg[i] = DegMinSec[i+1]; - - ValDeg[3] = '\0'; - sscanf( ValDeg , "%ld" , &ValD ); - - for ( i = 0 ; i < 2 ; i++ ) - ValMin[i] = DegMinSec[i+4]; - - ValMin[2] = '\0'; - sscanf( ValMin , "%ld" , &ValM ); - - for ( i = 0 ; i < 5 ; i++ ) - ValSec[i] = DegMinSec[i+6]; - - ValSec[5] = '\0'; - sscanf( ValSec , "%lf" , &ValS ); - - *Degre = (double)signe*((double)ValD + - (double)ValM/60.0 + (double)ValS/3600.0); - } - else - *Degre = 0.0; - - /*-----------------------------------------------*/ - /* fin du code de l'operation cai_DMS_To_Float */ - /*-----------------------------------------------*/ - } - -/******************************************************************************/ -/* */ -/*OPERATION : cai_JulToGreg */ -/* */ -/*ROLE : Convertir une date julienne en date gregorienne */ -/*ROLE : */ -/* */ -/*RETOUR : */ -/* */ -/******************************************************************************/ - -int nb_jours_mois[12] = { 31 , 28 , 31 , 30 , 31 , 30 , 31 , 31 , 30 , 31 , 30 , 31 }; - -static void cai_JulToGreg ( long nbjours , double nbsec , char* dategreg ) - { - /*-----------------------------------*/ - /* Declaration des variables locales */ - /*-----------------------------------*/ - int an = ANNEE_DEBUT_JULIEN ; /* annee debut = 1950 */ - int nb_jour_an = NB_JOURS_AN_NON_BISSEX ; /* 1950 = annee non bissextile */ - int mois, jour, heure, minute, seconde, centieme ; - long jourjulien = 0 ; - double secjulien = 0. ; - - /*---------------------------------------*/ - /* DEBUT DE L'OPERATION cai_JulToGreg */ - /*---------------------------------------*/ - jourjulien = nbjours ; - secjulien = nbsec ; - - /*---------------------------------------*/ - /* Calculer l'annee gregorienne */ - /*---------------------------------------*/ - while ( jourjulien >= (long)nb_jour_an ) - { - an = an + 1; - jourjulien = jourjulien - (long)nb_jour_an ; - - /*------------------------------------------------*/ - /* si anne bissextile mettre a jour le nb_jour_an */ - /*------------------------------------------------*/ - if ( ( ((an%4) == 0) && ((an%100) != 0) ) || (an%400 == 0) ) - nb_jour_an = NB_JOURS_AN_BISSEX ; - else - nb_jour_an = NB_JOURS_AN_NON_BISSEX ; - } - - /*---------------------------------------*/ - /* Attention : si l'annee est bissextile */ - /* il faut modifier le mois de fevrier ! */ - /*---------------------------------------*/ - if ( nb_jour_an == NB_JOURS_AN_BISSEX ) - nb_jours_mois[1] = 29 ; - - /*---------------------------------------*/ - /* Calculer le mois */ - /*---------------------------------------*/ - mois = 0 ; - while ( jourjulien >= (long)nb_jours_mois[mois] ) - { - jourjulien = jourjulien - (long)nb_jours_mois[mois] ; - mois++; - } - - /*---------------------------------------*/ - /* Calculer le jour */ - /*---------------------------------------*/ - -/* MOD : VERSION : 4.5 : FA : erreur conversion jour julien dans CAI */ - jour = (int)jourjulien +1; - - /*---------------------------------------*/ - /* Calculer l'heure */ - /*---------------------------------------*/ - heure = (int) ( secjulien / 3600 ) ; - secjulien = secjulien - ( heure * 3600 ) ; - - /*---------------------------------------*/ - /* Calculer les minutes */ - /*---------------------------------------*/ - minute = (int) ( secjulien / 60 ) ; - secjulien = secjulien - ( minute * 60 ) ; - - /*---------------------------------------*/ - /* Calculer les secondes */ - /*---------------------------------------*/ - seconde = (int)secjulien ; - secjulien = secjulien - seconde ; - - /*---------------------------------------*/ - /* Calculer les centiemes */ - /*---------------------------------------*/ - centieme = (int) ( secjulien * 1000000.0 + 0.5 ) ; - - /*---------------------------------------*/ - /* Ecrire le resultat */ - /*---------------------------------------*/ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ds les dates, utilisation du . au lieu de , */ -/* Separation de la date et heure par "T" */ -/*****************************************************************************/ - sprintf ( dategreg , "%.4d-%.2d-%.2dT%.2d:%.2d:%.2d.%.6d\0" , an , (mois +1) , - jour , heure , minute , seconde , centieme ); - - } -/* Fin de l'operation cai_JulToGreg */ - - - -/*------------------------------------------*/ -/* Debut de l'operation cai_DegreeToRadian */ - -static double cai_DegreeToRadian ( double angle_degree ) - { - return ( (angle_degree * (double )PI) / 180.0); - } -/* Fin de l'operation cai_DegreeToRadian */ - - - -/*-----------------------------------*/ -/* Debut de l'operation cai_addtime */ - -static int cai_addtime ( char ret[26] , char temps[18] , double milisec ) -{ -double sec; -long lesjours=0; -char retour[25]=""; -char variable[18]=""; -strcpy ( variable , temps ); - -sec = atof ( &variable[5] ) + milisec; -if ( sec < 0 ) - { - sec = -sec; - lesjours--; - } - -variable[5] = '\0'; -sscanf ( variable , "%ld" , &lesjours ); - -while ( sec >= NB_SEC_PAR_JOUR ) - { - lesjours++; - sec = sec - NB_SEC_PAR_JOUR ; - } - -cai_JulToGreg ( lesjours , sec , retour ); -strcpy ( ret , retour ); - -return CAI_OK; -} - -/* Fin de l'operation cai_addtime */ - -/****************************************************************/ -/* Fonction permettant de retourner le nom d'un fichier a partir*/ -/* du nom du repertoire qui le contient et du debut de son nom */ -/* */ -/* PARAMETRES : */ -/* typspot (E) : type de spot (spot1a4, spot5 tif,spot5bil */ -/* str_repertoire (E) : chaine donnant le nom du repertoire */ -/* str_debut (E) : debut du nom du fichier */ -/* str_fichier (S) : nom complet du fichier */ -/* */ -/* VALEUR RETOURNEE : */ -/* 0 : ok */ -/* 1 : ko */ -/****************************************************************/ - -static int cai_recup_nom_spot (char typspot, char * str_repertoire , - char * str_debut , char **str_fichier ) -{ - - DIR *ptr_repertoire; - struct dirent *cr_readdir; - long lg_comp; - char str_comp[20]; - int fic_trouve; - int retour; - - - strcpy(CAI_ERREUR,""); - fic_trouve = 0; - retour = 0; - lg_comp = strlen(str_debut); - -/* -------------------------------------------------- - Ouverture du repertoire et listage des fichiers --------------------------------------------------- */ -/**************************************/ -/* Traitement suivant le type de spot */ -/**************************************/ - if (typspot=='1') -{ -/* Format SPOT1a4 */ - - ptr_repertoire = opendir(str_repertoire); - if (ptr_repertoire != NULL) - { - while ((cr_readdir=readdir(ptr_repertoire))!=NULL) - { - strncpy(str_comp,cr_readdir->d_name,lg_comp); - str_comp[lg_comp]='\0'; - if ((strcasecmp(str_comp,str_debut)==0) && (fic_trouve == 0) - && (retour == 0)) - { - *str_fichier = (char *) calloc(strlen(str_repertoire)+1+strlen(cr_readdir->d_name)+1, sizeof(char)); - if (*str_fichier != NULL) - { - strcpy(*str_fichier,str_repertoire); - strcat(*str_fichier,"/"); - strcat(*str_fichier,cr_readdir->d_name); - (*str_fichier)[strlen(str_repertoire)+1+strlen(cr_readdir->d_name)]='\0'; - fic_trouve++; - } - else - { - strcpy(CAI_ERREUR,"Erreur : Probleme d'allocation memoire"); - retour = 1; - } - } - } - closedir(ptr_repertoire); - - if (fic_trouve == 0) - { - sprintf(CAI_ERREUR,"Erreur : fichier %s/%s... n'existe pas", - str_repertoire,str_debut); - retour = 1; - } - } - } - else if (typspot=='B') -{ -/* Format SPOT5 BIL */ - - ptr_repertoire = opendir(str_repertoire); - if (ptr_repertoire != NULL) - { - while ((cr_readdir=readdir(ptr_repertoire))!=NULL) - { - strncpy(str_comp,cr_readdir->d_name,lg_comp); - str_comp[lg_comp]='\0'; - if ((strcasecmp(str_comp,str_debut)==0) && (fic_trouve == 0) - && (retour == 0)) - { - if (((strncasecmp(str_debut,"IM",2)== 0)&& - (((strstr(cr_readdir->d_name,".BIL")) != 0)|| - ((strstr(cr_readdir->d_name,".bil")) != 0)))|| - (strncasecmp(str_debut,"METADATA.DIM",12)== 0)) - { - *str_fichier = (char *) calloc(strlen(str_repertoire)+1+strlen(cr_readdir->d_name)+1, sizeof(char)); - if (*str_fichier != NULL) - { - strcpy(*str_fichier,str_repertoire); - strcat(*str_fichier,"/"); - strcat(*str_fichier,cr_readdir->d_name); - (*str_fichier)[strlen(str_repertoire)+1+strlen(cr_readdir->d_name)]='\0'; - fic_trouve++; - } - else - { - strcpy(CAI_ERREUR,"Erreur : Probleme d'allocation memoire"); - retour = 1; - } - } - } - } - closedir(ptr_repertoire); - - if (fic_trouve == 0) - { - sprintf(CAI_ERREUR,"Erreur : fichier %s/%s... n'existe pas", - str_repertoire,str_debut); - retour = 1; - } - } - -} -else if (typspot=='T') -{ -/* Format SPOT5 TIF */ - - ptr_repertoire = opendir(str_repertoire); - if (ptr_repertoire != NULL) - { - while ((cr_readdir=readdir(ptr_repertoire))!=NULL) - { - strncpy(str_comp,cr_readdir->d_name,lg_comp); - str_comp[lg_comp]='\0'; - if ((strcasecmp(str_comp,str_debut)==0) && (fic_trouve == 0) - && (retour == 0)) - { - if (((strncasecmp(str_debut,"IM",2)== 0)&& - (((strstr(cr_readdir->d_name,".TIF")) != 0)|| - ((strstr(cr_readdir->d_name,".tif")) != 0)))|| - (strncasecmp(str_debut,"METADATA.DIM",12)== 0)) - { - *str_fichier = (char *) calloc(strlen(str_repertoire)+1+strlen(cr_readdir->d_name)+1, sizeof(char)); - if (*str_fichier != NULL) - { - strcpy(*str_fichier,str_repertoire); - strcat(*str_fichier,"/"); - strcat(*str_fichier,cr_readdir->d_name); - (*str_fichier)[strlen(str_repertoire)+1+strlen(cr_readdir->d_name)]='\0'; - fic_trouve++; - } - else - { - strcpy(CAI_ERREUR,"Erreur : Probleme d'allocation memoire"); - retour = 1; - } - } - } - } - closedir(ptr_repertoire); - - if (fic_trouve == 0) - { - sprintf(CAI_ERREUR,"Erreur : fichier %s/%s... n'existe pas", - str_repertoire,str_debut); - retour = 1; - } - } - -} -else - retour=1; - return(retour); -} - -/* - Fin de l'operation cai_recup_nom_spot -*/ -/******************************************************************************/ -/* */ -/*OPERATION : cai_lire_dimensions_spot5 */ -/* */ -/*ROLE : Cette operation lit dans le leader XML de SPOT5 les caracteristiques */ -/* de l'image a lire */ -/* */ -/*CONTEXTE D'APPEL : */ -/* */ -/*RETOUR : CAI_OK si tout va bien , CAI_KO sinon */ -/* */ -/******************************************************************************/ - -static CAI_OK_KO cai_lire_dimensions_spot5 ( char *fich_xml , int *nbcan , - int *nboct , int *nbcol , - int *nblig , char *byteorder, - int *skipbytes ) -{ - /* variables locales */ - FILE *descripteur; /* descripteur du fichier XML */ - char *maval; /* variable servant a la lecture des mots */ - int trouve = 0; /* nombre de mot cles trouves */ - int ok_ncols = 0; /* indicateur de presence de NCOLS */ - int ok_nbits = 0; /* indicateur de presence de NBITS */ - int ok_nbands = 0; /* indicateur de presence de NBANDS */ - int ok_nrows = 0; /* indicateur de presence de NROWS */ - int ok_byteorder = 0; /* indicateur de presence de BYTEORDER */ - int ok_skipbytes = 0; /* indicateur de presence de SKIPBYTES */ - int nbits; /* nombre de bits par pixel */ - - - /* Initialisation par defaut */ - if (strcmp(type_machine,"BE")==0) - byteorder[0]='M'; - else - byteorder[0]='I'; - - /* ouvrir le fichier a lire */ - - if ( ( descripteur = fopen ( fich_xml , "rb" ) ) == NULL ) - { - sprintf ( CAI_ERREUR , "erreur ouverure de fichier" ); - goto ERREUR; - } - - /* tant que le fichier n'est pas a la fin */ - - while ( !feof ( descripteur ) ) - { - /* lire un mot */ - maval = cai_spot5_gettoken ( descripteur ); - if ( maval == NULL ) goto ERREUR; - - /* comparer le mot lu */ - - if ( strcasecmp ( maval , NOMBRE_DE_BITS ) == 0 ) - { - /* lire mot suivant */ - maval = cai_spot5_gettoken ( descripteur ); - if ( maval == NULL ) goto ERREUR; - - /* en deduire la valeur */ - sscanf ( maval , "%d" , &nbits ); - *nboct = nbits / 8 ; - - /* incrementer le nombre de champs trouves */ - trouve++; - - /* positionner le flag pour ce champs a 1 */ - ok_nbits = 1; - } - else - if ( strcasecmp ( maval , NOMBRE_DE_COLONNES ) == 0 ) - { - /* lire mot suivant */ - maval = cai_spot5_gettoken ( descripteur ); - if ( maval == NULL ) goto ERREUR; - - /* en deduire la valeur */ - sscanf ( maval , "%d" , nbcol ); - - /* incrementer le nombre de champs trouves */ - trouve++; - - /* positionner le flag pour ce champs a 1 */ - ok_ncols = 1; - } - else - if ( strcasecmp ( maval , NOMBRE_DE_CANAUX ) == 0 ) - { - /* lire mot suivant */ - maval = cai_spot5_gettoken ( descripteur ); - if ( maval == NULL ) goto ERREUR; - - /* en deduire la valeur */ - sscanf ( maval , "%d" , nbcan ); - - /* incrementer le nombre de champs trouves */ - trouve++; - - /* positionner le flag pour ce champs a 1 */ - ok_nbands = 1; - } - else - if ( strcasecmp ( maval , NOMBRE_DE_LIGNES ) == 0 ) - { - /* lire mot suivant */ - maval = cai_spot5_gettoken ( descripteur ); - if ( maval == NULL ) goto ERREUR; - - /* en deduire la valeur */ - sscanf ( maval , "%d" , nblig ); - - /* incrementer le nombre de champs trouves */ - trouve++; - - /* positionner le flag pour ce champs a 1 */ - ok_nrows = 1; - } - else - if ( strcasecmp ( maval , ORDRE_LECTURE_OCTETS ) == 0 ) - { - /* lire mot suivant */ - maval = cai_spot5_gettoken ( descripteur ); - if ( maval == NULL ) goto ERREUR; - - /* en deduire la valeur */ - sscanf ( maval , "%c" , byteorder ); - - /* incrementer le nombre de champs trouves */ - trouve++; - - /* positionner le flag pour ce champs a 1 */ - ok_byteorder = 1; - } - else - if ( strcasecmp ( maval , NB_OCTETS_A_SAUTER ) == 0 ) - { - /* lire mot suivant */ - maval = cai_spot5_gettoken ( descripteur ); - if ( maval == NULL ) goto ERREUR; - - /* en deduire la valeur */ - sscanf ( maval , "%d" , skipbytes ); - - /* incrementer le nombre de champs trouves */ - trouve++; - - /* positionner le flag pour ce champs a 1 */ - ok_skipbytes = 1; - } - - /* liber la ressource */ - FREE ( maval ); - - /* si les 6 mots a lire ont ete trouves , sortir de la boucle */ - if ( trouve == 6 ) - break; - } - - /* traiter les erreur dues au document */ - if ( trouve != 6 ) - { - if ( ok_ncols == 0 ) - { - sprintf ( CAI_ERREUR , "manque le tag %s dans le fichier DIMAP" , - NOMBRE_DE_COLONNES ); - goto ERREUR; - } - - if ( ok_nbits == 0 ) - { - sprintf ( CAI_ERREUR , "manque le tag %s dans le fichier DIMAP" , - NOMBRE_DE_BITS ); - goto ERREUR; - } - if ( ok_nrows == 0 ) - { - sprintf ( CAI_ERREUR , "manque le tag %s dans le fichier DIMAP" , - NOMBRE_DE_LIGNES ); - goto ERREUR; - } - - if ( ok_nbands == 0 ) - { - sprintf ( CAI_ERREUR , "manque le tag %s dans le fichier DIMAP" , - NOMBRE_DE_CANAUX ); - goto ERREUR; - } - - if ( ok_byteorder == 0 ) - { sprintf ( CAI_ERREUR , "manque le tag %s dans le fichier DIMAP" , - ORDRE_LECTURE_OCTETS ); - goto ERREUR; - } - -/* le skip byte n'est pas obligatoire */ - if ( ok_skipbytes == 0 ) - { - *skipbytes = 0; - } - } - - /* fermeture du fichier */ - if (descripteur !=NULL) fclose ( descripteur ); - - /* liberation des ressources */ - FREE ( maval ); - - return CAI_OK; - -ERREUR: - FREE ( maval ); - return CAI_KO; - } - - /* Fin de l'operation cai_lire_dimensions_spot5 */ - -/******************************************************************************/ -/* */ -/*OPERATION : cai_spot5_gettoken */ -/* */ -/*ROLE : Cette operation lit lit un mot dans le fichier donne en parametre */ -/* etretourne sa valeur en enlevent les eventuels caracteres < et > */ -/* */ -/*CONTEXTE D'APPEL : */ -/* */ -/*RETOUR : la valeur si tout va bien , CAI_KO sinon */ -/* */ -/******************************************************************************/ - -static char* cai_spot5_gettoken ( FILE *MyFile ) -{ - char valeur[1024] = ""; /* variable servant a stocker le mot lu */ - char *ret; /* variable retourne qui contiendra le mot lu */ - char c; /* caractere lu */ - int i = 0; /* indice de la chaine de caractere valeur */ - - /* lire le premier caractere */ - - if ( fscanf ( MyFile , "%c" , &c ) == 0 ) - { - sprintf ( CAI_ERREUR , "erreur lecture xml" ); - return (char*) NULL; - } - - /* tester si le caractere est <,>,retour chariot, espace */ - /* auquel cas, sauter les blancs < , > , tabulations, etc */ - /* et si on n'est pas en fin de fichier */ - - while ( ( ( ( c == '<' ) || ( c == ' ' ) ) || - ( ( c == '>' ) || ( c == '\n' ) ) || - ( ( c == '\r' ) || ( c == '\t' ) ) ) - && ( !feof ( MyFile ) ) ) - { - if ( fscanf ( MyFile , "%c" , &c ) == 0 ) - { - sprintf ( CAI_ERREUR , "erreur lecture xml" ); - return (char*) NULL; - } - } - - - /* tant que que le mot n'est pas fini, lire les caracteres */ - - while ( ( ( c != '>' ) && ( c != '<' ) ) && - ( ( c != ' ' ) && ( c != '\n' ) ) ) - { - valeur[i] = c; - if ( fscanf ( MyFile , "%c" , &c ) == 0 ) - { - sprintf ( CAI_ERREUR , "erreur lecture xml" ); - return (char*) NULL; - } - i++; - } - - /* terminer la chaine de caractere lue */ - - valeur[i+1] = '\0'; - - /* allouer la place pour la chaine qui contiendra le resultat */ - - ret = (char*) NULL; - ret = (char*) calloc ( strlen ( valeur ) + 1 , sizeof ( char ) ); - - /* copie du mot lu dans la variable resultat */ - - strcpy ( ret , valeur ); - - /* retour du resultat */ - - return ret; - } -/* fin de l'operation cai_spot5_gettoken */ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_spot1a4 */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format spot1a4 et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_spot1a4(repert, */ -/* ---------------- nom_image,nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* repert (E) (char *) : repertoire de stockage */ -/* nom_image (E) (char *) : nom de l'image a ouvrir */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_spot1a4 (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -static CAI_IMAGE *cai_ouvre_creation_spot1a4(char *repert, - char *nom_image, - int *nbca, - int *nboct_pix, - int *nbcol, - int *nblig, - char *label) -{ - CAI_IMAGE *image1; /* descripteur image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char nom_rep[1024]; /* nom du fichier en-tete */ - int i,j,num,k; /* indice */ - int cr; /* compte rendu d'operation */ - int retour; /* compte rendu d'operation */ - struct stat buf_stat; /* structure decrivant status de fichier */ - int descrip_leader; /* Descripteur du fichier LEADER */ - int descrip_trailer; /* Descripteur du fichier TRAILER */ - int descrip_volume; /* Descripteur du fichier VOLUME DIRECTORY */ - int descrip_null; /* Descripteur du fichier NULL VOLUME DIRECTORY */ - int descrip_imagery; /* Descripteur du fichier IMAGERY */ - long cr_write; /* Code retour de write */ - CAI_OK_KO icr; /* code retour ecriture dans DA */ - int nouv_indic; /* indice */ - char str_int4[5]; /* Chaines intermediaires */ - char str_int5[6]; /* Chaines intermediaires */ - char str_int1[2]; /* Chaines intermediaires */ - char mode[4]; /* Mode spectral */ - int lgrec; /* Longueur des enregistrements */ - int nbrec; /* Nombre d'enregistrements de l'image */ - int nb; /* taille de l'image */ - int Existe; /* Indicateur d'existence du repertoire image */ - - char Message[200]; - - /* Variables intermediaires */ - unsigned char BYTE[4]; - int VAR_LONG[2]; - - char TAB[13000]; - char LEVEL[1]; - char TAMP2[5][9]; - - int LgDate; - char StrDate[24]; - time_t LocalTime; - int nbre_enreg; - - -/*........................................ - INITIALISATIONS et allocation de place pour la structure CAI_IMAGE - .........................................*/ - - descrip_leader = -1; - descrip_trailer = -1; - descrip_volume = -1; - descrip_null = -1; - descrip_imagery = -1; - Existe = 0; - image1 = NULL; - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - - if (image1==NULL) - { - strcpy(CAI_ERREUR, - "Erreur allocation memoirem dans cai_ouvre_creation_spot1a4"); - goto ERREUR; - } - - if ((*nboct_pix) != 1 ) - { - strcpy(CAI_ERREUR, - "Seul un octet par pixel est autorise pour l'ecriture SPOT1a4"); - goto ERREUR; - } - - sprintf(image1->NIVEAU,"0 "); - -/******************************************************************/ -/* Constitution du nom du fichier LEADER et verification qu'il */ -/* n'existe pas deja */ -/******************************************************************/ - - nom_fic[0]='\0'; - if ((long)strlen(repert)!= 0) - { - sprintf(nom_rep,"%s/%s",repert,nom_image); - } - else - { - sprintf(nom_rep,"%s",nom_image); - } - - retour = stat ( nom_rep , &buf_stat ); - - /* si le repertoire image n'existe pas, le creer*/ - if ( retour != 0 ) - { - cr = mkdir (nom_rep,0775); - if (cr !=0) - { - sprintf ( CAI_ERREUR , - "probleme a la creation du repertoire image %s SPOT1A4 \n" , - nom_image ); - goto ERREUR; - } - } - else - Existe = 1; - - sprintf(nom_fic,"%s/LEAD_01.DAT",nom_rep); - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "Le fichier %s LEADER SPOT1A4 existe \n" , - nom_image ); - goto ERREUR; - } - - -/*---------------------------------------------------------------------------*/ -/* Ouverture du fichier LEADER en creation */ -/*---------------------------------------------------------------------------*/ - - descrip_leader = open (nom_fic,O_RDWR|O_CREAT|O_BINARY, PERMS ); - if (descrip_leader == -1) - { - strcpy ( CAI_ERREUR , "Erreur de creation du fichier Leader SPOT1A4"); - goto ERREUR; - } - -/*---------------------------------------------------------------------------*/ -/* ECRITURE DU FICHIER LEADER */ -/*---------------------------------------------------------------------------*/ - - -/***********************************/ -/* Pour le fichier FILE DESCRIPTOR */ -/***********************************/ - -/* 1 RECORD */ - -/* SEGMENT FIXE : */ - - VAR_LONG[0] = 1; - BYTE[0] = 63; - BYTE[1] = 192; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 3960; - - cr_write = write ( descrip_leader , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , &BYTE[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader SPOT1A4"); - goto ERREUR; - } - - - cr_write = write ( descrip_leader , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - strcpy( TAB , "A S4-ST-73-1CN 0 0 1"); - cr_write = write ( descrip_leader , TAB , 36); - if (cr_write != 36) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - if (*nbca == 1) - { - strcpy(mode,"PAN"); - strcpy(TAB,"SP0 P0 LEADBIL "); - } - else - { - if (*nbca == 3) - { - strcpy(mode,"XS "); - strcpy(TAB,"SP0 X0 LEADBIL "); - } - else - { - if (*nbca == 4) - { - strcpy(mode,"XI "); - strcpy(TAB,"SP0 I0 LEADBIL "); - } - } - } - - cr_write = write ( descrip_leader, TAB , 16); - if (cr_write != 16) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - - strcpy( TAB , "FSEQ 1 4FTYP 5 4FLGT 9 4YNNN"); - cr_write = write ( descrip_leader , TAB , 52); - if (cr_write != 52) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - - for (i=0;i<13000;i++) - { - strcpy ( &TAB[i]," "); - } - - cr_write = write ( descrip_leader , TAB , 64); - if (cr_write != 64) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - -/* SEGMENT VARIABLE : */ - - strcpy( TAB , " 1 3960 24 3960 1 3960 2 37 16A 2 21 16A"); - cr_write = write ( descrip_leader , TAB , 68); - if (cr_write != 68) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - - for (i=0;i<81;i++) - { - strcpy ( &TAB[i]," "); - } - - strcpy( TAB , " 2 613 16A 2 629 16A 2 581 32A 2 85 32A 2 1317 64A"); - cr_write = write ( descrip_leader , TAB , 80); - if (cr_write != 80) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - for (i=0;i<50;i++) - { - strcpy ( &TAB[i]," "); - } - - strcpy( TAB , " 2 1029 16A 2 1061256A "); - cr_write = write ( descrip_leader , TAB , 48); - if (cr_write != 48) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - for (i=0;i<3600;i++) - { - strcpy ( &TAB[i]," "); - } - - cr_write = write ( descrip_leader , TAB , 3584); - if (cr_write != 3584) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - -/**************************/ -/* Pour le fichier HEADER */ -/**************************/ - -/* 1 RECORD */ - - VAR_LONG[0] = 2; - BYTE[0] = 18; - BYTE[1] = 18; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 3960; - - - cr_write = write ( descrip_leader , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - - cr_write = write ( descrip_leader , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - strcpy ( TAB, " 1"); - cr_write = write ( descrip_leader , TAB , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - for (i=0;i<630;i++) - { - strcpy ( &TAB[i]," "); - } - - cr_write = write ( descrip_leader , TAB , 628); - if (cr_write != 628) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - /* Ecriture du mode spectral */ - - cr_write = write(descrip_leader,mode,3); - if (cr_write != 3) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write(descrip_leader,TAB,360); - if (cr_write != 360) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - /* Initialisation du nombre de colonnes, du nombre de lignes et du nombre - de canaux : */ - sprintf(TAB,"%5d" , *nbcol); - - cr_write = write ( descrip_leader , TAB , 5); - if (cr_write != 5) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - strcpy ( TAB, " "); - cr_write = write ( descrip_leader , TAB , 11); - if (cr_write != 11) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - sprintf(TAB,"%5d" , *nblig); - cr_write = write ( descrip_leader , TAB , 5); - if (cr_write != 5) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - for (i=0;i<35;i++) - { - strcpy(&TAB[i], " "); - } - cr_write = write ( descrip_leader , TAB , 31); - if (cr_write != 31) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - - sprintf(TAB,"%d",*nbca); - cr_write = write ( descrip_leader , TAB , 1); - if (cr_write != 1) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - for (i=0;i<2741;i++) - { - strcpy(&TAB[i], " "); - } - - cr_write = write ( descrip_leader , TAB , 2740); - if (cr_write != 2740) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - - strcpy ( TAB , " 1 3960 16 3960 "); - cr_write = write ( descrip_leader , TAB , 64); - if (cr_write != 64) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - - strcpy ( TAB , " 1 3960 4 3960 "); - cr_write = write ( descrip_leader , TAB , 64); - if (cr_write != 64) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - strcpy ( TAB , " 1 3960 "); - cr_write = write ( descrip_leader , TAB , 32); - if (cr_write != 32) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - - -/**************************************/ -/* Pour le fichier EPHEMERIS/ATTITUDE */ -/**************************************/ - -/* 1 RECORD */ - - VAR_LONG[0] = 3; - BYTE[0] = 246; - BYTE[1] = 36; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 3960; - - - cr_write = write ( descrip_leader , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - strcpy ( TAB , " 1"); - cr_write = write ( descrip_leader , TAB , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - for (i=0;i<3945;i++) - { - strcpy(&TAB[i], " "); - } - -/* Ecriture dans le fichier Leader */ - - cr_write = write ( descrip_leader , TAB , 3944); - if (cr_write != 3944) - { - strcpy(CAI_ERREUR, "Erreur acces au fichier Leader"); - goto ERREUR; - } - - - -/*******************************************/ -/* Pour le fichier RADIOMETRIC CALIBRATION */ -/*******************************************/ - -/* 16 RECORDS */ - - BYTE[0] = 63; - BYTE[1] = 36; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 3960; - - /*image source non SPOT*/ - -/* Ecriture dans le fichier Leader */ - - for (i=0;i<16;i++) /* Pour 16 records */ - { - VAR_LONG[0] = 4+i; - cr_write = write ( descrip_leader , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , TAB , 48); - if (cr_write != 48) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - for (j=0;j<3000;j=j+2) - { - strcpy(&TAB[j], " "); - strcpy(&TAB[j+1], "0"); - } - - cr_write = write ( descrip_leader , TAB , 3000); - if ( cr_write != 3000) - { - strcpy(CAI_ERREUR,"Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - for (j=0;j<900;j++) - { - strcpy(&TAB[j], " "); - } - - cr_write = write ( descrip_leader , TAB , 900); - if (cr_write != 900) - { - strcpy ( CAI_ERREUR, - "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - } - - -/**********************************************/ -/* Pour MODELIZATION et GROUND CONTROL POINTS*/ -/**********************************************/ - -/* 2 RECORD */ - -for (i=0;i<2;i++) -{ - VAR_LONG[0] = 20+i; - BYTE[0] = 8; - BYTE[1] = 21; - BYTE[2] = 48; - BYTE[3] = 35; - VAR_LONG[1] = 3960; - - cr_write = write ( descrip_leader , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - - strcpy ( TAB , " 1"); - cr_write = write ( descrip_leader , TAB, 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR , "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - for (i=0;i<3950;i++) - { - strcpy(&TAB[j], " "); - } - - - /* Ecriture dans le fichier Leader */ - - cr_write = write ( descrip_leader , TAB , 3944); - if ( cr_write != 3944) - { - strcpy(CAI_ERREUR,"Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } -} - -/*****************************/ -/* Pour HISTOGRAM */ -/*****************************/ - -/* 4 RECORDS */ - - BYTE[0] = 192; - BYTE[1] = 36; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 3960; - - - for (i=0;i<*nbca;i++) /* nbca records */ - { - - VAR_LONG[0] = 22+i; - - cr_write = write ( descrip_leader , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , TAB , 3948); - if (cr_write != 3948) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - } - - if (*nbca!=4) - { - for (i=0;i<(4-(*nbca));i++) - { - VAR_LONG[0] = 22+i+(*nbca); - - cr_write = write ( descrip_leader , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - - cr_write = write ( descrip_leader , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - if (*nbca == 1) - { - sprintf(TAB," %d",i+2); - } - if (*nbca == 3) - { - strcpy(TAB," 4"); - } - - cr_write = write ( descrip_leader , TAB , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - for (i=0;i<4000;i++) - { - strcpy(&TAB[j], " "); - } - - cr_write = write(descrip_leader, TAB, 3944); - if (cr_write != 3944) - { - strcpy(CAI_ERREUR,"Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - } - } - - -/**********************************/ -/* Pour le fichier MAP PROJECTION */ -/**********************************/ - -/* 1 RECORD */ - - - VAR_LONG[0] = 26; - BYTE[0] = 36; - BYTE[1] = 36; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 3960; - - cr_write = write ( descrip_leader , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - strcpy(TAB, " 1"); - cr_write = write ( descrip_leader , TAB , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - for (i=0;i<4000;i++) - { - strcpy(&TAB[i], " "); - } - - cr_write = write ( descrip_leader , TAB , 3944); - if (cr_write != 3944) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - -/*******************************/ -/* Pour le fichier ANNOTATIONS */ -/*******************************/ - -/* 1 RECORD */ - - - VAR_LONG[0] = 27; - BYTE[0] = 18; - BYTE[1] = 219; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 3960; - - cr_write = write ( descrip_leader , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - cr_write = write ( descrip_leader , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - strcpy(TAB, " 1 3"); - cr_write = write ( descrip_leader , TAB , 8); - if (cr_write != 8) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - strcpy(TAB, " "); - - cr_write = write ( descrip_leader , TAB , 32); - if (cr_write != 32) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - strcpy(TAB, " 180 36VT "); - cr_write = write ( descrip_leader , TAB , 12); - if (cr_write != 12) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - for (i=0;i<170;i++) - { - strcpy ( &TAB[i]," "); - } - - cr_write = write ( descrip_leader , TAB , 168); - if (cr_write != 168) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - strcpy(TAB, " 360 98VZ1 "); - cr_write = write ( descrip_leader , TAB , 12); - if (cr_write != 12) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - for (i=0;i<350;i++) - { - strcpy ( &TAB[i]," "); - } - - cr_write = write ( descrip_leader , TAB , 348); - if (cr_write != 348) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - - } - - strcpy(TAB, " 540 60VZ2 "); - cr_write = write ( descrip_leader , TAB , 12); - if (cr_write != 12) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - for (i=0;i<1120;i++) - { - strcpy ( &TAB[i]," "); - } - - cr_write = write ( descrip_leader , TAB , 1112); - if (cr_write != 1112) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - strcpy(TAB, " 4 8 "); - cr_write = write ( descrip_leader , TAB , 8); - if (cr_write != 8) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - - for (i=0;i<2240;i++) - { - strcpy(&TAB[i], " "); - } - - cr_write = write ( descrip_leader , TAB , 2236); - if (cr_write != 2236) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Leader Spot1a4"); - goto ERREUR; - } - -/*--------------------------------------------*/ -/* Fermeture du fichier LEADER */ -/*--------------------------------------------*/ - - close (descrip_leader); - - -/******************************************************************/ -/* Constitution du nom du fichier TRAILER et verification qu'il */ -/* n'existe pas deja */ -/******************************************************************/ - sprintf(nom_fic,"%s/TRAI_01.DAT",nom_rep); - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "Le fichier %s TRAILER SPOT1A4 existe \n" , - nom_image ); - goto ERREUR; - } - - -/*---------------------------------------------------------------------------*/ -/* Ouverture du fichier TRAILER en creation */ -/*---------------------------------------------------------------------------*/ - - descrip_trailer = open (nom_fic,O_RDWR|O_CREAT|O_BINARY, PERMS ); - - if (descrip_trailer == -1) - { - strcpy (CAI_ERREUR,"Erreur ouverture du fichier TRAILER SPOT1A4 "); - goto ERREUR; - } - -/*---------------------------------------------------------------------------*/ -/* ECRITURE DU FICHIER TRAILER */ -/*---------------------------------------------------------------------------*/ - -/***********************************/ -/* Pour le fichier FILE DESCRIPTOR */ -/***********************************/ - -/* 1 RECORD */ - -/* SEGMENT FIXE : */ - - VAR_LONG[0] = 1; - BYTE[0] = 63; - BYTE[1] = 192; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 1080; - - cr_write = write ( descrip_trailer , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_trailer , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - - cr_write = write ( descrip_trailer , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB , "A S4-ST-73-1CN 0 0 3"); - cr_write = write ( descrip_trailer , TAB , 36); - if ( cr_write != 36) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - strcpy (TAB," TRAIBIL FSEQ 1 4FTYP 5 4FLGT 9 4YNNN"); - cr_write = write ( descrip_trailer , TAB , 68); - if ( cr_write != 68) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<70;i++) - { - strcpy(&TAB[i], " "); - } - - cr_write = write ( descrip_trailer , TAB , 64); - if ( cr_write != 64) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - -/* SEGMENT VARIABLE : */ - - strcpy ( TAB , " 3 1080"); - cr_write = write ( descrip_trailer , TAB , 12); - if ( cr_write != 12) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<30;i++) - { - strcpy(&TAB[i], " "); - } - - cr_write = write ( descrip_trailer , TAB , 24); - if ( cr_write != 24) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - strcpy ( TAB , " 2 21 4N 2 35200A"); - cr_write = write ( descrip_trailer , TAB , 32); - if ( cr_write != 32) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - for (i=0;i<835;i++) - { - strcpy(&TAB[i], " "); - } - - cr_write = write ( descrip_trailer , TAB , 832); - if ( cr_write != 832) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - -/***********************************/ -/* Pour le fichier TRAILER-QUALITY */ -/***********************************/ - -/* 1 RECORD */ - -/* SEGMENT FIXE : */ - - VAR_LONG[0] = 2; - BYTE[0] = 18; - BYTE[1] = 246; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 1080; - - cr_write = write ( descrip_trailer , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_trailer , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_trailer , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB , " 1 "); - cr_write = write ( descrip_trailer , TAB , 8); - if ( cr_write != 8) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - - /*ecriture dans le fichier trailer*/ - for (i=0;i<215;i++) - { - strcpy(&TAB[i], " "); - } - cr_write = write ( descrip_trailer , TAB , 214); - if ( cr_write != 214) - { - strcpy ( CAI_ERREUR , "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB , " 1 1080"); - cr_write = write ( descrip_trailer , TAB , 10); - if ( cr_write != 10) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<840;i++) - { - strcpy(&TAB[i], " "); - } - - cr_write = write ( descrip_trailer , TAB , 836); - if ( cr_write != 836) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - -/*********************************************/ -/* Pour le fichier GEOMETRIC TRANSFORMATIONS */ -/*********************************************/ - -/* 1 RECORD */ - -/* SEGMENT FIXE : */ - - VAR_LONG[0] = 3; - BYTE[0] = 18; - BYTE[1] = 246; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 1080; - - cr_write = write ( descrip_trailer , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_trailer , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_trailer , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB , " 1"); - cr_write = write ( descrip_trailer , TAB , 4); - if ( cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<1070;i++) - { - strcpy(&TAB[i], " "); - } - - cr_write = write ( descrip_trailer , TAB, 1064); - if ( cr_write != 1064) - { - strcpy ( CAI_ERREUR, "Erreur ecriture du fichier Trailer SPOT1A4"); - goto ERREUR; - } - - -/*----------------------------------------------*/ -/* Fermeture du fichier TRAILER */ -/*----------------------------------------------*/ - - close (descrip_trailer); - - -/******************************************************************/ -/* Constitution du nom du fichier VOLUME_DIRECTORY et */ -/* verification qu'il n'existe pas deja */ -/******************************************************************/ - sprintf(nom_fic,"%s/VOLD_01.DAT",nom_rep); - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , - "Le fichier %s VOLUME_DIRECTORY SPOT1A4 existe \n" , - nom_image ); - goto ERREUR; - } - - -/*---------------------------------------------------------------------------*/ -/* Ouverture du fichier VOLUME DIRECTORY en creation */ -/*---------------------------------------------------------------------------*/ - - descrip_volume = open (nom_fic,O_RDWR|O_CREAT|O_BINARY, PERMS ); - if (descrip_volume == -1) - { - strcpy (CAI_ERREUR, - "Erreur de creation du fichier VOLUME DIRECTORY SPOT1A4"); - goto ERREUR; - } - - -/*---------------------------------------------------------------------------*/ -/* ECRITURE DU FICHIER VOLUME DIRECTORY */ -/*---------------------------------------------------------------------------*/ - -/*************************************/ -/* Pour le fichier VOLUME DESCRIPTOR */ -/*************************************/ - -/* 1 RECORD */ - - VAR_LONG[0] = 1; - BYTE[0] =192; - BYTE[1] = 192; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 360; - - cr_write = write ( descrip_volume , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_volume , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - - cr_write = write ( descrip_volume , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB , "A CCB-CCT-0002 A AECR_EXT_SPOT"); - cr_write = write ( descrip_volume, TAB, 32); - if (cr_write != 32) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - - for (i=0;i<70;i++) - { - strcpy ( &TAB[i]," "); - } - cr_write = write ( descrip_volume, TAB, 68); - if (cr_write != 68) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - -/* Recuperation de la date systeme */ - - LocalTime = time(NULL); /* Date calendaire */ - - -/* Ecriture dans une chaine de caracteres */ - - LgDate = 17; - - strftime ( StrDate , LgDate , "%Y%m%d%H%M%S ",localtime(&LocalTime)); - - cr_write = write ( descrip_volume,StrDate,16); - if (cr_write != 16) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( &TAB[33], " 3 5"); - cr_write = write ( descrip_volume , TAB , 232); - if (cr_write != 232) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - - -/************************************************/ -/* Pour le fichier FILE POINTER for Leader File */ -/************************************************/ - -/* 1 RECORD */ - - VAR_LONG[0] = 2; - BYTE[0] =219; - BYTE[1] = 192; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 360; - - cr_write = write ( descrip_volume , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_volume , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_volume , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB,"A 1SP LEADBIL LEADER FILE "); - cr_write = write ( descrip_volume, TAB, 36); - if (cr_write != 36) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB , " "); - cr_write = write ( descrip_volume, TAB, 16); - if (cr_write != 16) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB,"LEADMIXED BINARY AND ASCII MBAA 27 3960 3960FIXED LENGHTFIXD "); - cr_write = write ( descrip_volume, TAB, 80); - if (cr_write != 80) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - - for (i=0;i<217;i++) - { - strcpy ( &TAB[i]," "); - } - - cr_write = write ( descrip_volume, TAB, 216); - if (cr_write != 216) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - -/*************************************************/ -/* Pour le fichier FILE POINTER for Imagery File */ -/*************************************************/ - -/* 1 RECORD */ - - VAR_LONG[0] = 3; - BYTE[0] =219; - BYTE[1] = 192; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 360; - - cr_write = write ( descrip_volume , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_volume , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_volume , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB,"A 2SP IMGYBIL IMAGERY FIL "); - cr_write = write ( descrip_volume, TAB, 36); - if (cr_write != 36) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB , " IMGYBINARY ONLY BINO"); - cr_write = write ( descrip_volume, TAB, 52); - if (cr_write != 52) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB ,"000 FIXED LENGTHFIXD"); - cr_write = write ( descrip_volume, TAB, 40); - if (cr_write != 40) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<125;i++) - { - strcpy ( &TAB[i]," "); - } - - cr_write = write ( descrip_volume, TAB, 120); - if (cr_write != 120) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy(TAB,"000 "); - cr_write = write ( descrip_volume, TAB, 100); - if (cr_write != 100) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - -/*************************************************/ -/* Pour le fichier FILE POINTER for Trailer File */ -/*************************************************/ - -/* 1 RECORD */ - - VAR_LONG[0] = 4; - BYTE[0] = 219; - BYTE[1] = 192; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 360; - - cr_write = write ( descrip_volume , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_volume , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_volume , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB,"A 3SP TRAIBIL TRAILER FILE"); - cr_write = write ( descrip_volume, TAB, 36); - if (cr_write != 36) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - strcpy(TAB," "); - cr_write = write ( descrip_volume, TAB, 16); - if (cr_write != 16) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB,"TRAIMIXED BINARY AND ASCII MBAA 3 1080 1080FIXED LENGTHFIXD"); - cr_write = write ( descrip_volume, TAB, 76); - if (cr_write != 76) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<225;i++) - { - strcpy ( &TAB[i]," "); - } - cr_write = write ( descrip_volume, TAB, 220); - if (cr_write != 220) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - -/************************/ -/* Pour le fichier TEXT */ -/************************/ - -/* 1 RECORD */ - - VAR_LONG[0] = 5; - BYTE[0] = 18; - BYTE[1] = 63; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = 360; - - cr_write = write ( descrip_volume , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_volume , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - - cr_write = write ( descrip_volume , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB,"A PRODUCT: SPOT"); - cr_write = write ( descrip_volume, TAB, 28); - if (cr_write != 28) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - - strcpy ( TAB," MODE BIL LEVEL \r\n"); - cr_write = write ( descrip_volume, TAB, 40); - if (cr_write != 40) - { - strcpy ( CAI_ERREUR, "Erreur d'ecriture du fichier Volume Directory"); - goto ERREUR; - } - - for (i=0;i<50;i++) - { - strcpy ( &TAB[i]," "); - } - - cr_write = write ( descrip_volume, TAB, 40); - if ( cr_write != 40) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - - strcpy ( TAB , "PROD. CNES_QTIS COPYRIGHT CNES "); - cr_write = write ( descrip_volume , TAB , 35); - if (cr_write != 35) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - -/* Recuperation de la date systeme */ - - LocalTime = time(NULL); /* Date calendaire */ - -/* Ecriture dans une chaine de caracteres */ - - LgDate = 24; - - strftime ( StrDate , LgDate , "%d %m %Y - %HH%MMN%SS" , - localtime(&LocalTime)); - cr_write = write ( descrip_volume, StrDate , 23); - if (cr_write != 23) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB ,"\r\nSCENE - THE "); - cr_write = write ( descrip_volume , TAB , 48); - if (cr_write != 48) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB,"\r\nVOL : VOLUME 1 ORDER: ORDRE 1 \r\n"); - cr_write = write ( descrip_volume , TAB , 42); - if (cr_write != 42) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<95;i++) - { - strcpy ( &TAB[i]," "); - } - - cr_write = write ( descrip_volume , TAB , 92); - if (cr_write != 92) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Volume Directory SPOT1A4"); - goto ERREUR; - } - -/*----------------------------------------------*/ -/* Fermeture du fichier VOLUME */ -/*----------------------------------------------*/ - - close (descrip_volume); - - -/******************************************************************/ -/* Constitution du nom du fichier NULL_VOLUME_DIRECTORY */ -/* et verification qu'il n'existe pas deja */ -/******************************************************************/ - sprintf(nom_fic,"%s/NULL_01.DAT",nom_rep); - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , - "Le fichier %s NULL_VOLUME_DIRECTORY SPOT1A4 existe \n" , - nom_image ); - goto ERREUR; - } - - -/*---------------------------------------------------------------------------*/ -/* Ouverture du fichier NULL VOLUME DIRECTORY en creation */ -/*---------------------------------------------------------------------------*/ - - descrip_null = open (nom_fic,O_RDWR|O_CREAT|O_BINARY, PERMS ); - if (descrip_null == -1) - { - strcpy (CAI_ERREUR, - "Erreur de creation du fichier NULL VOLUME DIRECTORY SPOT1A4"); - goto ERREUR; - } - - -/*---------------------------------------------------------------------------*/ -/* ECRITURE DU FICHIER NULL VOLUME DIRECTORY */ -/*---------------------------------------------------------------------------*/ - -/******************************************/ -/* Pour le fichier NULL VOLUME DESCRIPTOR */ -/******************************************/ - -/* 1 RECORD */ - - VAR_LONG[0] = 1; - BYTE[0] =192; - BYTE[1] = 192; - BYTE[2] = 63; - BYTE[3] = 18; - VAR_LONG[1] = 360; - - cr_write = write ( descrip_null , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Null Volume Directory SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_null , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Null Volume Directory SPOT1A4"); - goto ERREUR; - } - - - cr_write = write ( descrip_null , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Null Volume Directory SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB , "A CCB-CCT-0002 A A"); - cr_write = write ( descrip_null, TAB, 20); - if (cr_write != 20) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Null Volume Directory SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<340;i++) - { - strcpy ( &TAB[i]," "); - } - cr_write = write ( descrip_null, TAB, 328); - if (cr_write != 328) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Null Volume Directory SPOT1A4"); - goto ERREUR; - } - - - -/*-------------------------------------------*/ -/* Fermeture du fichier NULL VOLUME */ -/*-------------------------------------------*/ - - close (descrip_null); - - -/******************************************************************/ -/* Constitution du nom du fichier IMAGERY et verification qu'il */ -/* n'existe pas deja */ -/******************************************************************/ - sprintf(nom_fic,"%s/IMAG_01.DAT",nom_rep); - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "Le fichier %s IMAGERY SPOT1A4 existe \n" , - nom_image ); - goto ERREUR; - } - - -/*---------------------------------------------------------------------------*/ -/* Ouverture du fichier IMAGERY en creation */ -/*---------------------------------------------------------------------------*/ - - descrip_imagery = open (nom_fic,O_RDWR|O_CREAT|O_BINARY, PERMS ); - if (descrip_imagery == -1) - { - strcpy ( CAI_ERREUR , "Erreur de creation du fichier Imagerie SPOT1A4"); - goto ERREUR; - } - -/*---------------------------------------------------------------------------*/ -/* ECRITURE DU FICHIER IMAGERY */ -/*---------------------------------------------------------------------------*/ - -/***********************************/ -/* Pour le fichier FILE DESCRIPTOR */ -/***********************************/ - -/* SEGMENT FIXE : */ - - /* Initialisation de nbrec et lgrec et des autres donnees utiles */ - nb = (*nbcol)*(*nboct_pix); - /* Definition de lgrec : */ - if (nb<=5300) - lgrec = 5400; - else if ((nb>5300) && (nb<=8540)) - lgrec = 8640; - else if ((nb>8540) && (nb<=10880)) - lgrec = 10980; - else if ((nb>10880) && (nb<=12140)) - lgrec = 12240; - else - { - strcpy ( CAI_ERREUR , "Enregistrement trop long pour le fichier imagery"); - goto ERREUR; - } - - - /* 1 RECORD */ - VAR_LONG[0] = 1; - BYTE[0] = 63; - BYTE[1] = 192; - BYTE[2] = 18; - BYTE[3] = 18; - VAR_LONG[1] = lgrec; - - - nbrec = (*nbca)*(*nblig); - if (nbrec<10000) - { - strcpy(&TAMP2[0][0]," "); - strcpy(&TAMP2[0][1]," "); - sprintf ( str_int4,"%d",nbrec); - for (i=0;i<4;i++) - { - strcpy(&TAMP2[0][i+2],&str_int4[i]); - } - } - else - { - strcpy(&TAMP2[0][0]," "); - sprintf (str_int5,"%d",nbrec); - for (i=0;i<5;i++) - { - strcpy(&TAMP2[0][i+1],&str_int5[i]); - } - } - - - if (lgrec<10000) - { - strcpy(&TAMP2[1][0]," "); - strcpy(&TAMP2[1][1]," "); - sprintf ( str_int4,"%d",lgrec); - for (i=0;i<4;i++) - { - strcpy(&TAMP2[1][i+2],&str_int4[i]); - } - } - else - { - strcpy(&TAMP2[1][0]," "); - sprintf (str_int5,"%d",lgrec); - for (i=0;i<5;i++) - { - strcpy(&TAMP2[1][i+1],&str_int5[i]); - } - } - - - /* Initialisation du nombre de colonnes et du nombre de lignes : */ - - for (i=0;i<3;i++) - { - strcpy ( &TAMP2[2][i]," "); - strcpy ( &TAMP2[3][i]," "); - } - - if (*nblig < 10000) - { - strcpy ( &TAMP2[2][3] , "0"); - sprintf( str_int4 , "%d" , *nblig); - for (j=0;j<4;j++) - { - strcpy(&TAMP2[2][j+4],&str_int4[j]); - } - } - else - { - sprintf( str_int5, "%d", *nblig); - for (j=0;j<5;j++) - { - strcpy ( &TAMP2[2][j+3],&str_int5[j]); - } - } - - if (*nbcol < 10000) - { - strcpy ( &TAMP2[3][3] , "0"); - sprintf ( str_int4 , "%d" , *nbcol); - for (j=0;j<4;j++) - { - strcpy ( &TAMP2[3][j+4],&str_int4[j]); - } - } - else - { - sprintf ( str_int5 , "%d" , *nbcol); - for ( j=0;j<5;j++) - { - strcpy ( &TAMP2[3][j+3],&str_int5[j]); - } - } - - for (i=0;i<4;i++) - { - strcpy(&TAMP2[4][i]," "); - } - - - cr_write = write ( descrip_imagery , &VAR_LONG[0] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - cr_write = write ( descrip_imagery , BYTE , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - - cr_write = write ( descrip_imagery , &VAR_LONG[1] , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR, "Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB, "A S4-ST-73-1CN 0 0 2"); - cr_write = write ( descrip_imagery , TAB , 36); - if ( cr_write != 36) - { - strcpy ( CAI_ERREUR, "Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - -/* Initialisation du mode spectral et du niveau : */ - if ((mode[0]=='X')&&(mode[1]=='I')) - sprintf(TAB," I0 "); - else - sprintf(TAB," %.1s0 ",&mode[0]); - - - cr_write = write (descrip_imagery, TAB, 8); - if (cr_write != 8) - { - strcpy(CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - /* Initialisation du niveau de traitement : */ - - LEVEL[0]=' '; - strcpy(TAB, "IMGYBIL FSEQ 1 4FTYP 5 4FLGT 9 4YNYN"); - cr_write = write (descrip_imagery, TAB, 60); - if (cr_write != 60) - { - strcpy(CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<70;i++) - { - strcpy ( &TAB[i]," "); - } - - cr_write = write (descrip_imagery, TAB, 64); - if (cr_write != 64) - { - strcpy(CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - -/* SEGMENT VARIABLE : */ - - cr_write = write (descrip_imagery , TAMP2 , 6); - if (cr_write != 6) - { - strcpy ( CAI_ERREUR, "Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - cr_write = write (descrip_imagery , TAMP2[1] , 6); - if (cr_write != 6) - { - strcpy ( CAI_ERREUR, "Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - - cr_write = write (descrip_imagery, TAB, 24); - if (cr_write != 24) - { - strcpy(CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - if (*nboct_pix == 1) - { - strcpy ( TAB ," 8"); - } - else if (*nboct_pix == 2) - { - strcpy ( TAB, " 16"); - } - - - cr_write = write (descrip_imagery, TAB, 4); - if (cr_write != 4) - { - strcpy(CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<15;i++) - { - strcpy ( &TAB[i]," "); - } - - strcpy(TAB, " 1 1 "); - cr_write = write (descrip_imagery, TAB, 12); - if (cr_write != 12) - { - strcpy(CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - - sprintf(TAB,"%4.d",*nbca); - cr_write = write ( descrip_imagery , TAB , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - cr_write = write (descrip_imagery, TAMP2[2], 8); - if (cr_write != 8) - { - strcpy(CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<5;i++) - { - strcpy ( &TAB[i]," "); - } - - - strcpy ( TAB, " 0"); - cr_write = write ( descrip_imagery , TAB , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - cr_write = write (descrip_imagery, TAMP2[3], 8); - if (cr_write != 8) - { - strcpy(CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - cr_write = write (descrip_imagery, TAMP2[4], 4); - if (cr_write != 4) - { - strcpy(CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<16;i++) - { - strcpy ( &TAB[i]," "); - } - - strcpy ( TAB, " 0 0BIL 1"); - cr_write = write ( descrip_imagery , TAB , 14); - if (cr_write != 14) - { - strcpy ( CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - sprintf(TAB,"%4.d",*nbca); - - cr_write = write ( descrip_imagery , TAB , 2); - if (cr_write != 2) - { - strcpy ( CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - - for (i=0;i<6;i++) - { - strcpy ( &TAB[i]," "); - } - - strcpy ( TAB, " 20"); - cr_write = write ( descrip_imagery , TAB , 4); - if (cr_write != 4) - { - strcpy ( CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - if (lgrec == 5400) - { - strcpy(TAB , " 5300"); - } - else - { - if (lgrec == 8640) - { - strcpy(TAB , " 8540"); - } - else - { - if (lgrec == 10980) - { - strcpy(TAB, " 10880"); - } - else strcpy(TAB, " 12140"); - } - } - cr_write = write ( descrip_imagery , TAB , 8); - if (cr_write != 8) - { - strcpy ( CAI_ERREUR , "Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB, " 28 1 4PB 5 4PB"); - cr_write = write ( descrip_imagery , TAB , 24); - if (cr_write != 24) - { - strcpy ( CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - strcpy ( TAB, " "); - if ( LEVEL[0] == 'A') - { - strcpy(TAB," 9 4PB"); - } - if (( LEVEL[0] == 'B') || (LEVEL[0] == ' ')) - { - strcpy(TAB," "); - } - cr_write = write ( descrip_imagery , TAB , 8); - if (cr_write != 8) - { - strcpy ( CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB , " 13 4PB 17 4PB"); - cr_write = write ( descrip_imagery , TAB , 16); - if (cr_write != 16) - { - strcpy ( CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<40;i++) - { - strcpy ( &TAB[i]," "); - } - - cr_write = write ( descrip_imagery , TAB , 32); - if (cr_write != 32) - { - strcpy ( CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - if ( LEVEL[0] == 'A') - { - strcpy(TAB," 1 2PB"); - } - if (( LEVEL[0] == 'B') || ( LEVEL[0] == ' ')) - { - strcpy(TAB," "); - } - cr_write = write ( descrip_imagery , TAB , 8); - if (cr_write != 8) - { - strcpy ( CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - for (i=0;i<60;i++) - { - strcpy ( &TAB[i]," "); - } - - cr_write = write ( descrip_imagery , TAB , 56); - if (cr_write != 56) - { - strcpy ( CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - strcpy ( TAB, " 0 0 254"); - cr_write = write ( descrip_imagery , TAB , 16); - if (cr_write != 16) - { - strcpy ( CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - - -/* Mise a blanc de lgrec-180-268 = lgrec-448 octets */ - - for (i=0;i<5000;i++) - { - strcpy ( &TAB[i]," "); - } - - k = lgrec-448; - cr_write = write ( descrip_imagery , TAB , k); - if (cr_write != k) - { - strcpy ( CAI_ERREUR,"Erreur d'ecriture du fichier Imagery SPOT1A4"); - goto ERREUR; - } - -/*------------------------------------*/ -/* Ecriture de l'image entiere a vide */ -/*------------------------------------*/ - nb=(*nblig)*(*nbca); - for (i=0;i<lgrec;i++) - { - TAB[i]=0; - } - - for (i=0;i<nb;i++) - { - cr_write = write ( descrip_imagery , TAB , lgrec); - if (cr_write != lgrec) - { - strcpy ( CAI_ERREUR, - "Erreur d'ecriture du fichier Imagery SPOT1A4 a vide"); - goto ERREUR; - } - } - - /*stockage de la long enregistrement et port */ - - for (i=0;i<*nbca;i=i+1) - { - image1->ACCES_CANAL_INT[i]=descrip_imagery; - image1->POS_OCTET[i]=lgrec; - } - image1->TYPE_SPOT = 1; - - /* Sortie sans erreur : */ - return(image1); - -/* Sorties degradees : */ - -ERREUR: - -/* Fermeture des fichiers et destructions */ - if (descrip_leader>0) close(descrip_leader); - if (descrip_trailer>0) close(descrip_trailer); - if (descrip_volume>0) close(descrip_volume); - if (descrip_null>0) close(descrip_null); - if (descrip_imagery>0) close(descrip_imagery); - if (Existe==0) - { - sprintf(Command,"rm -R %s",nom_rep); - system(Command); - } - else - { - sprintf(nom_fic,"%s/LEAD_01.DAT",nom_rep); - unlink(nom_fic); - sprintf(nom_fic,"%s/TRAI_01.DAT",nom_rep); - unlink(nom_fic); - sprintf(nom_fic,"%s/VOLD_01.DAT",nom_rep); - unlink(nom_fic); - sprintf(nom_fic,"%s/IMAG_01.DAT",nom_rep); - unlink(nom_fic); - sprintf(nom_fic,"%s/NULL_01.DAT",nom_rep); - unlink(nom_fic); - } - - return(NULL); - -} -/* - Fin de l'operation cai_ouvre_creation_spot1a4 -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_spot5TIF */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format spot5 TIFF et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_spot5TIF(repert, */ -/* ---------------- nom_image,nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* repert (E) (char *) : repertoire de stockage */ -/* nom_image (E) (char *) : nom de l'image a ouvrir */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_spot5TIF (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -static CAI_IMAGE *cai_ouvre_creation_spot5TIF(char *repert, - char *nom_image, - int *nbca, - int *nboct_pix, - int *nbcol, - int *nblig, - char *label) - -{ - char nom_fic[1024]; /* nom du fichier leader */ - char nom_ficM[1024]; /* nom du fichier leader renomme */ - char nom_rep[1024]; /* nom du repertoire image */ - CAI_OK_KO icr; /* compte rendu d'operation */ - struct stat buf_stat; /* structure decrivant status de fichier */ - CAI_IMAGE *image1; /* descripteur image */ - int Existe; /* Indicateur d'existence du repertoire image */ - int retour,cr; /* retour de fonction stat */ - -/*........................................ - INITIALISATIONS et allocation de place pour la structure CAI_IMAGE - .........................................*/ - Existe = 0; - -/******************************************************************/ -/* Constitution du repertoire image s'il n'existe pas deja */ -/******************************************************************/ - - nom_fic[0]='\0'; - if ((long)strlen(repert)!= 0) - { - sprintf(nom_rep,"%s/%s",repert,nom_image); - } - else - { - sprintf(nom_rep,"%s",nom_image); - } - - retour = stat ( nom_rep , &buf_stat ); - - /* si le repertoire image n'existe pas, le creer*/ - if ( retour != 0 ) - { - cr = mkdir (nom_rep,0775); - if (cr !=0) - { - sprintf ( CAI_ERREUR , - "probleme a la creation du repertoire image %s SPOT5TIFF \n" , - nom_image ); - retour =0; - goto ERREUR; - } - } - else - Existe = 1; - -/******************************************************************/ -/* Constitution du nom du fichier IMAGERY et verification qu'il */ -/* n'existe pas deja */ /******************************************************************/ -/*****************************************************************/ -/* MOD : VERSION : 4.7 : DM : IMAG_01.TIF devient IMAGERY.TIF */ -/*****************************************************************/ - sprintf(nom_fic,"%s/IMAGERY.TIF",nom_rep); - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "Le fichier %s IMAGERY SPOT5TIFF existe \n" , - nom_image ); - goto ERREUR; - } - sprintf(nom_fic,"IMAGERY"); - image1 = cai_ouvre_creation_tiff(nom_rep,nom_fic,nbca, - nboct_pix,nbcol,nblig,label); - if (image1 == NULL) - goto ERREUR; -/******************************************************************/ -/* fichier LEADER : verification s'il existe pas deja */ -/******************************************************************/ -/*****************************************************************/ -/* MOD : VERSION : 4.7 : DM : LEAD_01.DAT devient METADATA.DIM */ -/*****************************************************************/ - - sprintf(nom_fic,"%s/METADATA.DIM",nom_rep); - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR ,"Le fichier %s METADATA.DIM SPOT5TIFF existe \n" , - nom_image ); - goto ERREUR; - } - -/******************************************************************/ -/* fichier METADATA.DIM : constitution */ -/******************************************************************/ - image1->NB_LIG = (*nblig); - image1->NB_COL = (*nbcol); - image1->NB_CANAUX = (*nbca); - image1->NBOCT_PIX = (*nboct_pix); - image1->TYPE_SPOT = 2; - icr = cai_creat_leader_spot5(image1,nom_fic); - if (icr !=CAI_OK) - { - sprintf ( CAI_ERREUR , "Erreur creation METADATA.DIM SPOT5TIFF" ); - goto ERREUR; - - } - -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : DM : Remplacer les appels systemes pour renommer un */ -/* fichier par la commande C rename */ -/*****************************************************************************/ - /* Sortie sans erreur : */ -/* renommer l'image en majuscule */ - sprintf(nom_fic,"%s/IMAGERY.tif",nom_rep); - sprintf(nom_ficM,"%s/IMAGERY.TIF",nom_rep); - rename(nom_fic,nom_ficM); - - return(image1); - -/* Sorties degradees : */ - -ERREUR: -/* destruction du fichier leader et de l'image */ -/* et s'il n'existe pas du repertoire */ - if (image1 != NULL) - icr = cai_ferme_tiff (image1); - - if (Existe==0) - { - sprintf(Command,"rm -R %s",nom_rep); - system(Command); - } - return(NULL); - -} -/* - Fin de l'operation cai_ouvre_creation_spot5TIF -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_spot5BIL */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format spot5 BIL et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_spot5BIL(repert, */ -/* ---------------- nom_image,nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* repert (E) (char *) : repertoire de stockage */ -/* nom_image (E) (char *) : nom de l'image a ouvrir */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_spot5BIL (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -static CAI_IMAGE *cai_ouvre_creation_spot5BIL(char *repert, - char *nom_image, - int *nbca, - int *nboct_pix, - int *nbcol, - int *nblig, - char *label) -{ - char nom_fic[1024]; /* nom du fichier leader */ - char nom_ficM[1024]; /* nom du fichier leader renomme */ - char nom_rep[1024],*Fic; /* nom du repertoire image */ - CAI_OK_KO icr; /* compte rendu d'operation */ - struct stat buf_stat; /* structure decrivant status de fichier */ - CAI_IMAGE *image1; /* descripteur image */ - int Existe; /* Indicateur d'existence du repertoire image */ - int retour,cr; /* retour de fonction stat */ - -/*........................................ - INITIALISATIONS et allocation de place pour la structure CAI_IMAGE - .........................................*/ - Existe = 0; - -/******************************************************************/ -/* Constitution du repertoire image s'il n'existe pas deja */ -/******************************************************************/ - - nom_fic[0]='\0'; - if ((long)strlen(repert)!= 0) - { - sprintf(nom_rep,"%s/%s",repert,nom_image); - } - else - { - sprintf(nom_rep,"%s",nom_image); - } - - retour = stat ( nom_rep , &buf_stat ); - - /* si le repertoire image n'existe pas, le creer*/ - if ( retour != 0 ) - { - cr = mkdir (nom_rep,0775); - if (cr !=0) - { - sprintf ( CAI_ERREUR , - "probleme a la creation du repertoire image %s SPOT5BIL \n" , - nom_image ); - goto ERREUR; - } - } - else - Existe = 1; - -/******************************************************************/ -/* Constitution du nom du fichier IMAGERY et verification qu'il */ -/* n'existe pas deja */ /******************************************************************/ -/****************************************************************/ -/* MOD : VERSION : 4.7 : DM : IMAG_XX.bil devient IMAGERY.BIL */ -/****************************************************************/ - sprintf(nom_fic,"%s/IMAGERY.BIL",nom_rep); - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "Le fichier %s IMAGERY SPOT5BIL existe \n" , - nom_image ); - goto ERREUR; - } -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : FA : Correction sprintf(nom_fic,"IMAGERY") au lieu */ -/* de sprintf(nom_fic,"IMAGERY",nom_rep) */ -/*****************************************************************************/ - sprintf(nom_fic,"IMAGERY"); - image1 = cai_ouvre_creation_bil(nom_rep,nom_fic,nbca, - nboct_pix,nbcol,nblig,label); - if (image1 == NULL) - goto ERREUR; - else - { -/* destruction du fichier .bil_hd qui n'a aucune utilite pour Spot5 */ - sprintf(nom_fic,"%s/IMAGERY.bil_hd",nom_rep); - unlink(nom_fic); - } -/******************************************************************/ -/* fichier LEADER : verification s'il existe pas deja */ -/******************************************************************/ -/*****************************************************************/ -/* MOD : VERSION : 4.7 : DM : LEAD_01.DAT devient METADATA.DIM */ -/*****************************************************************/ - sprintf(nom_fic,"%s/METADATA.DIM",nom_rep); - - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "Le fichier %s METADATA.DIM SPOT5BIL existe \n" , - nom_image ); - goto ERREUR; - } - -/******************************************************************/ -/* fichier METADATA.DIM : constitution */ -/******************************************************************/ - image1->NB_LIG = (*nblig); - image1->NB_COL = (*nbcol); - image1->NB_CANAUX = (*nbca); - image1->NBOCT_PIX = (*nboct_pix); - image1->TYPE_SPOT = 3; - icr = cai_creat_leader_spot5(image1,nom_fic); - if (icr !=CAI_OK) - { - sprintf ( CAI_ERREUR , "Erreur creation METADATA.DIM SPOT5BIL" ); - goto ERREUR; - - } - -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : DM : Remplacer les appels systemes pour renommer un */ -/* fichier par la commande C rename */ -/*****************************************************************************/ - /* Sortie sans erreur : */ -/* renommer l'image en majuscule */ - sprintf(nom_fic,"%s/IMAGERY.bil",nom_rep); - sprintf(nom_ficM,"%s/IMAGERY.BIL",nom_rep); - rename(nom_fic,nom_ficM); - - return(image1); - -/* Sorties degradees : */ - -ERREUR: -/* destruction du fichier leader et de l'image */ -/* et s'il n'existe pas du repertoire */ - if (image1 != NULL) - icr = cai_ferme_bil (image1); - - if (Existe==0) - { - sprintf(Command,"rm -R %s",nom_rep); - system(Command); - } - return(NULL); - -} -/* - Fin de l'operation cai_ouvre_creation_spot5BIL -*/ -/******************************************************************************/ -/* */ -/*OPERATION : cai_creat_leader_spot5 */ -/* */ -/*ROLE : Cette operation genère un fichier XML de donnees auxiliaires SPOT5 */ -/* a partir des donnees cai_image passees en parametre */ -/* */ -/*CONTEXTE D'APPEL : */ -/* */ -/*RETOUR : CAI_OK si tout va bien , CAI_KO sinon */ -/* */ -/******************************************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : FA : erreur d'orthographe sur LATITUDE_ARGUMENT */ -/* et Look_Angles */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : FA : erreur initialisation BYTEORDER en creation */ -/*****************************************************************************/ - -CAI_OK_KO cai_creat_leader_spot5 ( CAI_IMAGE *desc_im , char *nom_fich ) - { - /* Code retour */ - CAI_OK_KO cr; - /* Fichier XML a generer */ - FILE *des; - /* Nombre de lignes de l'image */ - int nblig; - /* Nombre de colonnes */ - int nbcol; - /* Nombre de canaux */ - int nbcan; - /* Nombre d'octets par pixel */ - int nboct; - /* type de SPOT ( TIFF ou BIL ) */ - int typeimg; - int type; - - int i; - - char valeur[200]; - - /* affectation des variables */ - - nblig = desc_im->NB_LIG; - nbcol = desc_im->NB_COL; - nbcan = desc_im->NB_CANAUX; - nboct = desc_im->NBOCT_PIX; - typeimg = desc_im->TYPE_SPOT; - - /********************************************************/ - /* OUVERTURE DU FICHIER XML PRODUIT */ - /********************************************************/ - - if ( ( des = fopen ( nom_fich , "wb" ) ) == NULL ) - { - sprintf ( CAI_ERREUR , "Impossible de creer le fichier XML %s" , nom_fich ); - goto ERREUR; - } - - /********************************************************/ - /* ECRITURE DES DONNEES XML DANS LE FICHIER */ - /********************************************************/ - - /* Entete du document XML */ - - cr = cai_WriteEnteteXML ( des ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture entete XML" ); - goto ERREUR; - } - - /* Element Dimap_Document */ - - cr = cai_WriteOpenTagXML ( des , "Dimap_Document" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Dimap_Document" ); - goto ERREUR; - } - - /* Sous element Metadata_Id */ - - cr = cai_WriteOpenTagXML ( des , "Metadata_Id" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Metadata_Id" ); - goto ERREUR; - } - - /* sous element METADATA_FORMAT */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Version DIMAP passe de 2.0 à 2.9 */ -/*****************************************************************************/ - type=0; - cr = cai_WriteElementXMLWithAttribute ( des , "METADATA_FORMAT" , "DIMAP" , - "version" , "2.9",type ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element METADATA_FORMAT" ); - goto ERREUR; - } - - /* sous element METADATA_PROFILE */ - - cr = cai_WriteElementXML ( des , "METADATA_PROFILE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element METADATA_PROFILE" ); - goto ERREUR; - } - - /* Fermeture de l'element Metadata_Id */ - - cr = cai_WriteCloseTagXML ( des , "Metadata_Id" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Metadata_Id" ); - goto ERREUR; - } - - /* Sous element Dataset_Id */ - - cr = cai_WriteOpenTagXML ( des , "Dataset_Id" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Dataset_Id" ); - goto ERREUR; - } - - /* sous element DATASET_NAME */ - - cr = cai_WriteElementXML ( des , "DATASET_NAME" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DATASET_NAME" ); - goto ERREUR; - } - - /* sous element COPYRIGHT */ - - cr = cai_WriteElementXML ( des , "COPYRIGHT" , "COPYRIGHT CNES" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element COPYRIGHT" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'attribut href="" */ -/****************************************************************************/ - - /* sous element DATASET_TN_PATH */ - type=1; - cr = cai_WriteElementXMLWithAttribute ( des , "DATASET_TN_PATH" , "" , "href" , "" ,type); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DATASET_TN_PATH" ); - goto ERREUR; - } - - /* sous element DATASET_TN_FORMAT */ - - cr = cai_WriteElementXML ( des , "DATASET_TN_FORMAT" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DATASET_TN_FORMAT" ); - goto ERREUR; - } - - /* sous element DATASET_QL_PATH */ - type=1; - cr = cai_WriteElementXMLWithAttribute ( des , "DATASET_QL_PATH" , "" , "href" , "" ,type); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DATASET_QL_PATH" ); - goto ERREUR; - } - - /* sous element DATASET_QL_FORMAT */ - - cr = cai_WriteElementXML ( des , "DATASET_QL_FORMAT" , "" ); - - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DATASET_QL_FORMAT" ); - goto ERREUR; - } - - /* Fermeture de l'element Dataset_Id */ - - cr = cai_WriteCloseTagXML ( des , "Dataset_Id" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Dataset_Id" ); - goto ERREUR; - } - - /* sous element Dataset_Sources */ - - cr = cai_WriteOpenTagXML ( des , "Dataset_Sources" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Dataset_Sources" ); - goto ERREUR; - } - - /* sous element Source_Information */ - - cr = cai_WriteOpenTagXML ( des , "Source_Information" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Source_Information" ); - goto ERREUR; - } - - /* sous element SOURCE_TYPE */ - - cr = cai_WriteElementXML ( des , "SOURCE_TYPE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SOURCE_TYPE" ); - goto ERREUR; - } - - /* sous element SOURCE_ID */ - - cr = cai_WriteElementXML ( des , "SOURCE_ID" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SOURCE_ID" ); - goto ERREUR; - } - - /* sous element SOURCE_DESCRIPTION */ - - cr = cai_WriteElementXML ( des , "SOURCE_DESCRIPTION" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SOURCE_DESCRIPTION" ); - goto ERREUR; - } - - /* sous element Scene_Source */ - - cr = cai_WriteOpenTagXML ( des , "Scene_Source" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Scene_Source" ); - goto ERREUR; - } - - /* sous element IMAGING_DATE */ - - cr = cai_WriteElementXML ( des , "IMAGING_DATE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element IMAGING_DATE" ); - goto ERREUR; - } - - /* sous element IMAGING_TIME */ - - cr = cai_WriteElementXML ( des , "IMAGING_TIME" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element IMAGING_TIME" ); - goto ERREUR; - } - - /* sous element MISSION */ - - cr = cai_WriteElementXML ( des , "MISSION" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element MISSION" ); - goto ERREUR; - } - - /* sous element MISSION_INDEX */ - - cr = cai_WriteElementXML ( des , "MISSION_INDEX" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element MISSION_INDEX" ); - goto ERREUR; - } - - /* sous element INSTRUMENT */ - - cr = cai_WriteElementXML ( des , "INSTRUMENT" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element INSTRUMENT" ); - goto ERREUR; - } - - /* sous element INSTRUMENT_INDEX */ - - cr = cai_WriteElementXML ( des , "INSTRUMENT_INDEX" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element INSTRUMENT_INDEX" ); - goto ERREUR; - } - - /* sous element SENSOR_CODE */ - - cr = cai_WriteElementXML ( des , "SENSOR_CODE" , "" ); - - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SENSOR_CODE" ); - goto ERREUR; - } - - /* sous element INCIDENCE_ANGLE */ - - cr = cai_WriteElementXML ( des , "INCIDENCE_ANGLE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element INCIDENCE_ANGLE" ); - goto ERREUR; - } - - /* sous element SUN_AZIMUT */ - - cr = cai_WriteElementXML ( des , "SUN_AZIMUTH" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SUN_AZIMUT" ); - goto ERREUR; - } - - /* sous element SUN_ELEVATION */ - - cr = cai_WriteElementXML ( des , "SUN_ELEVATION" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SUN_ELEVATION" ); - goto ERREUR; - } - - /* sous element Imaging_Parameters */ - - cr = cai_WriteOpenTagXML ( des , "Imaging_Parameters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Imaging_Parameters" ); - goto ERREUR; - } - - /* sous element REVOLUTION_NUMBER */ - - cr = cai_WriteElementXML ( des , "REVOLUTION_NUMBER" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element REVOLUTION_NUMBER" ); - goto ERREUR; - } - - /* sous element COMPRESSION_MODE */ - - cr = cai_WriteElementXML ( des , "COMPRESSION_MODE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element COMPRESSION_MODE" ); - goto ERREUR; - } - - /* sous element DIRECT_PLAYBACK_INDICATOR */ - - cr = cai_WriteElementXML ( des , "DIRECT_PLAYBACK_INDICATOR" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DIRECT_PLAYBACK_INDICATOR" ); - goto ERREUR; - } - - /* sous element REFOCUSING_STEP_NUM */ - - cr = cai_WriteElementXML ( des , "REFOCUSING_STEP_NUM" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element REFOCUSING_STEP_NUM" ); - goto ERREUR; - } - - /* sous element SWATH_MODE */ - - cr = cai_WriteElementXML ( des , "SWATH_MODE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SWATH_MODE" ); - goto ERREUR; - } - - /* Fermeture de l'element Imaging_Parameters */ - - cr = cai_WriteCloseTagXML ( des , "Imaging_Parameters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Imaging_Parameters" ); - goto ERREUR; - } - - /* Fermeture de l'element Scene_Source */ - - cr = cai_WriteCloseTagXML ( des , "Scene_Source" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Scene_Source" ); - goto ERREUR; - } - - /* Fermeture de l'element Source_Information */ - - cr = cai_WriteCloseTagXML ( des , "Source_Information" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Source_Information" ); - goto ERREUR; - } - - /* Fermeture de l'element Dataset_Sources */ - - cr = cai_WriteCloseTagXML ( des , "Dataset_Sources" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Dataset_Sources" ); - goto ERREUR; - } - - /* sous element Coordinate_Reference_System */ - - cr = cai_WriteOpenTagXML ( des , "Coordinate_Reference_System" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Coordinate_Reference_System" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'attribut version="5.2" */ -/*****************************************************************************/ - - /* sous element GEO_TABLES */ - type=0; - cr = cai_WriteElementXMLWithAttribute ( des , "GEO_TABLES" , "" , "version" , "5.2" ,type); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element GEO_TABLES" ); - goto ERREUR; - } - - /* sous element Horizontal_CS */ - - cr = cai_WriteOpenTagXML ( des , "Horizontal_CS" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Horizontal_CS" ); - goto ERREUR; - } - - /* sous element HORIZONTAL_CS_TYPE */ - - cr = cai_WriteElementXML ( des , "HORIZONTAL_CS_TYPE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element HORIZONTAL_CS_TYPE" ); - goto ERREUR; - } - - /* sous element HORIZONTAL_CS_CODE */ - - cr = cai_WriteElementXML ( des , "HORIZONTAL_CS_CODE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element HORIZONTAL_CS_CODE" ); - goto ERREUR; - } - - /* sous element HORIZONTAL_CS_NAME */ - - cr = cai_WriteElementXML ( des , "HORIZONTAL_CS_NAME" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element HORIZONTAL_CS_NAME" ); - goto ERREUR; - } - - /* Fermeture de l'element Horizontal_CS */ - - cr = cai_WriteCloseTagXML ( des , "Horizontal_CS" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Horizontal_CS" ); - goto ERREUR; - } - - /* Fermeture de l'element Coordinate_Reference_System */ - - cr = cai_WriteCloseTagXML ( des , "Coordinate_Reference_System" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Coordinate_Reference_System" ); - goto ERREUR; - } - - /* sous element Raster_CS */ - - cr = cai_WriteOpenTagXML ( des , "Raster_CS" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Raster_CS" ); - goto ERREUR; - } - - /* sous element RASTER_CS_TYPE */ - - cr = cai_WriteElementXML ( des , "RASTER_CS_TYPE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element RASTER_CS_TYPE" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element PIXEL_ORIGIN */ -/****************************************************************************/ - - /* sous element PIXEL_ORIGIN */ - - cr = cai_WriteElementXML ( des , "PIXEL_ORIGIN" , "1" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PIXEL_ORIGIN" ); - goto ERREUR; - } - - /* Fermeture de l'element Raster_CS */ - - cr = cai_WriteCloseTagXML ( des , "Raster_CS" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Raster_CS" ); - goto ERREUR; - } - - /* sous element Geoposition */ - - cr = cai_WriteOpenTagXML ( des , "Geoposition" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Geoposition" ); - goto ERREUR; - } - - /* sous element Geoposition_Points */ - - cr = cai_WriteOpenTagXML ( des , "Geoposition_Points" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Geoposition_Points" ); - goto ERREUR; - } - - /* sous element Tie_Point */ - - cr = cai_WriteOpenTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Tie_Point" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_X */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_X" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_CRS_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_Y */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Y" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_CRS_Y" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element TIE_POINTS_CRS_Z */ -/****************************************************************************/ - - /* sous element TIE_POINTS_CRS_Z */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Z" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_Z" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_DATA_X */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_X" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_DATA_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_DATA_Y */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_Y" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_DATA_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Tie_Point */ - - cr = cai_WriteCloseTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Tie_Point" ); - goto ERREUR; - } - - /* sous element Tie_Point */ - - cr = cai_WriteOpenTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Tie_Point" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_X */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_X" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_CRS_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_Y */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Y" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_CRS_Y" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element TIE_POINTS_CRS_Z */ -/****************************************************************************/ - - /* sous element TIE_POINTS_CRS_Z */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Z" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_Z" ); - goto ERREUR; - } - - - /* sous element TIE_POINTS_DATA_X */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_X" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_DATA_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_DATA_Y */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_Y" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_DATA_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Tie_Point */ - - cr = cai_WriteCloseTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Tie_Point" ); - goto ERREUR; - } - - /* sous element Tie_Point */ - - cr = cai_WriteOpenTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Tie_Point" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_X */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_X" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_CRS_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_Y */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Y" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_CRS_Y" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element TIE_POINTS_CRS_Z */ -/****************************************************************************/ - - /* sous element TIE_POINTS_CRS_Z */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Z" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_Z" ); - goto ERREUR; - } - - - /* sous element TIE_POINTS_DATA_X */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_X" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_DATA_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_DATA_Y */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_Y" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_DATA_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Tie_Point */ - - cr = cai_WriteCloseTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Tie_Point" ); - goto ERREUR; - } - - /* sous element Tie_Point */ - - cr = cai_WriteOpenTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Tie_Point" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_X */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_X" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_CRS_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_CRS_Y */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Y" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_CRS_Y" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element TIE_POINTS_CRS_Z */ -/****************************************************************************/ - - /* sous element TIE_POINTS_CRS_Z */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_CRS_Z" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element TIE_POINTS_CRS_Z" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_DATA_X */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_X" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_DATA_X" ); - goto ERREUR; - } - - /* sous element TIE_POINTS_DATA_Y */ - - cr = cai_WriteElementXML ( des , "TIE_POINTS_DATA_Y" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIE_POINTS_DATA_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Tie_Point */ - - cr = cai_WriteCloseTagXML ( des , "Tie_Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Tie_Point" ); - goto ERREUR; - } - - /* Fermeture de l'element Geoposition_Points */ - - cr = cai_WriteCloseTagXML ( des , "Geoposition_Points" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Geoposition_Points" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Deplacement de Simplified_Location_Model */ -/*****************************************************************************/ - - /* sous element Simplified_Location_Model */ - - cr = cai_WriteOpenTagXML ( des , "Simplified_Location_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Simplified_Location_Model" ); - goto ERREUR; - } - - /* sous element Direct_Location_Model */ - - cr = cai_WriteOpenTagXML ( des , "Direct_Location_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Direct_Location_Model" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element lc_List */ -/*****************************************************************************/ - - /* sous element lc_List */ - - cr = cai_WriteOpenTagXML ( des , "lc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc_List" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc" ); - goto ERREUR; - } - - /* Fermeture de l'element lc_List */ - - cr = cai_WriteCloseTagXML ( des , "lc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc_List" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element pc_List */ -/*****************************************************************************/ - - /* sous element pc_List */ - - cr = cai_WriteOpenTagXML ( des , "pc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc_List" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc" ); - goto ERREUR; - } - - /* Fermeture de l'element pc_List */ - - cr = cai_WriteCloseTagXML ( des , "pc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc_List" ); - goto ERREUR; - } - - /* Fermeture de l'element Direct_Location_Model */ - - cr = cai_WriteCloseTagXML ( des , "Direct_Location_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Direct_Location_Model" ); - goto ERREUR; - } - - /* sous element Reverse_Location_Model */ - - cr = cai_WriteOpenTagXML ( des , "Reverse_Location_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Reverse_Location_Model" ); - goto ERREUR; - } - - /* sous element lc_List */ - - cr = cai_WriteOpenTagXML ( des , "lc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc_List" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc" ); - goto ERREUR; - } - - /* sous element lc */ - - cr = cai_WriteElementXML ( des , "lc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc" ); - goto ERREUR; - } - - /* Fermeture de l'element lc_List */ - - cr = cai_WriteCloseTagXML ( des , "lc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element lc_List" ); - goto ERREUR; - } - - /* sous element pc_List */ - - cr = cai_WriteOpenTagXML ( des , "pc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc_List" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc" ); - goto ERREUR; - } - - /* sous element pc */ - - cr = cai_WriteElementXML ( des , "pc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc" ); - goto ERREUR; - } - - /* Fermeture de l'element pc_List */ - - cr = cai_WriteCloseTagXML ( des , "pc_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element pc_List" ); - goto ERREUR; - } - - /* Fermeture de l'element Reverse_Location_Model */ - - cr = cai_WriteCloseTagXML ( des , "Reverse_Location_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Reverse_Location_Model" ); - goto ERREUR; - } - - /* Fermeture de l'element Simplified_Location_Model */ - - cr = cai_WriteCloseTagXML ( des , "Simplified_Location_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Simplified_Location_Model" ); - goto ERREUR; - } - - /* Fermeture de l'element Geoposition */ - - cr = cai_WriteCloseTagXML ( des , "Geoposition" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Geoposition" ); - goto ERREUR; - } - - /* sous element Production */ - - cr = cai_WriteOpenTagXML ( des , "Production" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Production" ); - goto ERREUR; - } - - /* sous element DATASET_PRODUCER_NAME */ - - cr = cai_WriteElementXML ( des , "DATASET_PRODUCER_NAME" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DATASET_PRODUCER_NAME" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout attribut href="http://www.spotimage.fr" */ -/****************************************************************************/ - - /* sous element DATASET_PRODUCER_URL */ - type=1; - cr = cai_WriteElementXMLWithAttribute ( des , "DATASET_PRODUCER_URL" , "" , - "href" , "http://www.spotimage.fr" ,type); - - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DATASET_PRODUCER_URL" ); - goto ERREUR; - } - - /* sous element DATASET_PRODUCTION_DATE */ - - cr = cai_WriteElementXML ( des , "DATASET_PRODUCTION_DATE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DATASET_PRODUCTION_DATE" ); - goto ERREUR; - } - - /* sous element PRODUCT_TYPE */ - - cr = cai_WriteElementXML ( des , "PRODUCT_TYPE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PRODUCT_TYPE" ); - goto ERREUR; - } - - /* sous element PRODUCT_INFO */ - - cr = cai_WriteElementXML ( des , "PRODUCT_INFO" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PRODUCT_INFO" ); - goto ERREUR; - } - - /* sous element Production_Facility */ - - cr = cai_WriteOpenTagXML ( des , "Production_Facility" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Production_Facility" ); - goto ERREUR; - } - - /* sous element SOFTWARE_NAME */ - - cr = cai_WriteElementXML ( des , "SOFTWARE_NAME" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SOFTWARE_NAME" ); - goto ERREUR; - } - - /* sous element SOFTWARE_VERSION */ - - cr = cai_WriteElementXML ( des , "SOFTWARE_VERSION" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SOFTWARE_VERSION" ); - goto ERREUR; - } - - /* sous element PROCESSING_CENTER */ - - cr = cai_WriteElementXML ( des , "PROCESSING_CENTER" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PROCESSING_CENTER" ); - goto ERREUR; - } - - /* Fermeture de l'element Production_Facility */ - - cr = cai_WriteCloseTagXML ( des , "Production_Facility" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Production_Facility" ); - goto ERREUR; - } - - /* Fermeture de l'element Production */ - - cr = cai_WriteCloseTagXML ( des , "Production" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Production" ); - goto ERREUR; - } - - /* sous element Raster_Dimensions */ - - cr = cai_WriteOpenTagXML ( des , "Raster_Dimensions" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Raster_Dimension" ); - goto ERREUR; - } - - /* sous element NCOLS */ - - sprintf ( valeur , "%d" , nbcol ); - cr = cai_WriteElementXML ( des , "NCOLS" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element NCOLS" ); - goto ERREUR; - } - - /* sous element NROWS */ - - sprintf ( valeur , "%d" , nblig ); - cr = cai_WriteElementXML ( des , "NROWS" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element NROWS" ); - goto ERREUR; - } - - /* sous element NBANDS */ - - sprintf ( valeur , "%d" , nbcan ); - cr = cai_WriteElementXML ( des , "NBANDS" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element NBANDS" ); - goto ERREUR; - } - - /* Fermeture de l'element Raster_Dimensions */ - - cr = cai_WriteCloseTagXML ( des , "Raster_Dimensions" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Raster_Dimensions" ); - goto ERREUR; - } - - /* sous element Raster_Encoding */ - - cr = cai_WriteOpenTagXML ( des , "Raster_Encoding" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Raster_Encoding" ); - goto ERREUR; - } - - /* sous element NBITS */ - - sprintf ( valeur , "%d" , nboct*8 ); - cr = cai_WriteElementXML ( des , "NBITS" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element NBITS" ); - goto ERREUR; - } - -/****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element DATA_TYPE */ -/****************************************************************************/ - - /* sous element DATA_TYPE */ - - cr = cai_WriteElementXML ( des , "DATA_TYPE" , "UNSIGNED" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element DATA_TYPE" ); - goto ERREUR; - } - - /* sous element BYTEORDER */ -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : FA : erreur initialisation BYTEORDER en creation */ -/*****************************************************************************/ - - /* Initialisation par defaut */ - if (strcmp(type_machine,"BE")==0) - cr = cai_WriteElementXML ( des , "BYTEORDER" , "M" ); - else - cr = cai_WriteElementXML ( des , "BYTEORDER" , "I" ); - - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element BYTEORDER" ); - goto ERREUR; - } - - /* sous element BANDS_LAYOUT */ - - if ( typeimg == 3 ) - sprintf ( valeur , "BIL" ); - else - sprintf ( valeur , "" ); - cr = cai_WriteElementXML ( des , "BANDS_LAYOUT" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element BANDS_LAYOUT" ); - goto ERREUR; - } - - /* Fermeture de l'element Raster_Encoding */ - - cr = cai_WriteCloseTagXML ( des , "Raster_Encoding" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Raster_Encoding" ); - goto ERREUR; - } - - /* sous element Data_Processing */ - - cr = cai_WriteOpenTagXML ( des , "Data_Processing" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Data_Processing" ); - goto ERREUR; - } - - /* sous element PROCESSING_LEVEL */ - - cr = cai_WriteElementXML ( des , "PROCESSING_LEVEL" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PROCESSING_LEVEL" ); - goto ERREUR; - } - - /* sous element GEOMETRIC_PROCESSING */ - - cr = cai_WriteElementXML ( des , "GEOMETRIC_PROCESSING" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element GEOMETRIC_PROCESSING" ); - goto ERREUR; - } - - /* sous element Processing_Options */ - - cr = cai_WriteOpenTagXML ( des , "Processing_Options" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Processing_Options" ); - goto ERREUR; - } - - /* sous element Dynamic_Stretch */ - - cr = cai_WriteOpenTagXML ( des , "Dynamic_Stretch" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Dynamic_Stretch" ); - goto ERREUR; - } - - for ( i = 0 ; i < nbcan ; i++ ) - { - /* sous element Thresholds */ - - cr = cai_WriteOpenTagXML ( des , "Thresholds" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Thresholds" ); - goto ERREUR; - } - - /* sous element BAND_INDEX */ - - sprintf ( valeur , "%d" , (i+1) ); - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element BAND_INDEX" ); - goto ERREUR; - } - - /* sous element LOW_THRESHOLD */ - - cr = cai_WriteElementXML ( des , "LOW_THRESHOLD" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element LOW_THRESHOLD" ); - goto ERREUR; - } - - /* sous element HIGH_THRESHOLD */ - - cr = cai_WriteElementXML ( des , "HIGH_THRESHOLD" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element HIGH_THRESHOLD" ); - goto ERREUR; - } - - /* Fermeture de l'element Thresholds */ - - cr = cai_WriteCloseTagXML ( des , "Thresholds" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Thresholds" ); - goto ERREUR; - } - } - /* Fermeture de l'element Dynamic_Stretch */ - - cr = cai_WriteCloseTagXML ( des , "Dynamic_Stretch" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Dynamic_Stretch" ); - goto ERREUR; - } - - /* Fermeture de l'element Processing_Options */ - - cr = cai_WriteCloseTagXML ( des , "Processing_Options" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Processing_Options" ); - goto ERREUR; - } - - /* Fermeture de l'element Data_Processing */ - - cr = cai_WriteCloseTagXML ( des , "Data_Processing" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Data_Processing" ); - goto ERREUR; - } - - /* sous element Data_Access */ - - cr = cai_WriteOpenTagXML ( des , "Data_Access" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Data_Access" ); - goto ERREUR; - } - - /* sous element DATA_FILE_ORGANISATION */ - - if ( typeimg == 3 ) - sprintf ( valeur , "BAND_COMPOSITE" ); - else - sprintf ( valeur , "" ); - - cr = cai_WriteElementXML ( des , "DATA_FILE_ORGANISATION" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DATA_FILE_ORGANISATION" ); - goto ERREUR; - } - - /* sous element DATA_FILE_FORMAT */ - - if ( typeimg == 3 ) - sprintf ( valeur , "RAW" ); - else - sprintf ( valeur , "TIFF" ); - - cr = cai_WriteElementXML ( des , "DATA_FILE_FORMAT" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DATA_FILE_FORMAT" ); - goto ERREUR; - } - - /* Fermeture de l'element Data_Access */ - - cr = cai_WriteCloseTagXML ( des , "Data_Access" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Data_Access" ); - goto ERREUR; - } - - /* sous element Image_Display */ - - cr = cai_WriteOpenTagXML ( des , "Image_Display" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Image_Display" ); - goto ERREUR; - } - - /* sous element Band_Display_Order */ - - cr = cai_WriteOpenTagXML ( des , "Band_Display_Order" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Band_Display_Order" ); - goto ERREUR; - } - - /* sous element RED_CHANNEL */ - - cr = cai_WriteElementXML ( des , "RED_CHANNEL" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element RED_CHANNEL" ); - goto ERREUR; - } - /* sous element GREEN_CHANNEL */ - - cr = cai_WriteElementXML ( des , "GREEN_CHANNEL" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element GREEN_CHANNEL" ); - goto ERREUR; - } - /* sous element BLUE_CHANNEL */ - - cr = cai_WriteElementXML ( des , "BLUE_CHANNEL" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element BLUE_CHANNEL" ); - goto ERREUR; - } - - /* Fermeture de l'element Band_Display_Order */ - - cr = cai_WriteCloseTagXML ( des , "Band_Display_Order" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Band_Display_Order" ); - goto ERREUR; - } - - /* sous element Special_Value */ - - cr = cai_WriteOpenTagXML ( des , "Special_Value" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Special_Value" ); - goto ERREUR; - } - - /* sous element SPECIAL_VALUE_INDEX */ - - cr = cai_WriteElementXML ( des , "SPECIAL_VALUE_INDEX" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SPECIAL_VALUE_INDEX" ); - goto ERREUR; - } - - /* sous element SPECIAL_VALUE_TEXT */ - - cr = cai_WriteElementXML ( des , "SPECIAL_VALUE_TEXT" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SPECIAL_VALUE_TEXT" ); - goto ERREUR; - } - - /* sous element Special_Value_Color */ - - cr = cai_WriteOpenTagXML ( des , "Special_Value_Color" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Special_Value_Color" ); - goto ERREUR; - } - - /* sous element RED_LEVEL */ - - cr = cai_WriteElementXML ( des , "RED_LEVEL" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element RED_LEVEL" ); - goto ERREUR; - } - - /* sous element GREEN_LEVEL */ - - cr = cai_WriteElementXML ( des , "GREEN_LEVEL" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element GREEN_LEVEL" ); - goto ERREUR; - } - - /* sous element BLUE_LEVEL */ - - cr = cai_WriteElementXML ( des , "BLUE_LEVEL" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element BLUE_LEVEL" ); - goto ERREUR; - } - - if (nbcan == 4) - { - /* sous element ALPHA_LEVEL */ - - cr = cai_WriteElementXML ( des , "ALPHA_LEVEL" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element ALPHA_LEVEL" ); - goto ERREUR; - } - } - - /* Fermeture de l'element Special_Value_Color */ - - cr = cai_WriteCloseTagXML ( des , "Special_Value_Color" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Special_Value_Color" ); - goto ERREUR; - } - - /* Fermeture de l'element Special_Value */ - - cr = cai_WriteCloseTagXML ( des , "Special_Value" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Special_Value" ); - goto ERREUR; - } - - /* sous element Special_Value */ - - cr = cai_WriteOpenTagXML ( des , "Special_Value" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Special_Value" ); - goto ERREUR; - } - - /* sous element SPECIAL_VALUE_INDEX */ - - cr = cai_WriteElementXML ( des , "SPECIAL_VALUE_INDEX" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SPECIAL_VALUE_INDEX" ); - goto ERREUR; - } - - /* sous element SPECIAL_VALUE_TEXT */ - - cr = cai_WriteElementXML ( des , "SPECIAL_VALUE_TEXT" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SPECIAL_VALUE_TEXT" ); - goto ERREUR; - } - - /* sous element Special_Value_Color */ - - cr = cai_WriteOpenTagXML ( des , "Special_Value_Color" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Special_Value_Color" ); - goto ERREUR; - } - - /* sous element RED_LEVEL */ - - cr = cai_WriteElementXML ( des , "RED_LEVEL" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element RED_LEVEL" ); - goto ERREUR; - } - - /* sous element GREEN_LEVEL */ - - cr = cai_WriteElementXML ( des , "GREEN_LEVEL" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element GREEN_LEVEL" ); - goto ERREUR; - } - - /* sous element BLUE_LEVEL */ - - cr = cai_WriteElementXML ( des , "BLUE_LEVEL" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element BLUE_LEVEL" ); - goto ERREUR; - } - - if (nbcan == 4) - { - /* sous element ALPHA_LEVEL */ - - cr = cai_WriteElementXML ( des , "ALPHA_LEVEL" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element ALPHA_LEVEL" ); - goto ERREUR; - } - } - - /* Fermeture de l'element Special_Value_Color */ - - cr = cai_WriteCloseTagXML ( des , "Special_Value_Color" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Special_Value_Color" ); - goto ERREUR; - } - - /* Fermeture de l'element Special_Value */ - - cr = cai_WriteCloseTagXML ( des , "Special_Value" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Special_Value" ); - goto ERREUR; - } - - /* Fermeture de l'element Image_Display */ - - cr = cai_WriteCloseTagXML ( des , "Image_Display" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Image_Display" ); - goto ERREUR; - } - - /* sous element Image_Interpretation */ - - cr = cai_WriteOpenTagXML ( des , "Image_Interpretation" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Image_Interpretation" ); - goto ERREUR; - } - - for ( i = 0; i < nbcan ; i++ ) - { - /* sous element Spectral_Band_Info */ - - cr = cai_WriteOpenTagXML ( des , "Spectral_Band_Info" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Spectral_Band_Info" ); - goto ERREUR; - } - - /* sous element BAND_INDEX */ - - sprintf ( valeur , "%d" , (i+1) ); - - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element BAND_INDEX" ); - goto ERREUR; - } - -/******************************************************************************/ -/* MOD : VERSION : 4.7 : DM : remplacement de BAND par BAND_DESCRIPTION */ -/******************************************************************************/ - - /* sous element BAND_DESCRIPTION */ - - cr = cai_WriteElementXML ( des , "BAND_DESCRIPTION" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element BAND" ); - goto ERREUR; - } - - /* sous element PHYSICAL_CALIBRATION_DATE */ - - cr = cai_WriteElementXML ( des , "PHYSICAL_CALIBRATION_DATE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PHYSICAL_CALIBRATION_DATE" ); - goto ERREUR; - } - - /* sous element PHYSICAL_BIAIS */ - - cr = cai_WriteElementXML ( des , "PHYSICAL_BIAIS" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PHYSICAL_BIAIS" ); - goto ERREUR; - } - - /* sous element PHYSICAL_GAIN */ - - cr = cai_WriteElementXML ( des , "PHYSICAL_GAIN" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PHYSICAL_GAIN" ); - goto ERREUR; - } - - /* sous element PHYSICAL_UNIT */ - - cr = cai_WriteElementXML ( des , "PHYSICAL_UNIT" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PHYSICAL_UNIT" ); - goto ERREUR; - } - - /* Fermeture de l'element Spectral_Band_Info */ - - cr = cai_WriteCloseTagXML ( des , "Spectral_Band_Info" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Spectral_Band_Info" ); - goto ERREUR; - } - - } - /* Fermeture de l'element Image_Interpretation */ - - cr = cai_WriteCloseTagXML ( des , "Image_Interpretation" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Image_Interpretation" ); - goto ERREUR; - } - - /* sous element Data_Strip */ - - cr = cai_WriteOpenTagXML ( des , "Data_Strip" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Data_Strip" ); - goto ERREUR; - } - - /* sous element Satellite_Time */ - - cr = cai_WriteOpenTagXML ( des , "Satellite_Time" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Satellite_Time" ); - goto ERREUR; - } - - /* sous element UT_DATE */ - - cr = cai_WriteElementXML ( des , "UT_DATE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element UT_DATE" ); - goto ERREUR; - } - - /* sous element CLOCK_VALUE */ - - cr = cai_WriteElementXML ( des , "CLOCK_VALUE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element CLOCK_VALUE" ); - goto ERREUR; - } - - /* sous element CLOCK_PERIOD */ - - cr = cai_WriteElementXML ( des , "CLOCK_PERIOD" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element CLOCK_PERIOD" ); - goto ERREUR; - } - - /* sous element BOARD_TIME */ - - cr = cai_WriteElementXML ( des , "BOARD_TIME" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element BOARD_TIME" ); - goto ERREUR; - } - - /* Fermeture de l'element Satellite_Time */ - - cr = cai_WriteCloseTagXML ( des , "Satellite_Time" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Satellite_Time" ); - goto ERREUR; - } - - /* sous element Ephemeris */ - - cr = cai_WriteOpenTagXML ( des , "Ephemeris" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Ephemeris" ); - goto ERREUR; - } - - /* sous element SATELLITE_ALTITUDE */ - - cr = cai_WriteElementXML ( des , "SATELLITE_ALTITUDE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SATELLITE_ALTITUDE" ); - goto ERREUR; - } - - /* sous element NADIR_LAT */ - - cr = cai_WriteElementXML ( des , "NADIR_LAT" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element NADIR_LAT" ); - goto ERREUR; - } - - /* sous element NADIR_LON */ - - cr = cai_WriteElementXML ( des , "NADIR_LON" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element NADIR_LON" ); - goto ERREUR; - } - - /* sous element Points */ - - cr = cai_WriteOpenTagXML ( des , "Points" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Points" ); - goto ERREUR; - } - - for ( i = 0; i < 8 ; i++ ) - { - /* sous element Point */ - - cr = cai_WriteOpenTagXML ( des , "Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Point" ); - goto ERREUR; - } - - /* sous element Location */ - - cr = cai_WriteOpenTagXML ( des , "Location" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Location" ); - goto ERREUR; - } - - /* sous element X */ - - cr = cai_WriteElementXML ( des , "X" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element X" ); - goto ERREUR; - } - - /* sous element Y */ - - cr = cai_WriteElementXML ( des , "Y" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Y" ); - goto ERREUR; - } - - /* sous element Z */ - - cr = cai_WriteElementXML ( des , "Z" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Z" ); - goto ERREUR; - } - - /* Fermeture de l'element Location */ - - cr = cai_WriteCloseTagXML ( des , "Location" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Location" ); - goto ERREUR; - } - - /* sous element Velocity */ - - cr = cai_WriteOpenTagXML ( des , "Velocity" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Velocity" ); - goto ERREUR; - } - - /* sous element X */ - - cr = cai_WriteElementXML ( des , "X" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element X" ); - goto ERREUR; - } - - /* sous element Y */ - - cr = cai_WriteElementXML ( des , "Y" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Y" ); - goto ERREUR; - } - - /* sous element Z */ - - cr = cai_WriteElementXML ( des , "Z" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Z" ); - goto ERREUR; - } - - /* Fermeture de l'element Velocity */ - - cr = cai_WriteCloseTagXML ( des , "Velocity" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Velocity" ); - goto ERREUR; - } - - /* sous element TIME */ - - cr = cai_WriteElementXML ( des , "TIME" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element TIME" ); - goto ERREUR; - } - - /* Fermeture de l'element Point */ - - cr = cai_WriteCloseTagXML ( des , "Point" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Point" ); - goto ERREUR; - } - } - - /* Fermeture de l'element Points */ - - cr = cai_WriteCloseTagXML ( des , "Points" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Points" ); - goto ERREUR; - } - - /* sous element DORIS_USED */ - - cr = cai_WriteElementXML ( des , "DORIS_USED" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DORIS_USED" ); - goto ERREUR; - } - - /* Fermeture de l'element Ephemeris */ - - cr = cai_WriteCloseTagXML ( des , "Ephemeris" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Ephemeris" ); - goto ERREUR; - } - - /* sous element Sensor_Configuration */ - - cr = cai_WriteOpenTagXML ( des , "Sensor_Configuration" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Sensor_Configuration" ); - goto ERREUR; - } - - /* sous element Time_Stamp */ - - cr = cai_WriteOpenTagXML ( des , "Time_Stamp" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Time_Stamp" ); - goto ERREUR; - } - - /* sous element LINE_PERIOD */ - - cr = cai_WriteElementXML ( des , "LINE_PERIOD" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element LINE_PERIOD" ); - goto ERREUR; - } - - /* sous element SCENE_CENTER_TIME */ - - cr = cai_WriteElementXML ( des , "SCENE_CENTER_TIME" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SCENE_CENTER_TIME" ); - goto ERREUR; - } - - /* sous element SCENE_CENTER_LINE */ - - cr = cai_WriteElementXML ( des , "SCENE_CENTER_LINE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SCENE_CENTER_LINE" ); - goto ERREUR; - } - - /* sous element SCENE_CENTER_COL */ - - cr = cai_WriteElementXML ( des , "SCENE_CENTER_COL" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SCENE_CENTER_COL" ); - goto ERREUR; - } - - /* Fermeture de l'element Time_Stamp */ - - cr = cai_WriteCloseTagXML ( des , "Time_Stamp" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Time_Stamp" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element Instrument_look_Angles_List */ -/*****************************************************************************/ - - /* sous element Instrument_Look_Angles_List */ - - cr = cai_WriteOpenTagXML ( des , "Instrument_Look_Angles_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Instrument_Look_Angles_List" ); - goto ERREUR; - } - - for ( i = 0 ; i < nbcan ; i++ ) - { - /* sous element Instrument_Look_Angles */ - - cr = cai_WriteOpenTagXML ( des , "Instrument_Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Instrument_Look_Angles" ); - goto ERREUR; - } - - /* sous element VALIDITY_DATE */ - - cr = cai_WriteElementXML ( des , "VALIDITY_DATE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element VALIDITY_DATE" ); - goto ERREUR; - } - - /* sous element BAND_INDEX */ - - sprintf ( valeur , "%d" , (i+1) ); - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element BAND_INDEX" ); - goto ERREUR; - } - -/*****************************************************************************/ -/* MOD : VERSION : 4.7 : DM : Ajout de l'element Look_Angles_List */ -/*****************************************************************************/ - - /* sous element Look_Angles_List */ - - cr = cai_WriteOpenTagXML ( des , "Look_Angles_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture element Look_Angles_List" ); - goto ERREUR; - } - - /* sous element Look_Angles */ - - cr = cai_WriteOpenTagXML ( des , "Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Look_Angles" ); - goto ERREUR; - } - - /* sous element DETECTOR_ID */ - - cr = cai_WriteElementXML ( des , "DETECTOR_ID" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DETECTOR_ID" ); - goto ERREUR; - } - - /* sous element PSI_X */ - - cr = cai_WriteElementXML ( des , "PSI_X" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PSI_X" ); - goto ERREUR; - } - - /* sous element PSI_Y */ - - cr = cai_WriteElementXML ( des , "PSI_Y" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PSI_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Look_Angles */ - - cr = cai_WriteCloseTagXML ( des , "Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Look_Angles" ); - goto ERREUR; - } - - /* sous element Look_Angles */ - - cr = cai_WriteOpenTagXML ( des , "Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Look_Angles" ); - goto ERREUR; - } - - /* sous element DETECTOR_ID */ - - cr = cai_WriteElementXML ( des , "DETECTOR_ID" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element DETECTOR_ID" ); - goto ERREUR; - } - - /* sous element PSI_X */ - - cr = cai_WriteElementXML ( des , "PSI_X" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PSI_X" ); - goto ERREUR; - } - - /* sous element PSI_Y */ - - cr = cai_WriteElementXML ( des , "PSI_Y" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element PSI_Y" ); - goto ERREUR; - } - - /* Fermeture de l'element Look_Angles */ - - cr = cai_WriteCloseTagXML ( des , "Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Look_Angles" ); - goto ERREUR; - } - - /* Fermeture de l'element Look_Angles_List */ - - cr = cai_WriteCloseTagXML ( des , "Look_Angles_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Look_Angles_List" ); - goto ERREUR; - } - - /* Fermeture de l'element Instrument_Look_Angles */ - - cr = cai_WriteCloseTagXML ( des , "Instrument_Look_Angles" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Instrument_Look_Angles" ); - goto ERREUR; - } - } - - /* Fermeture de l'element Instrument_Look_Angles_List */ - - cr = cai_WriteCloseTagXML ( des , "Instrument_Look_Angles_List" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Instrument_Look_Angles_List" ); - goto ERREUR; - } - - /* Fermeture de l'element Sensor_Configuration */ - - cr = cai_WriteCloseTagXML ( des , "Sensor_Configuration" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Sensor_Configuration" ); - goto ERREUR; - } - - /* sous element Frame_Counters */ - - cr = cai_WriteOpenTagXML ( des , "Frame_Counters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Frame_Counters" ); - goto ERREUR; - } - - /* sous element SEGMENT_START */ - - cr = cai_WriteElementXML ( des , "SEGMENT_START" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SEGMENT_START" ); - goto ERREUR; - } - - /* sous element SCENE_START */ - - cr = cai_WriteElementXML ( des , "SCENE_START" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SCENE_START" ); - goto ERREUR; - } - - /* sous element SEGMENT_END */ - - cr = cai_WriteElementXML ( des , "SEGMENT_END" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SEGMENT_END" ); - goto ERREUR; - } - - /* Fermeture de l'element Frame_Counters */ - - cr = cai_WriteCloseTagXML ( des , "Frame_Counters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Frame_Counters" ); - goto ERREUR; - } - - /* sous element Data_Strip_Coordinates */ - - cr = cai_WriteOpenTagXML ( des , "Data_Strip_Coordinates" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Data_Strip_Coordinates" ); - goto ERREUR; - } - - /* sous element FIRST_PIXEL_RAW */ - - cr = cai_WriteElementXML ( des , "FIRST_PIXEL_RAW" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element FIRST_PIXEL_RAW" ); - goto ERREUR; - } - - /* sous element FIRST_LINE_RAW */ - - cr = cai_WriteElementXML ( des , "FIRST_LINE_RAW" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element FIRST_LINE_RAW" ); - goto ERREUR; - } - - /* sous element FIRST_PIXEL_1B */ - - cr = cai_WriteElementXML ( des , "FIRST_PIXEL_1B" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element FIRST_PIXEL_1B" ); - goto ERREUR; - } - - /* sous element FIRST_LINE_1B */ - - cr = cai_WriteElementXML ( des , "FIRST_LINE_1B" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element FIRST_LINE_1B" ); - goto ERREUR; - } - - /* Fermeture de l'element Data_Strip_Coordinates */ - - cr = cai_WriteCloseTagXML ( des , "Data_Strip_Coordinates" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Data_Strip_Coordinates" ); - goto ERREUR; - } - - /* sous element Models */ - - cr = cai_WriteOpenTagXML ( des , "Models" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Models" ); - goto ERREUR; - } - - /* sous element OneB_Model */ - - cr = cai_WriteOpenTagXML ( des , "OneB_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element OneB_Model" ); - goto ERREUR; - } - - /* sous element Coordinate_Normalization */ - - cr = cai_WriteOpenTagXML ( des , "Coordinate_Normalization" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Coordinate_Normalization" ); - goto ERREUR; - } - - /* sous element LINES_I_M */ - - cr = cai_WriteElementXML ( des , "LINES_I_M" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element LINES_I_M" ); - goto ERREUR; - } - - /* sous element LINES_DELTA_I */ - - cr = cai_WriteElementXML ( des , "LINES_DELTA_I" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element LINES_DELTA_I" ); - goto ERREUR; - } - - /* sous element COLUMNS_J_M */ - - cr = cai_WriteElementXML ( des , "COLUMNS_J_M" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element COLUMNS_J_M" ); - goto ERREUR; - } - - /* sous element COLUMNS_DELTA_J */ - - cr = cai_WriteElementXML ( des , "COLUMNS_DELTA_J" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element COLUMNS_DELTA_J" ); - goto ERREUR; - } - - /* sous element LINES_L_M */ - - cr = cai_WriteElementXML ( des , "LINES_L_M" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element LINES_L_M" ); - goto ERREUR; - } - - /* sous element LINES_DELTA_L */ - - cr = cai_WriteElementXML ( des , "LINES_DELTA_L" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element LINES_DELTA_L" ); - goto ERREUR; - } - - /* sous element COLUMNS_P_M */ - - cr = cai_WriteElementXML ( des , "COLUMNS_P_M" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element COLUMNS_P_M" ); - goto ERREUR; - } - - /* sous element COLUMNS_DELTA_P */ - - cr = cai_WriteElementXML ( des , "COLUMNS_DELTA_P" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element COLUMNS_DELTA_P" ); - goto ERREUR; - } - - /* Fermeture de l'element Coordinate_Normalization */ - - cr = cai_WriteCloseTagXML ( des , "Coordinate_Normalization" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Coordinate_Normalization" ); - goto ERREUR; - } - - - /* sous element Direct_OneB_Model */ - - cr = cai_WriteOpenTagXML ( des , "Direct_OneB_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Direct_OneB_Model" ); - goto ERREUR; - } - - /* sous element I */ - - cr = cai_WriteOpenTagXML ( des , "I" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element I" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* Fermeture de l'element I */ - - cr = cai_WriteCloseTagXML ( des , "I" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element I" ); - goto ERREUR; - } - - /* sous element J */ - - cr = cai_WriteOpenTagXML ( des , "J" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element J" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* Fermeture de l'element J */ - - cr = cai_WriteCloseTagXML ( des , "J" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element J" ); - goto ERREUR; - } - - /* Fermeture de l'element Direct_OneB_Model */ - - cr = cai_WriteCloseTagXML ( des , "Direct_OneB_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Direct_OneB_Model" ); - goto ERREUR; - } - - /* sous element Reverse_OneB_Model */ - - cr = cai_WriteOpenTagXML ( des , "Reverse_OneB_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Reverse_OneB_Model" ); - goto ERREUR; - } - - /* sous element L */ - - cr = cai_WriteOpenTagXML ( des , "L" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element L" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* Fermeture de l'element L */ - - cr = cai_WriteCloseTagXML ( des , "L" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element L" ); - goto ERREUR; - } - - /* sous element P */ - - cr = cai_WriteOpenTagXML ( des , "P" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element P" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* Fermeture de l'element P */ - - cr = cai_WriteCloseTagXML ( des , "P" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element P" ); - goto ERREUR; - } - - /* Fermeture de l'element Reverse_OneB_Model */ - - cr = cai_WriteCloseTagXML ( des , "Reverse_OneB_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Reverse_OneB_Model" ); - goto ERREUR; - } - - /* sous element A */ - - cr = cai_WriteOpenTagXML ( des , "A" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element A" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* Fermeture de l'element A */ - - cr = cai_WriteCloseTagXML ( des , "A" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element A" ); - goto ERREUR; - } - - /* sous element B */ - - cr = cai_WriteOpenTagXML ( des , "B" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element B" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* sous element c */ - - cr = cai_WriteElementXML ( des , "c" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element c" ); - goto ERREUR; - } - - /* Fermeture de l'element B */ - - cr = cai_WriteCloseTagXML ( des , "B" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element B" ); - goto ERREUR; - } - - /* Fermeture de l'element OneB_Model */ - - cr = cai_WriteCloseTagXML ( des , "OneB_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element OneB_Model" ); - goto ERREUR; - } - - /* sous element Attitude_Model */ - - cr = cai_WriteOpenTagXML ( des , "Attitude_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Attitude_Model" ); - goto ERREUR; - } - - /* sous element D_L */ - - cr = cai_WriteOpenTagXML ( des , "D_L" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element D_L" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element abc" ); - goto ERREUR; - } - - /* Fermeture de l'element D_L */ - - cr = cai_WriteCloseTagXML ( des , "D_L" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element D_L" ); - goto ERREUR; - } - - /* sous element D_P */ - - cr = cai_WriteOpenTagXML ( des , "D_P" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element D_P" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element abc" ); - goto ERREUR; - } - - /* Fermeture de l'element D_P */ - - cr = cai_WriteCloseTagXML ( des , "D_P" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element D_P" ); - goto ERREUR; - } - - /* Fermeture de l'element Attitude_Model */ - - cr = cai_WriteCloseTagXML ( des , "Attitude_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Attitude_Model" ); - goto ERREUR; - } - - /* sous element SWIR_Registration_Model */ - - cr = cai_WriteOpenTagXML ( des , "SWIR_Registration_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SWIR_Registration_Model" ); - goto ERREUR; - } - - /* sous element D_L */ - - cr = cai_WriteOpenTagXML ( des , "D_L" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element D_L" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element abc" ); - goto ERREUR; - } - - /* Fermeture de l'element D_L */ - - cr = cai_WriteCloseTagXML ( des , "D_L" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element D_L" ); - goto ERREUR; - } - - /* sous element D_P */ - - cr = cai_WriteOpenTagXML ( des , "D_P" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element D_P" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element abc" ); - goto ERREUR; - } - - /* sous element abc */ - - cr = cai_WriteElementXML ( des , "abc" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element abc" ); - goto ERREUR; - } - - /* Fermeture de l'element D_P */ - - cr = cai_WriteCloseTagXML ( des , "D_P" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element D_P" ); - goto ERREUR; - } - - /* Fermeture de l'element SWIR_Registration_Model */ - - cr = cai_WriteCloseTagXML ( des , "SWIR_Registration_Model" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SWIR_Registration_Model" ); - goto ERREUR; - } - - /* Fermeture de l'element Models */ - - cr = cai_WriteCloseTagXML ( des , "Models" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Models" ); - goto ERREUR; - } - /* sous element Sensor_Calibration */ - - cr = cai_WriteOpenTagXML ( des , "Sensor_Calibration" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Sensor_Calibration" ); - goto ERREUR; - } - - /* sous element METHOD */ - - cr = cai_WriteElementXML ( des , "METHOD" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element METHOD" ); - goto ERREUR; - } - - /* sous element Calibration */ - - cr = cai_WriteOpenTagXML ( des , "Calibration" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Calibration" ); - goto ERREUR; - } - - for ( i = 0; i < nbcan ; i++ ) - { - /* sous element Band_Parameters */ - - cr = cai_WriteOpenTagXML ( des , "Band_Parameters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Band_Parameters" ); - goto ERREUR; - } - - /* sous element BAND_INDEX */ - sprintf ( valeur , "%d" , (i+1) ); - - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element BAND_INDEX" ); - goto ERREUR; - } - - /* Fermeture de l'element Band_Parameters */ - - cr = cai_WriteCloseTagXML ( des , "Band_Parameters" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Band_Parameters" ); - goto ERREUR; - } - } - /* Fermeture de l'element Calibration */ - - cr = cai_WriteCloseTagXML ( des , "Calibration" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Calibration" ); - goto ERREUR; - } - - /* sous element Spectral_Sensitivities */ - - cr = cai_WriteOpenTagXML ( des , "Spectral_Sensitivities" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Spectral_Sensitivities" ); - goto ERREUR; - } - - for ( i = 0; i < nbcan ; i++ ) - { - /* sous element Band_Spectral_Sensitivities */ - - cr = cai_WriteOpenTagXML ( des , "Band_Spectral_Sensitivities" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Band_Spectral_Sensitivities" ); - goto ERREUR; - } - - sprintf( valeur , "%d" , ( i+1 ) ); - /* sous element BAND_INDEX */ - - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element BAND_INDEX" ); - goto ERREUR; - } - - /* sous element FIRST_WAVELENGTH_VALUE */ - - cr = cai_WriteElementXML ( des , "FIRST_WAVELENGTH_VALUE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element FIRST_WAVELENGTH_VALUE" ); - goto ERREUR; - } - - /* sous element WAVELENGTH_STEP */ - - cr = cai_WriteElementXML ( des , "WAVELENGTH_STEP" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element WAVELENGTH_STEP" ); - goto ERREUR; - } - - /* sous element CALIBRATION_DATE */ - - cr = cai_WriteElementXML ( des , "CALIBRATION_DATE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element CALIBRATION_DATE" ); - goto ERREUR; - } - - /* sous element Spectral_Sensitivity_Values */ - - cr = cai_WriteOpenTagXML ( des , "Spectral_Sensitivity_Values" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Spectral_Sensitivity_Values" ); - goto ERREUR; - } - - /* sous element SPECTRAL_SENSITIVITY_VALUE */ - - cr = cai_WriteElementXML ( des , "SPECTRAL_SENSITIVITY_VALUE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SPECTRAL_SENSITIVITY_VALUE" ); - goto ERREUR; - } - - /* Fermeture de l'element Spectral_Sensitivity_Values */ - - cr = cai_WriteCloseTagXML ( des , "Spectral_Sensitivity_Values" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Spectral_Sensitivity_Values" ); - goto ERREUR; - } - - /* Fermeture de l'element Band_Spectral_Sensitivities */ - - cr = cai_WriteCloseTagXML ( des , "Band_Spectral_Sensitivities" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Band_Spectral_Sensitivities" ); - goto ERREUR; - } - - } - - /* Fermeture de l'element Spectral_Sensitivities */ - - cr = cai_WriteCloseTagXML ( des , "Spectral_Sensitivities" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Spectral_Sensitivities" ); - goto ERREUR; - } - - /* sous element Solar_Irradiance */ - - cr = cai_WriteOpenTagXML ( des , "Solar_Irradiance" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Solar_Irradiance" ); - goto ERREUR; - } - - for ( i = 0; i < nbcan ; i++ ) - { - sprintf ( valeur , "%d" , ( i+1 ) ); - /* sous element Band_Solar_Irradiance */ - - cr = cai_WriteOpenTagXML ( des , "Band_Solar_Irradiance" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Band_Solar_Irradiance" ); - goto ERREUR; - } - - /* sous element BAND_INDEX */ - - cr = cai_WriteElementXML ( des , "BAND_INDEX" , valeur ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element BAND_INDEX" ); - goto ERREUR; - } - - /* sous element SOLAR_IRRADIANCE_VALUE */ - - cr = cai_WriteElementXML ( des , "SOLAR_IRRADIANCE_VALUE" , "" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element SOLAR_IRRADIANCE_VALUE" ); - goto ERREUR; - } - - /* Fermeture de l'element Band_Solar_Irradiance */ - - cr = cai_WriteCloseTagXML ( des , "Band_Solar_Irradiance" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Band_Solar_Irradiance" ); - goto ERREUR; - } - } - /* Fermeture de l'element Solar_Irradiance */ - - cr = cai_WriteCloseTagXML ( des , "Solar_Irradiance" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Solar_Irradiance" ); - goto ERREUR; - } - - /* Fermeture de l'element Sensor_Calibration */ - - cr = cai_WriteCloseTagXML ( des , "Sensor_Calibration" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Sensor_Calibration" ); - goto ERREUR; - } - - /* Fermeture de l'element Data_Strip */ - - cr = cai_WriteCloseTagXML ( des , "Data_Strip" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Data_Strip" ); - goto ERREUR; - } - - /* Fermeture de l'element Dimap_Document */ - - cr = cai_WriteCloseTagXML ( des , "Dimap_Document" ); - if ( cr == CAI_KO ) - { - sprintf ( CAI_ERREUR , "Erreur ecriture Element Dimap_document" ); - goto ERREUR; - } - - /* fermeture du fichier descripteur */ - - if (des!=NULL) fclose ( des ); - - return CAI_OK; - - ERREUR: - - return CAI_KO; - } -/* - Fin de l'operation cai_creat_leader_spot5 -*/ diff --git a/Utilities/CAI/cai_dll/src/cai_tiff.c b/Utilities/CAI/cai_dll/src/cai_tiff.c deleted file mode 100755 index 3162c7542c..0000000000 --- a/Utilities/CAI/cai_dll/src/cai_tiff.c +++ /dev/null @@ -1,1534 +0,0 @@ -/*****************************************************************************/ -/* */ -/* PROJET : COUCHE ACCES IMAGE */ -/* ------- */ -/* */ -/* MODULE : cai_tiff.c */ -/* ------- */ -/* */ -/* ROLE : Ce module rassemble toutes les fonctions d'acces aux images */ -/* ------- stockees au format tiff */ -/* */ -/* AUTEUR : R.CHAISEMARTIN (CISI) */ -/* ------- */ -/* */ -/* DATE DE CREATION : fevrier 1995 */ -/* ----------------- */ -/* */ -/* LANGAGE : C */ -/* -------- */ -/*****************************************************************************/ -/*****************************************************************************/ -/** **/ -/** CE MODULE A ETE DEVELOPPE EN UTILISANT LA BIBLIOTHEQUE **/ -/** D'ACCES AUX IMAGES TIFF DIPONIBLE EN FREE_WARE AVEC XV **/ -/** libtiff.a version 3.0 **/ -/** **/ -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* VERSION : V3.3 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/* MOD : VERSION : 3.3: DM : optimisation des acces */ -/*****************************************************************************/ -/* MOD : VERSION :4.1 :FA: Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 :FA:Verification que le nombre d'octets par pixel est */ -/* egal a 1 et le nombre de canaux est 1 ou 3. tiff est un format de */ -/* restitution */ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 : DM : modifications pour compatibilite HP64bits */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 :FA: Suppression de la contrainte sur le nb d'octets */ -/* par pixel et du nombre de canaux */ -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : DM : modification du nombre de lignes en ecriture */ -/* dans le TAG ROWPERSTRIP pour manipulation aussi bien pour chaque ligne, */ -/* tous les canaux qu pour chaque canal toutes les lignes */ -/*****************************************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 4.6 : FA : En ouverture en modification, ouverture en "a" */ -/* au lieu de "w" */ -/*****************************************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 4.9 : DM : Lecture d'une image sur 1 bit. Chaque bit est */ -/* expensé sur un octet avant d'être renvoyé à l'appelant */ -/*****************************************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : DM : A l'ouverture d'une image en lecture, renvoie */ -/* de COD_PIX à I4 ou R4 pour les images codees en I4 ou R4 */ -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : FA : Image 1bit :prise en compte de la lecture de */ -/* portion de lignes ou de sous-echantillonnage */ -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : FA : Image 1bit :prise en compte de la lecture de */ -/* l'image en entier */ -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : DM : Mise à jour du tag SAMPLEFORMAT lorsque */ -/* l'image est codée en reel et que l'utilisateur le precise dans le param */ -/* "label" */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte des I2,I4,UI2,UI4 et R8 */ -/* en lecture et ecriture */ -/*****************************************************************************/ -/*---------------------------------------------------------------------------*/ -/* Inclusion des fichiers STANDARDS (.h) */ -/*---------------------------------------------------------------------------*/ - - -# include <stdio.h> -# include <string.h> -# include <stdlib.h> -# include <unistd.h> -# include <sys/types.h> -#include <dirent.h> -# include <sys/stat.h> -# include <fcntl.h> - -#define _CAI_IMAGE -#define IN_CAI_TIFF - -# include "cai_image.h" - -/*----------------------------------------------------------------------------*/ -/* Variable pour la gestion en configuration */ -/*----------------------------------------------------------------------------*/ -static char *rcs_id="$Header: cai_tiff.c,v 1.11 01/05/31 10:47:19 cmf Exp $"; - - -extern char *getenv(); - -/*****************************************************************************/ -/*****************************************************************************/ -/* */ -/* Definition des OPERATIONS EXTERNES */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_liste_ima_tiff */ -/* ---------- */ -/* */ -/* ROLE : fonction de listage des images au format tiff */ -/* ------ */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : int cai_liste_ima_tiff (repert,tab_ima) */ -/* ----------------- */ -/* */ -/* repert (E) (char *) : repertoire a explorer */ -/* tab_ima (S) (char ***) : pointeur sur tableau des images listees*/ -/* alloue par la fonction,il doit etre */ -/* LIBERE PAR L'APPELANT */ -/* */ -/* cai_liste_ima_tiff (S) (int) : = -1 repertoire inexistant */ /* = > 0 nombre d'images listees */ -/* */ -/* VERSION : V2 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -long int cai_liste_ima_tiff (char *repert, - char ***tab_ima) - - -{ - FILE *fp; /* descripteur de fichier. retour fopen */ - - struct dirent *dp; /* structure resultat de la fonction readdir */ - - DIR *dirp; /* pointeur sur structure ouverture repertoire */ - char *pch0; /* pointeurs sur chaine de caracteres */ - unsigned short magic; /* nombre magique de reconnaissance tiff */ - char nomfic[1024]; /* nom du fichier dont on verifie s'il est tiff*/ - int nb_ima; /* nombre d'images tiff identifiees */ - int i; /* indice de boucle */ - char car; /* variable de travail */ - -/*........................................ - INITIALISATION et ouverture du repertoire choisi - .........................................*/ - nb_ima=0; - dirp=opendir(repert); - - if(dirp!=NULL) - { -/*...................................... - premiere passe pour comptabiliser les images du format donne - - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE tiff - lecture du nombre magique - ........................................*/ - - while((dp=readdir(dirp))!=NULL) - { - nomfic[0]='\0'; - sscanf(repert,"%s",nomfic); - strcat(nomfic,"/"); - strcat(nomfic,dp->d_name); - fp=fopen(nomfic,"r"); - if (fp != NULL) - { - fread(&magic,2,1,fp); - fclose(fp); - if ((magic == TIFF_BIGENDIAN)||(magic== TIFF_LITTLEENDIAN)) - { - nb_ima=nb_ima+1; - } - } - } - - (void)closedir(dirp); -/*..................................... - ALLOCATION DU TABLEAU CONTENANT LA LISTE DES IMAGES DU FORMAT BSQ - ......................................*/ - *tab_ima = (char **) calloc(nb_ima,sizeof(char *)); - for (i=0;i<nb_ima;i=i+1) - (*tab_ima)[i]=(char *)calloc(1,100); - -/*...................................... - - deuxieme passe pour constituer la liste des images du format donne - POUR CHAQUE FICHIER DU REPERTOIRE , - TEST POUR SAVOIR SI CE FICHIER EST UNE IMAGE tiff - lecture du nombre magique - si oui ,stockage dans la liste des images TIFF - ........................................*/ - nb_ima=0; - dirp=opendir(repert); - - while((dp=readdir(dirp))!=NULL) - { - - nomfic[0]='\0'; - sscanf(repert,"%s",nomfic); - strcat(nomfic,"/"); - strcat(nomfic,dp->d_name); - fp=fopen(nomfic,"r"); - - if (fp != NULL) - - { - - fread(&magic,2,1,fp); - fclose(fp); - if ((magic == TIFF_BIGENDIAN)||(magic== TIFF_LITTLEENDIAN)) - { - -/* suppression de l'extension */ - car='.'; - pch0=strrchr(dp->d_name,car); -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - if ((pch0 != NULL)&&((*(pch0+1)=='t')||(*(pch0+1)=='T'))) - { - *pch0 = '\0'; - strcpy((*tab_ima)[nb_ima],dp->d_name); - nb_ima=nb_ima+1; - } - } - } - } - - (void)closedir(dirp); - - } - else - { - /* Erreur:Repertoire inexistant */ - nb_ima=-1; - } - - return(nb_ima); - -} - -/* Fin de l'operation cai_liste_ima_tiff -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_lecture_tiff */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture d'une image au format tiff */ -/* ----- et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_lecture_tiff (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_lecture_tiff (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_lecture_tiff(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ - TIFF *tif; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret,icr; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - char Extension[6]; /* extension du fichier .tiff ou .tif */ - int i,Coher; /* indice */ - unsigned int imagelength; /* nombre de lignes de l'image */ - unsigned int imagewidth; /* nombre de colonnes de l'image */ - short samplesperpixel; /* nombre de canaux */ - short compression; /* indicateur de compression */ - short photo; /* indicateur de photometric interpretation */ - short bitspersample; /* nombre de bits par pixels */ - short sampleformat; /* type de codage du pixel */ - int Istile; /* indicateur de stockage en pave */ - int Mode; /* mode test existence d'un fichier */ - - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - iret=1; - Mode = F_OK; - icr= 0; - sprintf(Extension,".tiff"); - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); - -/*****************************************************************************/ -/* MOD : VERSION :4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoire dans cai_ouvre_lecture"); - } - else - { - -/*................................................. - Constitution du nom du fichier TIFF - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.tiff",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.tiff",nom_image); - } -/* test sur l'existence avec .tiff sinon .tif */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - icr = access(nom_fic,Mode); - if (icr !=0) - { - nom_fic[strlen(nom_fic)-1]='\0'; - Extension[4]='\0'; - icr = access(nom_fic,Mode); - if (icr !=0) - { - sprintf(Extension,".TIF"); - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s%s",repert,nom_image,Extension); - } - else - { - sprintf(nom_fic,"%s.%s",nom_image,Extension); - } - } - } - - -/*........................ - Ouverture du fichier entete - ..........................................*/ - tif = TIFFOpen(nom_fic,"r"); - if (tif==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier tiff"); - } - else - { -/*.......................................................... - verification si l'image n'est pas comprimee -.............................................................*/ - TIFFGetField(tif,TIFFTAG_COMPRESSION,&compression); - if (compression != COMPRESSION_NONE) - { - iret=0; - strcpy(CAI_ERREUR,"Le fichier tiff est comprime. Format non traite !"); - } - else - { - -/*.......................................................... - verification si le fichier n'est pas code en pave -.............................................................*/ - Istile=TIFFIsTiled(tif); - if (Istile!=0) - { - iret=0; - strcpy(CAI_ERREUR,"Le fichier tiff est en paves . Format non traite !"); - } - else - { -/*.................................... - recuperation du nombre de colonnes -............................................*/ - TIFFGetField(tif,TIFFTAG_IMAGEWIDTH,&imagewidth); - *nb_col=imagewidth; -/*.................................... - recuperation du nombre de lignes -............................................*/ - TIFFGetField(tif,TIFFTAG_IMAGELENGTH,&imagelength); - *nb_lig=imagelength; - -/*...................................... - recuperation du nombre de canaux -............................................*/ - TIFFGetFieldDefaulted(tif,TIFFTAG_SAMPLESPERPIXEL,&samplesperpixel); - *nb_can=samplesperpixel; -/*......................................... - recuperation du nombre d'octets par pixel - .................................................*/ -/* Nombre de bits par pixels */ -/*****************************/ - TIFFGetField(tif,TIFFTAG_BITSPERSAMPLE,&bitspersample); - if ((bitspersample %8)==0) - *nboct_pix=(int)(bitspersample/8); - else - *nboct_pix=(int)((bitspersample/8)+1); - image1->NB_BITS_PIX=bitspersample; - -/*......................................... - recuperation du type de codage - .................................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : DM : A l'ouverture d'une image en lecture, renvoie */ -/* de COD_PIX à I4 ou R4 pour les images codees en I4 ou R4 */ -/*****************************************************************************/ - TIFFGetField(tif,TIFFTAG_SAMPLEFORMAT,&sampleformat); - -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte des I2,I4,UI2,UI4 et R8 */ -/* en lecture et ecriture */ -/*****************************************************************************/ - Coher = 1; - if (*nboct_pix==1) - { - sprintf(image1->COD_PIX,"UOCT"); - if (sampleformat == SAMPLEFORMAT_INT) - sprintf(image1->COD_PIX,"OCT"); - else if (sampleformat != SAMPLEFORMAT_UINT) - Coher=0; - } - else if (*nboct_pix==2) - { - sprintf(image1->COD_PIX,"UI2"); - if (sampleformat == SAMPLEFORMAT_INT) - sprintf(image1->COD_PIX,"I2"); - else if (sampleformat != SAMPLEFORMAT_UINT) - Coher=0; - } - else if (*nboct_pix==4) - { - sprintf(image1->COD_PIX,"I4"); - if (sampleformat == SAMPLEFORMAT_IEEEFP) - sprintf(image1->COD_PIX,"R4"); - else if (sampleformat == SAMPLEFORMAT_UINT) - sprintf(image1->COD_PIX,"UI4"); - else if (sampleformat != SAMPLEFORMAT_INT) - Coher=0; - } - else if (*nboct_pix==8) - { - sprintf(image1->COD_PIX,"R8"); - if (sampleformat != SAMPLEFORMAT_IEEEFP) - Coher=0; - } - else - sprintf(image1->COD_PIX,"UND"); - -/*............................................*/ -/* Recuperation du type de codages des pixels */ -/*............................................*/ - TIFFGetField(tif,TIFFTAG_PLANARCONFIG,&photo); - -/*................................................... - recuperation de l'indice de photometric interpretation - ..............................................................*/ - TIFFGetField(tif,TIFFTAG_PHOTOMETRIC,&photo); - if ((photo<0)&&(photo>3)) - { - iret=0; - strcpy(CAI_ERREUR,"Photometric non connue . Format non traite !"); - } - - } - } - } - if (iret != 0) - { - -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - for (i=0;i<*nb_can;i=i+1) - { - sprintf(deb,"%s%s",nom_image,Extension); - deb=deb+100; - sprintf(deb1,"%s%s",nom_image,Extension); - deb1=deb1+100; - image1->POS_OCTET[i]=0; - image1->ACCES_CANAL_TIFF[i]=tif; - } - } - } - if (iret==0) - { - return (NULL); - } - else - { - return(image1); - } - -} - -/* - Fin de l'operation cai_ouvre_lecture_tiff -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_creation_tiff */ -/* ---------- */ -/* */ -/* ROLE : fonction de creation et d'ouverture en ecriture d'une image */ -/* ----- au format tiff et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_creation_tiff (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig, */ -/* label) */ -/* */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* nb_can (E) (int ) : nombre de canaux de l'image */ -/* nboct_pix (E) (int ) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (E) (int ) : nombre de lignes de l'image */ -/* nb_col (E) (int ) : nombre de colonnes de l'image */ -/* label (E) (char *) : commentaire lie a l'image */ -/* */ -/* cai_ouvre_creation_tiff (S) (CAI_IMAGE *) : =NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_IMAGE *cai_ouvre_creation_tiff(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig, - char *label) - -{ - TIFF *tif; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - char nom_fic[1024]; /* nom du fichier en-tete */ - int retour; /* retour de fonction */ - int i; /* indice */ - struct stat buf_stat; /* structure decrivant status de fichier */ - unsigned int imagelength; /* nombre de lignes de l'image */ - unsigned int imagewidth; /* nombre de colonnes de l'image */ - short samplesperpixel; /* nombre de canaux */ - short photo; /* indicateur de photometric interpretation */ - int rowsperstrip; /* taille totale de l'image en octets */ - short bitspersample; /* nombre de bits par pixels */ - short sampleformat; /* type de codage du pixel */ - int reconnaissance_type,Coher; - -/*****************************************************************************/ -/* MOD : VERSION : 4.3 :FA: Suppression de la contrainte sur le nb d'octets */ -/* par pixel et du nombre de canaux */ -/*****************************************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 4.2 :FA:Verification que le nombre d'octets par pixel est */ -/* egal a 1 et le nombre de canaux est 1 ou 3. tiff est un format de */ -/* restitution */ -/*****************************************************************************/ -/* Verification sur le nombre d'octets par pixel */ - - /* if (*nboct_pix !=1) - { - strcpy(CAI_ERREUR,"Erreur une image TIFF ne peut etre codee que sur un seul octet"); - goto ERREUR; - } -*/ -/* Verification sur le nombre de canaux */ -/* if ((*nb_can !=1)&&(*nb_can !=3)) - { - strcpy(CAI_ERREUR,"Erreur une image TIFF a 1 ou 3 canaux exclusivement"); - goto ERREUR; - } -*/ - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION :4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_creation"); - goto ERREUR; - } - -/*................................................. - Constitution du nom du fichier entete et verification qu'il - n'existe pas deja - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s.tif",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.tif",nom_image); - } - retour = stat ( nom_fic , &buf_stat ); - if ( retour == 0 ) - { - sprintf ( CAI_ERREUR , "L'image %s TIFF existe \n" , nom_image ); - goto ERREUR; - } - -/*************************************************/ -/* Ouverture du fichier */ -/*************************************************/ -tif = TIFFOpen ( nom_fic , "w"); -if ( tif == NULL ) -{ - sprintf ( CAI_ERREUR , "Erreur : ouverture fichier %s impossible \n" , - nom_fic ); - goto ERREUR ; -} -/*************************************************/ -/* Ecriture de l'enregistrement d'entete */ -/*************************************************/ -/* Nombre de colonnes */ -/**********************/ -imagewidth=(unsigned int)(*nb_col); -TIFFSetField(tif,TIFFTAG_IMAGEWIDTH,imagewidth); - -/* Nombre de lignes */ -/********************/ -imagelength=(unsigned int)(*nb_lig); -TIFFSetField(tif,TIFFTAG_IMAGELENGTH,imagelength); - -/*****************************************************************************/ -/* MOD : VERSION : 4.5 : DM : modification du nombre de lignes en ecriture */ -/* dans le TAG ROWPERSTRIP pour manipulation aussi bien pour chaque ligne, */ -/* tous les canaux qu pour chaque canal toutes les lignes */ -/*****************************************************************************/ - -/* Nombre de lignes par strip */ -/******************************/ -/*rowsperstrip=(int)((*nb_lig));*/ -rowsperstrip = 1; -TIFFSetField(tif,TIFFTAG_ROWSPERSTRIP,rowsperstrip); - -/* Nombre de canaux */ -/********************/ -samplesperpixel=(short)(*nb_can); -TIFFSetField(tif,TIFFTAG_SAMPLESPERPIXEL,samplesperpixel); - -/* Indicateur de non compression */ -/*********************************/ -TIFFSetField(tif,TIFFTAG_COMPRESSION,COMPRESSION_NONE); - -/* Nombre de bits par pixels */ -/*****************************/ -bitspersample=(short)(*nboct_pix); -bitspersample=bitspersample*8; -TIFFSetField(tif,TIFFTAG_BITSPERSAMPLE,bitspersample); - -/* Type de codage du pixel */ -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : DM : Mise à jour du tag SAMPLEFORMAT lorsque */ -/* l'image est codée en reel et que l'utilisateur le precise dans le param */ -/* "label" */ -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte des I2,I4,UI2,UI4 et R8 */ -/* en lecture et ecriture */ -/*****************************************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 5.3 : DM : Correction erreur lorsque label non reconnu */ -/*****************************************************************************/ - -/*****************************************************************************/ -/* Verification si type de codage reconnu dans le label */ - reconnaissance_type = cai_istyp_connu(label); - if (reconnaissance_type == -1) - { - if (*nboct_pix == 1) sampleformat=SAMPLEFORMAT_UINT; - else if (*nboct_pix==2) sampleformat=SAMPLEFORMAT_INT; - else if ((*nboct_pix==4) && ((strcasecmp(label,"R4") == 0)|| - (strcasecmp(label,"FLOAT")== 0)|| - (strcasecmp(label,"REEL") == 0))) - sampleformat = SAMPLEFORMAT_IEEEFP; - else sampleformat=SAMPLEFORMAT_VOID; - } - else - { - -/* Verification de coherence entre le nb d'octets par pixel et le type donne */ - Coher=1; - if(*nboct_pix == 1) - { - sampleformat=SAMPLEFORMAT_UINT; - if (reconnaissance_type == 0) - sampleformat=SAMPLEFORMAT_INT; - else if (reconnaissance_type !=1) - Coher=0; - } - else if(*nboct_pix == 2) - { - sampleformat=SAMPLEFORMAT_INT; - if (reconnaissance_type == 3) - sampleformat=SAMPLEFORMAT_UINT; - else if (reconnaissance_type !=2) - Coher=0; - } - else if(*nboct_pix == 4) - { - sampleformat=SAMPLEFORMAT_IEEEFP; - if (reconnaissance_type == 4) - sampleformat=SAMPLEFORMAT_INT; - else if (reconnaissance_type == 5) - sampleformat=SAMPLEFORMAT_UINT; - else if (reconnaissance_type !=6) - Coher=0; - } - else if(*nboct_pix == 8) - { - sampleformat=SAMPLEFORMAT_IEEEFP; - if (reconnaissance_type != 7) Coher=0; - } - else - Coher = 0; - if (Coher == 0) - { - sprintf(CAI_ERREUR,"incoherence entre TYPE et Nb bits par pixels\n"); - goto ERREUR; - } - else - { - sprintf ( image1->COD_PIX , "%s" ,label); - } - } - -/* - FIN MOD 5.1 */ -/**************/ -TIFFSetField(tif,TIFFTAG_SAMPLEFORMAT,sampleformat); - -/*indicateur de photometric suivant le nombre de canaux */ -if (*nb_can==1) - { - photo=1; - TIFFSetField(tif,TIFFTAG_PLANARCONFIG,PLANARCONFIG_CONTIG); - - } -else - { - photo=2; - TIFFSetField(tif,TIFFTAG_PLANARCONFIG,PLANARCONFIG_SEPARATE); - - } -TIFFSetField(tif,TIFFTAG_PHOTOMETRIC,photo); - for (i=0;i<*nb_can;i=i+1) - { - image1->ACCES_CANAL_TIFF[i]=tif; - image1->POS_OCTET[i]=0; - } - return (image1); - -ERREUR : - cai_dest_ima_tiff ( repert , nom_image ); - return(NULL); -} - /* - Fin de l'operation cai_ouvre_creation_tiff -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_lecture_canal_tiff */ -/* ---------- */ -/* */ -/* ROLE : fonction de lecture d'un canal d'une image tiff */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_lecture_canal_tiff (image1, canal, */ /* ------------------ premiere_ligne, */ -/* premiere_colonne, */ -/* nombre_lignes_lire , */ -/* nombre_colonnes_lire, */ -/* pas_ligne ,pas_colonne, */ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a lire */ -/* premiere_ligne (E) (int) : premiere ligne a lire dans l'image */ -/* premiere _colonne (E) (int) : premiere colonne a lire dans l'image */ -/* nombre_lignes_lire (E) (int) : nombre de lignes a lire */ -/* nombre_colonnes_lire (E) (int) : nombre de colonnes a lire */ -/* pas_ligne (E) (int) : pas en ligne */ -/* pas_colonne (E) (int) : pas en colonne */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels lus alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_lecture_canal_tiff (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ -/*****************************************************************************/ -/* MOD : VERSION : 4.9 : DM : Lecture d'une image sur 1 bit. Chaque bit est */ -/* expensé sur un octet avant d'être renvoyé à l'appelant */ -/*****************************************************************************/ - -CAI_OK_KO cai_lecture_canal_tiff(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *premiere_colonne, - int *nombre_lignes_lire , - int *nombre_colonnes_lire, - int *pas_ligne , - int *pas_colonne, - unsigned char *data_image ) - -{ - TIFF *tif; /* descripteur de fichier , retour de TIFFOpen */ - int num,i,j,k,val; /* variables de travail */ - int mul,decal; /* variables de travail */ - int iret; /* indicateur d'erreur */ - long lig; /* indice de boucle sur les lignes */ - long nb_oct; /* nb oct =1er octet a lire - position courante */ - unsigned char *buf_lec; /* buffer lecture d'une ligne */ - unsigned char *deb,*pch; /* pointeur chaine pour transfert buffer sortie */ - int oct_pix; /* nb octets par pixels */ - unsigned char val1; - unsigned char Masque[8]={1,2,4,8,16,32,64,128}; - int temp1,temp2,temp3; - -/*........................... - Initialisations diverses - ..........................*/ - - iret=CAI_OK; - strcpy(CAI_ERREUR," "); - - tif=image1->ACCES_CANAL_TIFF[0]; - oct_pix = image1->NBOCT_PIX; - pch=data_image; - -/*.............................................. - allocation de memoire pour lire une ligne image - ............................................. */ - nb_oct=TIFFScanlineSize(tif); - if ((nb_oct==(image1->NB_COL)*(image1->NB_CANAUX))&&(image1->NB_CANAUX!=1)) - { -/* ligne multispectrale */ - num=0; - val=(*canal-1); - mul=image1->NB_CANAUX; - } - else - { -/* ligne monospectrale */ - num=*canal-1; - mul=1; - val=0; - } - buf_lec = (unsigned char *) malloc(nb_oct); - if (buf_lec == NULL) - { - iret=CAI_KO; - strcpy(CAI_ERREUR,"Probleme d'allocation memoire"); - } - else - { - -/*.................... - Initialisation - ......................*/ - lig=(long)(*premiere_ligne); - lig=lig-1; - i=0; - if ( image1->NB_BITS_PIX!=1) - { - while (i<(*nombre_lignes_lire)) - { - TIFFReadScanline(tif,buf_lec,lig,num); -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ - decal= ((*premiere_colonne-1)*mul*oct_pix)+val; - deb=buf_lec+decal; - j=1; - while (j <= (*nombre_colonnes_lire)) - { - for (k=0;k<oct_pix;k=k+1) - { - *(pch+k)=*(deb+k); - } - pch=pch+oct_pix; - j=j+1; - deb=deb+((*pas_colonne)*oct_pix*mul); - } - i=i+1; - lig=lig+(long)(*pas_ligne); - - } - } - else - { -/*****************************************************************************/ -/* MOD : VERSION : 4.9 : DM : Lecture d'une image sur 1 bit. Chaque bit est */ -/* expensé sur un octet avant d'être renvoyé à l'appelant */ -/*****************************************************************************/ - - while (i<(*nombre_lignes_lire)) - { - TIFFReadScanline(tif,buf_lec,lig,num); -/*...................................... - Sauvegarde des donnees lues entenant compte du pas - d'echantillonnage en colonne - ........................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : FA : Image 1bit :prise en compte de la lecture de */ -/* portion de lignes ou de sous-echantillonnage */ -/*****************************************************************************/ -/* se déplacer jusqu'au premier paquet octet concerné */ - decal= (*premiere_colonne-1)/8; - deb=buf_lec+decal; - j=0; - while (j < (*nombre_colonnes_lire)) - { - val1 = *(deb); - if (j==0) - { -/* se déplacer jusqu'à la première colonne concernée */ - k = (*premiere_colonne -1) - (decal*8); - } - else - k=k-8; - while ((k<8)&&(j <(*nombre_colonnes_lire))) - { - *(pch+j) = val1 & Masque[7-k]; - if (*(pch+j) != 0) *(pch+j)=1; - k=k+(*pas_colonne); - j=j+1; - } - deb=deb+1; - } -/*****************************************************************************/ -/* MOD : VERSION : 5.1 : FA : Image 1bit :prise en compte de la lecture de */ -/* l'image en entier */ -/*****************************************************************************/ - pch=pch+(*nombre_colonnes_lire); -/**********/ -/*FIN MOD */ -/**********/ - i=i+1; - lig=lig+(long)(*pas_ligne); - - } - } - - free(buf_lec); - } - - return(iret); -} -/* - Fin de l'operation cai_lecture_canal_tiff -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ecriture_canal_tiff */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ecriture d'un canal d'une image tiff */ -/* ----- */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ecriture_canal_tiff (image1, canal, */ /* ------------------ premiere_ligne, */ -/* nombre_lignes_ecrire, */ -/* nombre_colonnes_ecrire,*/ -/* data_image ) */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* canal (E) (int) : numero du canal a ecrire */ -/* premiere_ligne (E) (int) : premiere ligne a ecrire ds l'image */ -/* nombre_lignes_ecrire (E) (int) : nombre de lignes a ecrire */ -/* nombre_colonnes_ecrire(E) (int) : nombre de lignes a ecrire */ -/* */ -/* data_image (S) (unsigned char): tableau des pixels ecris alloue et */ -/* libere par l'appelant */ -/* */ -/* cai_ecriture_canal_tiff (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - - - -CAI_OK_KO cai_ecriture_canal_tiff(CAI_IMAGE *image1 , - int *canal , - int *premiere_ligne , - int *nombre_lignes_ecrire , - int *nombre_colonnes_ecrire, - unsigned char *data_image ) -{ -int nboct_pix; /* nombre d'octets par pixel */ -unsigned int row,sample; /* variables intermediaires */ -int i_ligne,lig; /* compteur de lignes */ -unsigned char *buff_lig; /* tableau contenant une ligne a ecrire */ -TIFF *tif; /* descriteur de fichier,issu de TIFFopen */ -int icr; - -/* ................ - Initialisations - .................*/ - -i_ligne = 0; -lig=(*premiere_ligne); -tif = image1->ACCES_CANAL_TIFF[(*canal)-1]; -nboct_pix = image1->NBOCT_PIX; -/********************************************************/ -/* TANT QUE il y a des lignes a ecrire */ -/********************************************************/ -while (i_ligne < (*nombre_lignes_ecrire)) -{ - -/********************************************************/ -/* extraction de la ligne du tableau */ -/********************************************************/ - - buff_lig = data_image + (*nombre_colonnes_ecrire) * nboct_pix * i_ligne; - -/********************************************************/ -/* ecriture de la ligne */ -/********************************************************/ - row=(unsigned int)(lig); - row=row-1; - sample=(unsigned int)(*canal); - sample=sample-1; - icr=TIFFWriteScanline(tif,buff_lig,row,sample); -/********************************************************/ -/* incrementation du nombre de lignes */ -/********************************************************/ - lig=lig+1; - i_ligne++; - -/********************************************************/ -/* FIN TANT QUE */ -/********************************************************/ -} -return (CAI_OK); - - -} -/* - Fin de l'operation cai_ecriture_canal_tiff -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ferme_tiff */ -/* ---------- */ -/* */ -/* ROLE : fonction de fermeture d'une image au format tiff et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_ferme_tiff (image1) */ /* ------------------ */ -/* */ -/* image1 (E) (CAI_IMAGE *) : pointeur sur descripteur de fichier */ -/* */ -/* cai_ferme_tiff (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_ferme_tiff (CAI_IMAGE *image1) - - -{ - int iret; /* code retour de l'operation */ - TIFF *num; /* descripteur du fichier a fermer */ - - - iret=CAI_OK; -/*............................................. - Fermeture de tous les canaux qui sont tous contenus - dans un seul fichier .srf - .............................................*/ - - num=image1->ACCES_CANAL_TIFF[0]; - TIFFClose(num); - - return (iret); -} -/* - Fin de l'operation cai_ferme_tiff -*/ - -/*****************************************************************************/ -/* */ -/* OPERATION : cai_dest_ima_tiff */ -/* ---------- */ -/* */ -/* ROLE : fonction de destruction d'une image stocke en onera et de */ -/* ----- tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_OK_KO cai_dest_ima_tiff (format,nom_ima) */ /* ------------------ */ -/* format (E) (char *) : format de l'image a detruire */ -/* nom_image (E) (char *) : nom de l'image a detruire avec repertoire */ -/* */ -/* cai_dest_ima_tiff (S) (CAI_OK_KO) : = CAI_KO si pb */ -/* = CAI_OK si OK */ -/* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_OK_KO cai_dest_ima_tiff ( char *repertoire , - char *nom_ima ) - -{ - -char nom_fichier[1024]; /* nom du fichier entete a detruire */ -char nom_ima_complet[1024]; /* repertoire + nom de l'image */ -int cr_stat; /* code retour de fonction status de fichier */ -struct stat buf_stat; /* structure decrivant status de fichier */ -int Mode,icr; - - -/************************************************/ -/* Constitution du nom du fichier d'entete */ -/************************************************/ -if ((long)strlen(repertoire)!= 0) -{ - sprintf ( nom_ima_complet, "%s/%s" ,repertoire,nom_ima); -} -else -{ - strcpy ( nom_ima_complet , nom_ima); -} -sprintf ( nom_fichier , "%s.tiff",nom_ima_complet ); - -/* test sur l'existence avec .tiff sinon .tif */ - Mode = F_OK; -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - icr = access(nom_fichier,Mode); - if (icr !=0) - { - nom_fichier[strlen(nom_fichier)-1]='\0'; - icr = access(nom_fichier,Mode); - if (icr !=0) - { - if ((long int)strlen(repertoire)!=0) - { - sprintf(nom_fichier,"%s/%s.TIF",repertoire,nom_ima_complet); - } - else - { - sprintf(nom_fichier,"%s.TIF",nom_ima_complet); - } - } - } - -/************************************************/ -/* Destruction du fichier TIFF */ -/************************************************/ -cr_stat = stat ( nom_fichier , &buf_stat ); -if ( cr_stat == 0 ) -{ - unlink ( nom_fichier ); - return (CAI_OK); -} -else -{ - return (CAI_KO); -} - - -} -/* - Fin de l'operation cai_dest_ima_tiff -*/ -/*****************************************************************************/ -/* */ -/* OPERATION : cai_ouvre_modifie_tiff */ -/* ---------- */ -/* */ -/* ROLE : fonction d'ouverture en lecture-ecriture d'une image au forma */ -/* ----- tiff et de tous les fichiers qui la composent */ -/* */ -/* */ -/* */ -/* CONTEXTE D'APPEL : CAI_IMAGE *cai_ouvre_modifie_tiff (nom_image, */ -/* ---------------- nb_can, */ -/* nboct_pix, */ -/* nb_col, */ -/* nb_lig) */ -/* nom_image (E) (char *) : nom de l'image a ouvrir avec repertoire */ -/* */ -/* nb_can (S) (int *) : nombre de canaux de l'image */ -/* nboct_pix (S) (int *) : nombre d'octets par pixels (1 ou 2) */ -/* nb_lig (S) (int *) : nombre de lignes de l'image */ -/* nb_col (S) (int *) : nombre de colonnes de l'image */ -/* */ -/* cai_ouvre_modifie_tiff (S) (CAI_IMAGE *) : = NULL si pb */ -/* = structure contenant */ -/* toutes les informations necessaires au */ -/* traitement de l'image */ /* */ -/* VERSION : V1 */ -/* -------- */ -/* */ -/*****************************************************************************/ - -CAI_IMAGE *cai_ouvre_modifie_tiff(char *repert, - char *nom_image, - int *nb_can, - int *nboct_pix, - int *nb_col, - int *nb_lig) - -{ - TIFF *tif; /* pointeur sur descripteur de fichier */ - CAI_IMAGE *image1; /* pointeur su descripteur de fichier image */ - int iret,icr; /* indicateur de retour ok ou pas */ - char nom_fic[1024]; /* nom du fichier en-tete */ - char *deb,*deb1; /* pointeurs sur chaine de caracteres */ - int i,Coher; /* indice */ - unsigned int imagelength; /* nombre de lignes de l'image */ - unsigned int imagewidth; /* nombre de colonnes de l'image */ - short samplesperpixel; /* nombre de canaux */ - short compression; /* indicateur de compression */ - short photo; /* indicateur de photometric interpretation */ - short bitspersample; /* nombre de bits par pixels */ - int Istile; /* indicateur de stockage en pave */ - short sampleformat; /* type de codage du pixel */ - int Mode; - char Extension[6]; - -/*........................................ - INITIALISATION et allocation de place pour la structure CAI_IMAGE - .........................................*/ - *nb_can=0; - *nb_lig=0; - *nb_col=0; - *nboct_pix=0; - iret=1; - Mode = F_OK; - icr = 0; - sprintf(Extension,".tiff"); - - image1 = (CAI_IMAGE *)calloc(1,sizeof(CAI_IMAGE)); -/*****************************************************************************/ -/* MOD : VERSION :4.1 :FA:Rajout des tests sur les retours d'allocation */ -/* memoire */ -/*****************************************************************************/ - - if (image1==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur allocation memoirem dans cai_ouvre_modifie"); - } - else - { -/*................................................. - Constitution du nom du fichier TIFF - .................................................*/ - nom_fic[0]='\0'; - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s%s.tiff",repert,nom_image); - } - else - { - sprintf(nom_fic,"%s.tiff",nom_image); - } - -/* test sur l'existence avec .tiff sinon .tif */ -/*****************************************************************************/ -/* MOD : VERSION : 4.3 : DM : prise en compte des extensions en majuscule */ -/*****************************************************************************/ - icr = access(nom_fic,Mode); - if (icr !=0) - { - nom_fic[strlen(nom_fic)-1]='\0'; - Extension[4]='\0'; - icr = access(nom_fic,Mode); - if (icr !=0) - { - sprintf(Extension,".TIF"); - if ((long int)strlen(repert)!=0) - { - sprintf(nom_fic,"%s/%s%s",repert,nom_image,Extension); - } - else - { - sprintf(nom_fic,"%s.%s",nom_image,Extension); - } - } - } - -/*........................ - Ouverture du fichier entete - ..........................................*/ -/******************************************************************************/ -/* MOD : VERSION : 4.6 : FA : En ouverture en modification, ouverture en "r+" */ -/* au lieu de "w" */ -/******************************************************************************/ - - tif = TIFFOpen(nom_fic,"r+"); - if (tif==NULL) - { - iret=0; - strcpy(CAI_ERREUR,"Erreur ouverture fichier tiff"); - } - else - { -/*.......................................................... - verification si l'image n'est pas comprimee -.............................................................*/ - TIFFGetField(tif,TIFFTAG_COMPRESSION,&compression); - if (compression != COMPRESSION_NONE) - { - iret=0; - strcpy(CAI_ERREUR,"Le fichier tiff est comprime. Format non traite !"); - } - else - { - -/*.......................................................... - verification si le fichier n'est pas code en pave -.............................................................*/ - Istile=TIFFIsTiled(tif); - if (Istile!=0) - { - iret=0; - strcpy(CAI_ERREUR,"Le fichier tiff est en paves . Format non traite !"); - } - else - { -/*.................................... - recuperation du nombre de colonnes -............................................*/ - TIFFGetField(tif,TIFFTAG_IMAGEWIDTH,&imagewidth); - *nb_col=imagewidth; -/*.................................... - recuperation du nombre de lignes -............................................*/ - TIFFGetField(tif,TIFFTAG_IMAGELENGTH,&imagelength); - *nb_lig=imagelength; - -/*...................................... - recuperation du nombre de canaux -............................................*/ - TIFFGetFieldDefaulted(tif,TIFFTAG_SAMPLESPERPIXEL,&samplesperpixel); - *nb_can=samplesperpixel; -/*......................................... - recuperation du nombre d'octets par pixel - .................................................*/ -/* Nombre de bits par pixels */ -/*****************************/ - TIFFGetField(tif,TIFFTAG_BITSPERSAMPLE,&bitspersample); - if ((bitspersample %8)==0) - *nboct_pix=(int)(bitspersample/8); - else - *nboct_pix=(int)((bitspersample/8)+1); - /*......................................... - recuperation du type de codage - .................................................*/ -/*****************************************************************************/ -/* MOD : VERSION : 5.0 : DM : A l'ouverture d'une image en lecture, renvoie */ -/* de COD_PIX à I4 ou R4 pour les images codees en I4 ou R4 */ -/*****************************************************************************/ - TIFFGetField(tif,TIFFTAG_SAMPLEFORMAT,&sampleformat); - -/*****************************************************************************/ -/* MOD : VERSION : 5.2 : DM : prise en compte des I2,I4,UI2,UI4 et R8 */ -/* en lecture et ecriture */ -/*****************************************************************************/ - Coher = 1; - if (*nboct_pix==1) - { - sprintf(image1->COD_PIX,"UOCT"); - if (sampleformat == SAMPLEFORMAT_INT) - sprintf(image1->COD_PIX,"OCT"); - else if (sampleformat != SAMPLEFORMAT_UINT) - Coher=0; - } - else if (*nboct_pix==2) - { - sprintf(image1->COD_PIX,"UI2"); - if (sampleformat == SAMPLEFORMAT_INT) - sprintf(image1->COD_PIX,"I2"); - else if (sampleformat != SAMPLEFORMAT_UINT) - Coher=0; - } - else if (*nboct_pix==4) - { - sprintf(image1->COD_PIX,"I4"); - if (sampleformat == SAMPLEFORMAT_IEEEFP) - sprintf(image1->COD_PIX,"R4"); - else if (sampleformat == SAMPLEFORMAT_UINT) - sprintf(image1->COD_PIX,"UI4"); - else if (sampleformat != SAMPLEFORMAT_INT) - Coher=0; - } - else if (*nboct_pix==8) - { - sprintf(image1->COD_PIX,"R8"); - if (sampleformat != SAMPLEFORMAT_IEEEFP) - Coher=0; - } - else - sprintf(image1->COD_PIX,"UND"); - -/*............................................*/ -/* Recuperation du type de codages des pixels */ -/*............................................*/ - TIFFGetField(tif,TIFFTAG_PLANARCONFIG,&photo); - -/*................................................... - recuperation de l'indice de photometric interpretation - ..............................................................*/ - TIFFGetField(tif,TIFFTAG_PHOTOMETRIC,&photo); - if ((photo<0)&&(photo>3)) - { - iret=0; - strcpy(CAI_ERREUR,"Photometric non connue . Format non traite !"); - } - - } - } - } - } - if (iret != 0) - { - -/*....................................... - INTIALISATION DES TABLEAUX CONTENANT LE NOM DE FICHIER - ET LE NOM UTILISATEUR DE CHAQUE CANAL - .....................................................*/ - - - deb = image1->NOM_FIC_CAN; - deb1= image1->NOM_UTIL_CAN; - - for (i=0;i<*nb_can;i=i+1) - { - sprintf(deb,"%s%s",nom_image,Extension); - deb=deb+100; - sprintf(deb1,"%s%s",nom_image,Extension); - deb1=deb1+100; - image1->POS_OCTET[i]=0; - image1->ACCES_CANAL_TIFF[i]=tif; - } - return (image1); - } - else - { - return(NULL); - } - -} - -/* - Fin de l'operation cai_ouvre_modifie_tiff -*/ -- GitLab