00001
00002
00003
00004
00005
00006
00007
00008
00009 #include <stdio.h>
00010
00011 #define MAXHASHLEN 1024
00012
00013 typedef struct VTrackStruct {
00014 short band;
00015 short row;
00016 short col;
00017 short length;
00018 struct VTrackStruct *next;
00019 struct VTrackStruct *previous;
00020 } *VTrack, VTrackRec;
00021
00022
00023 typedef struct VBucketStruct {
00024 short ntracks;
00025 VTrack first;
00026 VTrack last;
00027 } *VBucket, VBucketRec;
00028
00029 typedef struct VolumeStruct {
00030 short label;
00031 short nbands;
00032 short nrows;
00033 short ncolumns;
00034 short nbuckets;
00035 int ntracks;
00036 VBucket bucket;
00037 struct VolumeStruct *next;
00038 } VolumeRec, *Volume;
00039
00040
00041 typedef struct V_VolumesRec {
00042 VAttrList attributes;
00043 short nvolumes;
00044 short nbands;
00045 short nrows;
00046 short ncolumns;
00047 Volume first;
00048 } VolumesRec;
00049
00050 #define VolumesAttrList(volumes) ((volumes)->attributes)
00051 #define VolumesNum(volumes) ((volumes)->nvolumes)
00052 #define VolumesNBands(volumes) ((volumes)->nbands)
00053 #define VolumesNRows(volumes) ((volumes)->nrows)
00054 #define VolumesNColumns(volumes) ((volumes)->ncolumns)
00055 #define VolumesNVolumes(volumes) ((volumes)->ntracks)
00056
00057
00058
00059
00060 #define VolumeNBands(volume) ((volume)->nbands)
00061 #define VolumeNRows(volume) ((volume)->nrows)
00062 #define VolumeNColumns(volume) ((volume)->ncolumns)
00063 #define VolumeNBuckets(volume) ((volume)->nbuckets)
00064 #define VolumeNTracks(volume) ((volume)->ntracks)
00065 #define VolumeLabel(volume) ((volume)->label)
00066 #define VFirstVolume(volumes) ((volumes)->first)
00067 #define VNextVolume(volume) ((volume)->next)
00068 #define VolumeExists(volume) ((volume) != NULL)
00069
00070 #define VTrackLength(track) ((track)->length)
00071 #define VTrackExists(track) ((track) != NULL)
00072 #define VFirstTrack(volume,i) ((volume)->bucket[(i)].first)
00073 #define VNextTrack(track) ((track)->next)
00074 #define VPreviousTrack(track) ((track)->previous)
00075
00076 #define VolumesAttr "volumes"
00077 #define VolNVolumesAttr "nvolumes"
00078 #define VolNTracksAttr "ntracks"
00079 #define VolNBandsAttr "nbands"
00080 #define VolNRowsAttr "nrows"
00081 #define VolNColumnsAttr "ncolumns"
00082
00083 extern Volumes VCreateVolumes(short,short,short);
00084 extern Volumes VCopyVolumes(Volumes);
00085 extern void VDestroyVolumes(Volumes);
00086 extern VBoolean VWriteVolumes(FILE *, VAttrList, int, Volumes *);
00087
00088 extern int VReadVolumes(FILE *, VAttrList *, Volumes **);
00089
00090 extern Volume VCreateVolume(short,short,short,short,short);
00091 extern Volume VCopyVolume(Volume);
00092 extern void VAddVolume(Volumes, Volume);
00093 extern void AddTrack(Volume,VTrack);
00094
00095 extern double VolumeBorderSize(Volume);
00096 extern VBoolean VolumeBorder(Volume,short,short,short);
00097 extern VTrack VolumeGetTrack(Volume,short,short,short);
00098 extern VBoolean VolumeInside(Volume,short,short,short);
00099 extern double VolumeRadius(Volume,double *);
00100
00101
00102
00103
00104 #define VolumeHash(nbands, b, r, len) (((b) * (nbands) + (r)) % (len))