Skip to content

AFNI/NIfTI Server

Sections
Personal tools
You are here: Home » AFNI » Documentation

Doxygen Source Code Documentation


Main Page   Alphabetical List   Data Structures   File List   Data Fields   Globals   Search  

l_mri_dicom_hdr.c File Reference

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <errno.h>
#include <stdarg.h>
#include <ctype.h>
#include "mri_dicom_hdr.h"
#include "Amalloc.h"
#include "dbtrace.h"

Go to the source code of this file.


Data Structures

struct  DCMDICT
struct  EDB
struct  GENERIC
struct  GROUP_DESCRIPTION
struct  GROUPPTR
struct  UTL_TIMESTRUCTURE
struct  vector
struct  VRMAP

Defines

#define BYTEORDER_SAME   1
#define BYTEORDER_REVERSE   2
#define NATIVE_ORDER   BYTEORDER_SAME
#define NPBUF   1024
#define RWC_NONAME_MASK   1
#define RWC_NOHEX_MASK   2
#define MAXEDB   100
#define CURRENT   (*list)->current
#define OLD_NEXT   (*list)->current->next
#define OLD_PREV   (*list)->current->previous

Typedefs

typedef vector VECTOR

Functions

void RWC_set_endianosity (void)
void RWC_clear_pbuf (void)
int RWC_printf (char *fmt,...)
void mri_dicom_pxlarr (off_t *poff, unsigned int *plen)
void mri_dicom_noname (int ii)
void mri_dicom_nohex (int ii)
void mri_dicom_setvm (int vv)
void mri_dicom_seterr (int vv)
char * mri_dicom_header (char *fname)
void dumpstack (FILE *fp)
CONDITION COND_PushCondition (CONDITION cond, char *controlString,...)
CONDITION COND_ExtractConditions (CTNBOOLEAN(*callback)())
CONDITION COND_TopCondition (CONDITION *code, char *text, unsigned long maxlength)
CONDITION COND_PopCondition (CTNBOOLEAN clearstack)
CONDITION COND_EstablishCallback (void(*callback)())
void COND_DumpConditions (void)
void COND_CopyText (char *txt, size_t length)
void COND_WriteConditions (FILE *lfp)
CONDITION newElementItem (DCM_ELEMENT *src, CTNBOOLEAN allocateData, PRV_ELEMENT_ITEM **dst)
CONDITION findCreateGroup (PRIVATE_OBJECT **object, unsigned short group, PRV_GROUP_ITEM **groupPtr)
CONDITION insertNewElement (PRIVATE_OBJECT **object, DCM_ELEMENT *element)
CONDITION updateObjectType (PRIVATE_OBJECT **object, DCM_ELEMENT *element)
CONDITION updateSpecialElements (PRIVATE_OBJECT **object, PRV_ELEMENT_ITEM *item)
void exportFixedFields (DCM_ELEMENT *element, unsigned char *b, U32 length, int byteOrder, CTNBOOLEAN explicitVR, U32 *rtnLength)
CONDITION exportData (PRIVATE_OBJECT **object, PRV_ELEMENT_ITEM *item, unsigned char *src, unsigned char *dst, U32 length, int byteOrder, U32 *rtnLength)
int fileSize (int fd)
void swapInPlace (PRIVATE_OBJECT **object, DCM_ELEMENT *e)
CONDITION checkObject (PRIVATE_OBJECT **object, char *caller)
CONDITION writeFile (void *buffer, U32 length, int flag, void *fd)
CONDITION countBytes (void *buffer, U32 length, int flag, void *sizePtr)
CONDITION exportStream (DCM_OBJECT **callerObject, unsigned long opt, void *buffer, U32 bufferlength, CONDITION(*callback)(), void *ctx, int sequenceLevel)
CONDITION verifyFormat (PRV_ELEMENT_ITEM *item)
CONDITION readFile (char *name, unsigned char *callerBuf, int fd, long size, off_t fileOffset, int recursionLevel, unsigned long opt, DCM_OBJECT **callerObject, U32 *scannedLength, CTNBOOLEAN *remainOpenFlag, void *ctx, CONDITION(*rd)(void *ctx, void *buf, int toRead, int *bytesRead), CONDITION(*sk)(void *ctx, int offset, int flag))
CONDITION readFile1 (const char *name, unsigned char *callerBuf, int fd, U32 size, off_t *fileOffset, int recursionLevel, unsigned long opt, PRIVATE_OBJECT **parentObject, DCM_OBJECT **callerObject, U32 *scannedLength, CTNBOOLEAN *remainOpenFlag, void *ctx, CONDITION(*rd)(void *ctx, void *buf, int toRead, int *bytesRead), CONDITION(*sk)(void *ctx, int offset, int flag))
PRV_ELEMENT_ITEMlocateElement (PRIVATE_OBJECT **obj, DCM_TAG tag)
void computeVM (PRIVATE_OBJECT **object, DCM_ELEMENT *element)
void ctxSensitiveLookup (PRIVATE_OBJECT **object, DCM_ELEMENT *element)
CONDITION copyData (PRIVATE_OBJECT **object, PRV_ELEMENT_ITEM *item, DCM_ELEMENT *to, U32 *rtnLength)
CONDITION readLengthToEnd (int fd, const char *fileName, unsigned long opt, U32 *lengthToEnd)
void swapATGroupElement (DCM_ELEMENT *e)
void dumpBinaryData (void *d, DCM_VALUEREPRESENTATION vr, long vm, long vmLimit)
void compareGroup (PRV_GROUP_ITEM *g1, PRV_GROUP_ITEM *g2, void(*callback)(const DCM_ELEMENT *e1, const DCM_ELEMENT *e2, void *ctx), void *ctx)
void remapFileName (const char *name, char *mapName)
CONDITION DCM_OpenFile (const char *name, unsigned long opt, DCM_OBJECT **callerObject)
CONDITION DCM_ReadStream (DCM_OBJECT **callerObject, unsigned long opt, long size, void *ctx, CONDITION(*rd)(void *ctx, void *buf, int toRead, int *bytesRead), CONDITION(*sk)(void *ctx, int offset, int flag))
CONDITION DCM_CreateObject (DCM_OBJECT **object, unsigned long opt)
CONDITION DCM_CloseObject (DCM_OBJECT **callerObject)
CONDITION DCM_AddElement (DCM_OBJECT **callerObject, DCM_ELEMENT *element)
CONDITION DCM_AddSequenceElement (DCM_OBJECT **callerObject, DCM_ELEMENT *element)
CONDITION DCM_RemoveElement (DCM_OBJECT **callerObject, DCM_TAG tag)
CONDITION DCM_GetElementValue (DCM_OBJECT **callerObject, DCM_ELEMENT *element, U32 *rtnLength, void **ctx)
char * DCM_GetString (DCM_OBJECT **callerObject, DCM_TAG tag)
CONDITION DCM_GetElementValueOffset (DCM_OBJECT **callerObject, DCM_ELEMENT *element, unsigned long offset)
CONDITION DCM_GetElementSize (DCM_OBJECT **callerObject, DCM_TAG tag, U32 *rtnLength)
CONDITION DCM_ScanParseObject (DCM_OBJECT **callerObject, void *buf, size_t bufferSize, DCM_FLAGGED_ELEMENT *elementVector, int vectorLength, CONDITION(*callback)(const DCM_ELEMENT *e, void *ctx), void *ctx)
CONDITION DCM_ImportStream (unsigned char *buf, unsigned long length, unsigned long opt, DCM_OBJECT **callerObject)
CONDITION DCM_GetObjectSize (DCM_OBJECT **callerObject, unsigned long *returnlength)
CONDITION DCM_DumpElements (DCM_OBJECT **callerObject, long vm)
CONDITION DCM_FormatElements (DCM_OBJECT **callerObject, long vm, const char *prefix)
void DCM_Debug (CTNBOOLEAN flag)
CONDITION DCM_ExportStream (DCM_OBJECT **callerObject, unsigned long opt, void *buffer, unsigned long bufferlength, DCM_EXPORT_STREAM_CALLBACK *callback, void *ctx)
CONDITION DCM_WriteFile (DCM_OBJECT **callerObject, unsigned long opt, const char *file)
CONDITION DCM_ModifyElements (DCM_OBJECT **callerObject, DCM_ELEMENT *vector, int count, DCM_FLAGGED_ELEMENT *flaggedVector, int flaggedCount, int *updateCount)
CONDITION DCM_ParseObject (DCM_OBJECT **callerObject, DCM_ELEMENT *vector, int count, DCM_FLAGGED_ELEMENT *flaggedVector, int flagCount, int *parseCount)
CONDITION DCM_RemoveGroup (DCM_OBJECT **callerObject, unsigned short group)
CONDITION DCM_GetSequenceList (DCM_OBJECT **object, DCM_TAG tag, LST_HEAD **list)
CONDITION DCM_GetSequenceElement (DCM_OBJECT **object, DCM_TAG top, DCM_ELEMENT *e)
CONDITION DCM_GetElementValueList (DCM_OBJECT **object, DCM_TAG tag, size_t structureSize, long stringOffset, LST_HEAD **list)
CONDITION DCM_AddElementList (DCM_OBJECT **callerObject, DCM_ELEMENT *element, LST_HEAD *list, long offset)
CONDITION DCM_GetElement (DCM_OBJECT **callerObject, DCM_TAG tag, DCM_ELEMENT *element)
CONDITION DCM_ComputeExportLength (DCM_OBJECT **callerObject, unsigned long opt, unsigned long *length)
CONDITION DCM_CompareAttributes (DCM_OBJECT **o1, DCM_OBJECT **o2, void(*callback)(const DCM_ELEMENT *e1, const DCM_ELEMENT *e2, void *ctx), void *ctx)
CTNBOOLEAN DCM_GroupPresent (DCM_OBJECT **o1, U16 group)
CONDITION insertThisElementItem (PRIVATE_OBJECT **object, PRV_ELEMENT_ITEM *newItem)
VRMAPlookupVRCode (const char *code)
void mapVRtoASCII (DCM_VALUEREPRESENTATION vr, char *s)
void exportVRLength (DCM_ELEMENT *e, unsigned char *b, int byteOrder, U32 *rtnLength)
CONDITION exportPreamble (PRIVATE_OBJECT **obj, unsigned char *dst, U32 bufferLength, U32 *rtnLength)
CONDITION exportEncapsulatedPixels (PRIVATE_OBJECT **object, PRV_ELEMENT_ITEM *item, unsigned char *buffer, U32 bufferlength, DCM_EXPORT_STREAM_CALLBACK *callback, void *ctx)
CONDITION exportPixels (PRIVATE_OBJECT **object, PRV_ELEMENT_ITEM *item, int encapsulatedPixels, unsigned char *buffer, U32 bufferlength, DCM_EXPORT_STREAM_CALLBACK *callback, void *ctx, int byteOrder, int explicitVR)
CONDITION setFileOptions (DCM_OBJECT **obj, unsigned long *opt)
CONDITION extractFileOptions (unsigned long opt, CTNBOOLEAN *part10File, CTNBOOLEAN *explicitVR, int *byteOrder, CTNBOOLEAN *encapsulatedPixels)
U32 computeGroupLength (PRV_GROUP_ITEM *groupItem, CTNBOOLEAN explicitVR)
CONDITION exportStream (DCM_OBJECT **callerObject, unsigned long opt, void *buffer, U32 bufferlength, DCM_EXPORT_STREAM_CALLBACK *callback, void *ctx, int sequenceLevel)
CONDITION readPreamble (const char *name, unsigned char **ptr, int fd, U32 *size, off_t *fileOffset, CTNBOOLEAN knownLength, PRIVATE_OBJECT **object, U32 *scannedLength)
CONDITION readGroupElement (const char *name, unsigned char **ptr, int fd, U32 *size, off_t *fileOffset, CTNBOOLEAN knownLength, int byteOrder, CTNBOOLEAN explicitVR, CTNBOOLEAN acceptVRMismatch, PRIVATE_OBJECT **object, U32 *scannedLength, DCM_ELEMENT *e)
CONDITION readVRLength (const char *name, unsigned char **ptr, int fd, U32 *size, off_t *fileOffset, CTNBOOLEAN knownLength, int byteOrder, CTNBOOLEAN explicitVR, CTNBOOLEAN acceptVRMismatch, PRIVATE_OBJECT **object, U32 *scannedLength, DCM_ELEMENT *e)
CONDITION readSequence (const char *name, unsigned char **ptr, int fd, U32 *size, off_t *fileOffset, int recursionLevel, unsigned long opt, int byteOrder, CTNBOOLEAN explicitVR, CTNBOOLEAN acceptVRMismatch, CTNBOOLEAN fileFlag, CTNBOOLEAN *remainOpenFlag, CTNBOOLEAN convertFlag, PRIVATE_OBJECT **object, U32 *scannedLength, DCM_ELEMENT *e, PRV_ELEMENT_ITEM **elementItem)
CONDITION scanCompressedPixels (char *name, unsigned char **ptr, int fd, U32 *size, off_t *fileOffset, int recursionLevel, unsigned long opt, int byteOrder, CTNBOOLEAN explicitVR, CTNBOOLEAN acceptVRMismatch, CTNBOOLEAN fileFlag, CTNBOOLEAN *remainOpenFlag, CTNBOOLEAN convertFlag, PRIVATE_OBJECT **object, U32 *scannedLength, DCM_ELEMENT *e, PRV_ELEMENT_ITEM **elementItem)
CONDITION readData (const char *name, unsigned char **ptr, int fd, U32 *size, off_t *fileOffset, CTNBOOLEAN knownLength, int byteOrder, CTNBOOLEAN explicitVR, CTNBOOLEAN acceptVRMismatch, CTNBOOLEAN fileFlag, CTNBOOLEAN *remainOpenFlag, CTNBOOLEAN convertFlag, PRIVATE_OBJECT **object, U32 *scannedLength, DCM_ELEMENT *e, PRV_ELEMENT_ITEM **elementItem)
CONDITION checkAttributeOrder (DCM_ELEMENT *e, long *lastGroup, long *lastElement, CTNBOOLEAN allowRepeatElements)
CONDITION handleGroupItem (PRIVATE_OBJECT **obj, PRV_GROUP_ITEM **groupItem, unsigned short group)
void dumpSS (short *ss, long vm)
void dumpSL (S32 *sl, long vm)
void dumpUS (unsigned short *us, long vm)
void dumpUL (U32 *ul, long vm)
void dumpOB (unsigned char *c, long vm)
void copySequence (PRIVATE_OBJECT **dstObj, DCM_ELEMENT *e)
CONDITION DCM_GetCompressedValue (DCM_OBJECT **callerObject, DCM_TAG tag, void *buf, size_t bufSize, DCM_GET_COMPRESSED_CALLBACK *callback, void *ctx)
CONDITION DCM_PrintSequenceList (DCM_OBJECT **object, DCM_TAG tag)
CONDITION DCM_GetSequenceByOffset (DCM_OBJECT **object, DCM_TAG tag, unsigned long offset, DCM_OBJECT **rtnObject)
CONDITION DCM_CopyObject (DCM_OBJECT **src, DCM_OBJECT **dst)
CONDITION DCM_MergeObject (DCM_OBJECT **src, DCM_OBJECT **dst)
CONDITION DCM_GetFirstElement (DCM_OBJECT **callerObject, DCM_ELEMENT **e)
CONDITION DCM_GetNextElement (DCM_OBJECT **callerObject, DCM_ELEMENT **e)
CONDITION DCM_AddFragment (DCM_OBJECT **callerObject, void *fragment, U32 fragmentLength)
char * DCM_Message (CONDITION condition)
 DCM_DumpVector ()
CONDITION DCM_LookupElement (DCM_ELEMENT *element)
CONDITION DCM_GroupDictionary (unsigned short group, void *ctx, void(*callback)(unsigned short g, char *description, void *ctx))
CONDITION DCM_ElementDictionary (DCM_TAG tag, void *ctx, void(*callback)(DCM_TAG t, char *description, DCM_VALUEREPRESENTATION r, void *ctx))
CONDITION DCM_ListToString (LST_HEAD *list, long offset, char **string)
CTNBOOLEAN DCM_IsString (DCM_VALUEREPRESENTATION representation)
LST_HEADLST_Create (void)
CONDITION LST_Destroy (LST_HEAD **list)
CONDITION LST_Enqueue (LST_HEAD **list, LST_NODE *node)
CONDITION LST_Push (LST_HEAD **list, LST_NODE *node)
LST_NODELST_Dequeue (LST_HEAD **list)
LST_NODELST_Pop (LST_HEAD **list)
unsigned long LST_Count (LST_HEAD **list)
LST_NODELST_Head (LST_HEAD **list)
LST_NODELST_Current (LST_HEAD **list)
LST_NODELST_Tail (LST_HEAD **list)
CONDITION LST_Insert (LST_HEAD **list, LST_NODE *node, LST_END where)
LST_NODELST_Remove (LST_HEAD **list, LST_END dir)
LST_NODELST_Next (LST_HEAD **list)
LST_NODELST_Previous (LST_HEAD **list)
LST_NODELST_Position (LST_HEAD **list, LST_NODE *node)
CONDITION LST_Sort (LST_HEAD **list, size_t nodeSize, int(*compare)())
LST_NODELST_Index (LST_HEAD **l, int index)
long UTL_ConvertDatetoLong (const char *date)
void UTL_ConvertLongtoDate (long ld, char *date)
double UTL_ConvertTimetoFloat (const char *time)
void UTL_ConvertFloattoTime (double dt, char *time)
void UTL_SqueezeBlanks (char *s)
CONDITION UTL_DateMatch (char *datestring, char *stm)
CONDITION UTL_TimeMatch (char *timestring, char *stm)
void UTL_GetDicomDate (char *datestr)
void UTL_GetDicomTime (char *timestr)
void * UTL_GetTimeStamp ()
double UTL_DeltaTime (void *timeStamp)
void UTL_ReleaseTimeStamp (void *timeStamp)
CONDITION UTL_VerifyCreatePath (const char *path)
CTNBOOLEAN UTL_IsDirectory (const char *path)

Variables

int LITTLE_ORDER
int BIG_ORDER
int LITTLE_ENDIAN_ARCHITECTURE = -1
char * pbuf = NULL
int npbuf = 0
off_t pxl_off = 0
unsigned int pxl_len = 0
int rwc_opt = 0
int rwc_vm = 0
int rwc_err = 1
int rwc_fd
int stackPtr = -1
EDB EDBStack [MAXEDB]
void(* ErrorCallback )()=NULL
CTNBOOLEAN debug = FALSE
VRMAP vrMap []
union {
   unsigned short   sh [2]
   unsigned char   ch [4]
groupElement
VECTOR messageVector []
DCMDICT CMD_dictionary []
DCMDICT META_dictionary []
DCMDICT BASICDIR_dictionary []
DCMDICT ID_dictionary []
DCMDICT PAT_dictionary []
DCMDICT ACQ_dictionary []
DCMDICT REL_dictionary []
DCMDICT IMG_dictionary []
DCMDICT SDY_dictionary []
DCMDICT VIS_dictionary []
DCMDICT WAV_dictionary []
DCMDICT PRC_dictionary []
DCMDICT DEV_dictionary []
DCMDICT RES_dictionary []
DCMDICT CRV_dictionary []
DCMDICT NMI_dictionary []
DCMDICT GRP_dictionary []
DCMDICT OLY_dictionary []
DCMDICT PXL_dictionary []
DCMDICT MED_dictionary []
DCMDICT BFS_dictionary []
DCMDICT BFB_dictionary []
DCMDICT BIB_dictionary []
DCMDICT BAB_dictionary []
DCMDICT IOB_dictionary []
DCMDICT PLUT_dictionary []
DCMDICT PJ_dictionary []
DCMDICT PRN_dictionary []
DCMDICT G3002_dictionary []
DCMDICT DVH_dictionary []
DCMDICT SSET_dictionary []
DCMDICT G300A_dictionary []
DCMDICT G300C_dictionary []
DCMDICT G300E_dictionary []
DCMDICT PAD_dictionary []
DCMDICT DLM_dictionary []
GROUPPTR group_dictionary []
GROUP_DESCRIPTION groupTable []

Define Documentation

#define BYTEORDER_REVERSE   2
 

Definition at line 80 of file l_mri_dicom_hdr.c.

Referenced by copyData(), DCM_GetCompressedValue(), DCM_GetElementValue(), DCM_GetElementValueOffset(), and RWC_set_endianosity().

#define BYTEORDER_SAME   1
 

Definition at line 79 of file l_mri_dicom_hdr.c.

Referenced by exportData(), exportFixedFields(), exportVRLength(), readData(), readFile(), readGroupElement(), readVRLength(), and RWC_set_endianosity().

#define CURRENT   (*list)->current
 

Definition at line 10721 of file l_mri_dicom_hdr.c.

Referenced by LST_Insert(), LST_Next(), LST_Position(), LST_Previous(), and LST_Remove().

#define MAXEDB   100
 

Definition at line 353 of file l_mri_dicom_hdr.c.

Referenced by COND_PushCondition().

#define NATIVE_ORDER   BYTEORDER_SAME
 

Definition at line 81 of file l_mri_dicom_hdr.c.

Referenced by DCM_GetCompressedValue(), exportStream(), extractFileOptions(), newElementItem(), readFile(), and readFile1().

#define NPBUF   1024
 

Definition at line 113 of file l_mri_dicom_hdr.c.

Referenced by RWC_printf().

#define OLD_NEXT   (*list)->current->next
 

Definition at line 10722 of file l_mri_dicom_hdr.c.

Referenced by LST_Insert(), and LST_Remove().

#define OLD_PREV   (*list)->current->previous
 

Definition at line 10723 of file l_mri_dicom_hdr.c.

Referenced by LST_Insert(), and LST_Remove().

#define RWC_NOHEX_MASK   2
 

Definition at line 164 of file l_mri_dicom_hdr.c.

Referenced by DCM_DumpElements(), and mri_dicom_nohex().

#define RWC_NONAME_MASK   1
 

Definition at line 163 of file l_mri_dicom_hdr.c.

Referenced by DCM_DumpElements(), and mri_dicom_noname().


Typedef Documentation

typedef struct vector VECTOR
 


Function Documentation

CONDITION checkAttributeOrder DCM_ELEMENT   e,
long *    lastGroup,
long *    lastElement,
CTNBOOLEAN    allowRepeatElements
[static]
 

Definition at line 6859 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), CTNBOOLEAN, DCM_ELEMENTOUTOFORDER, DCM_Message(), DCM_NORMAL, DCM_REPEATEDELEMENT, DCM_TAG_ELEMENT, DCM_TAG_GROUP, and DCM_ELEMENT::tag.

Referenced by readFile1().

06861 {
06862     unsigned short group;
06863     unsigned short element;
06864 
06865     group = DCM_TAG_GROUP(e->tag);
06866     element = DCM_TAG_ELEMENT(e->tag);
06867 
06868     if ((long) group == *lastGroup) {
06869         if (((long) element == *lastElement) && allowRepeatElements) {
06870           return DCM_REPEATEDELEMENT;
06871         }
06872         if ((long) element <= *lastElement)
06873             return COND_PushCondition(DCM_ELEMENTOUTOFORDER,
06874                                       DCM_Message(DCM_ELEMENTOUTOFORDER),
06875                                       group, element, "checkAttributeOrder");
06876     } else if ((long) group > *lastGroup) {
06877     } else {
06878         return COND_PushCondition(DCM_ELEMENTOUTOFORDER,
06879                                   DCM_Message(DCM_ELEMENTOUTOFORDER),
06880                                   group, element, "checkAttributeOrder");
06881     }
06882     *lastGroup = (long) group;
06883     *lastElement = (long) element;
06884 
06885     return DCM_NORMAL;
06886 }

CONDITION checkObject PRIVATE_OBJECT **    object,
char *    caller
[static]
 

Definition at line 4988 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), DCM_ILLEGALOBJECT, DCM_Message(), DCM_NORMAL, DCM_NULLOBJECT, KEY_DCM_OBJECT, and object.

Referenced by DCM_AddElement(), DCM_AddFragment(), DCM_AddSequenceElement(), DCM_CloseObject(), DCM_CompareAttributes(), DCM_ComputeExportLength(), DCM_DumpElements(), DCM_FormatElements(), DCM_GetCompressedValue(), DCM_GetElement(), DCM_GetElementSize(), DCM_GetElementValue(), DCM_GetElementValueList(), DCM_GetElementValueOffset(), DCM_GetFirstElement(), DCM_GetNextElement(), DCM_GetObjectSize(), DCM_GetSequenceByOffset(), DCM_GetSequenceElement(), DCM_GetSequenceList(), DCM_GroupPresent(), DCM_ModifyElements(), DCM_ParseObject(), DCM_PrintSequenceList(), DCM_RemoveElement(), DCM_RemoveGroup(), DCM_ScanParseObject(), DCM_WriteFile(), and exportStream().

04989 {
04990     if (object == NULL)
04991         return COND_PushCondition(DCM_NULLOBJECT, DCM_Message(DCM_NULLOBJECT),
04992                                   caller);
04993     if (*object == NULL)
04994         return COND_PushCondition(DCM_NULLOBJECT, DCM_Message(DCM_NULLOBJECT),
04995                                   caller);
04996 
04997     if (strcmp((*object)->keyType, KEY_DCM_OBJECT) != 0)
04998         return COND_PushCondition(DCM_ILLEGALOBJECT,
04999                                   DCM_Message(DCM_ILLEGALOBJECT), caller);
05000     return DCM_NORMAL;
05001 }

void compareGroup PRV_GROUP_ITEM   g1,
PRV_GROUP_ITEM   g2,
void(*    callback)(const DCM_ELEMENT *e1, const DCM_ELEMENT *e2, void *ctx),
void *    ctx
[static]
 

Definition at line 7598 of file l_mri_dicom_hdr.c.

References PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, LST_Head(), LST_Next(), LST_Position(), and DCM_ELEMENT::tag.

Referenced by DCM_CompareAttributes().

07603 {
07604     PRV_ELEMENT_ITEM *e1 = NULL,
07605        *e2 = NULL;
07606 
07607     if (g1 != NULL) {
07608         e1 = (void *)LST_Head(&g1->elementList);
07609         if (e1 != NULL)
07610             LST_Position(&g1->elementList, (void *)e1);
07611     }
07612     if (g2 != NULL) {
07613         e2 = (void *)LST_Head(&g2->elementList);
07614         if (e2 != NULL)
07615             LST_Position(&g2->elementList, (void *)e2);
07616     }
07617     while (e1 != NULL) {
07618         if (e2 == NULL) {
07619             callback(&e1->element, NULL, ctx);
07620             e1 = (void *)LST_Next(&g1->elementList);
07621         } else if (e1->element.tag == e2->element.tag) {
07622             callback(&e1->element, &e2->element, ctx);
07623             e1 = (void *)LST_Next(&g1->elementList);
07624             e2 = (void *)LST_Next(&g2->elementList);
07625         } else if (e1->element.tag < e2->element.tag) {
07626             callback(&e1->element, NULL, ctx);
07627             e1 = (void *)LST_Next(&g1->elementList);
07628         } else {
07629             callback(NULL, &e2->element, ctx);
07630             e2 = (void *)LST_Next(&g2->elementList);
07631         }
07632     }
07633 
07634     while (e2 != NULL) {
07635         callback(NULL, &e2->element, ctx);
07636         e2 = (void *)LST_Next(&g2->elementList);
07637     }
07638 }

U32 computeGroupLength PRV_GROUP_ITEM   groupItem,
CTNBOOLEAN    explicitVR
[static]
 

Definition at line 5141 of file l_mri_dicom_hdr.c.

References PRV_GROUP_ITEM::baseLength, CTNBOOLEAN, and PRV_GROUP_ITEM::longVRAttributes.

Referenced by exportStream().

05143 {
05144     return (explicitVR) ?
05145     groupItem->baseLength + 4 * groupItem->longVRAttributes :
05146     groupItem->baseLength;
05147 
05148 }

void computeVM PRIVATE_OBJECT **    object,
DCM_ELEMENT   element
[static]
 

Definition at line 7290 of file l_mri_dicom_hdr.c.

References c, DCM_ELEMENT::d, DCM_AE, DCM_AS, DCM_AT, DCM_CS, DCM_CTX, DCM_DA, DCM_DD, DCM_DS, DCM_DT, DCM_FD, DCM_FL, DCM_IS, DCM_LO, DCM_LT, DCM_OT, DCM_PN, DCM_RET, DCM_SH, DCM_SL, DCM_SQ, DCM_SS, DCM_ST, DCM_TM, DCM_UI, DCM_UL, DCM_UN, DCM_US, DCM_UT, i, DCM_ELEMENT::length, DCM_ELEMENT::multiplicity, object, and DCM_ELEMENT::representation.

Referenced by readFile(), and readFile1().

07291 {
07292     char
07293        *c;
07294     int
07295         i;
07296 
07297     switch (element->representation) {
07298     case DCM_AE:                /* Application Entity */
07299     case DCM_AS:                /* Age string */
07300     case DCM_CS:                /* Control string */
07301     case DCM_DA:                /* Date */
07302     case DCM_DS:                /* Decimal string */
07303     case DCM_DT:                /* Date/Time */
07304     case DCM_IS:                /* Integer string */
07305     case DCM_LO:                /* Long string */
07306     case DCM_PN:                /* Person Name */
07307     case DCM_SH:                /* Short string */
07308     case DCM_TM:                /* Time */
07309     case DCM_UI:                /* Unique identifier (UID) */
07310     case DCM_UT:                /* Unlimited text */
07311         element->multiplicity = 1;
07312         c = element->d.string;
07313         for (i = 0; i < (int) element->length; i++)
07314             if (*c++ == '\\')
07315                 element->multiplicity++;
07316         break;
07317 
07318     case DCM_FD:                /* Floating double */
07319         element->multiplicity = element->length / 8;
07320         break;
07321     case DCM_AT:                /* Attribute tag */
07322     case DCM_FL:                /* Float */
07323     case DCM_SL:                /* Signed long */
07324     case DCM_UL:                /* Unsigned long */
07325         element->multiplicity = element->length / 4;
07326         break;
07327     case DCM_SS:                /* Signed short */
07328     case DCM_US:                /* Unsigned short */
07329         element->multiplicity = element->length / 2;
07330         break;
07331     case DCM_LT:                /* Long text */
07332     case DCM_OT:                /* Other binary value */
07333     case DCM_SQ:                /* Sequence of items */
07334     case DCM_ST:                /* Short text */
07335     /*case DCM_UNKNOWN:*/
07336     case DCM_UN:
07337     case DCM_RET:
07338     case DCM_CTX:
07339     case DCM_DD:                /* Data set */
07340     default:
07341         element->multiplicity = 1;
07342         break;
07343     }
07344 }

void COND_CopyText char *    txt,
size_t    length
 

Definition at line 680 of file l_mri_dicom_hdr.c.

References i, and stackPtr.

00681 {
00682     size_t i;
00683     int j;
00684 
00685     txt[0] = '\0';
00686 
00687     j = stackPtr;
00688     while (length > 2 && j >= 0) {
00689         i = strlen(EDBStack[j].statusText);
00690         if (i > length)
00691             i = length - 2;
00692         strncpy(txt, EDBStack[j].statusText, i);
00693         txt[i++] = '\n';
00694         txt[i] = '\0';
00695         length -= i;
00696         txt += i;
00697         j--;
00698     }
00699 }

void COND_DumpConditions void   
 

Definition at line 637 of file l_mri_dicom_hdr.c.

References dumpstack(), and stackPtr.

00638 {
00639 
00640     dumpstack(stderr);
00641     stackPtr = -1;
00642 }

CONDITION COND_EstablishCallback void(*    callback)()
 

Definition at line 613 of file l_mri_dicom_hdr.c.

References COND_NORMAL, and ErrorCallback.

00614 {
00615 
00616     ErrorCallback = callback;
00617 
00618     return COND_NORMAL;
00619 }

CONDITION COND_ExtractConditions CTNBOOLEAN(*    callback)()
 

Definition at line 467 of file l_mri_dicom_hdr.c.

References AFNI_CALL_VALU_2ARG, COND_NORMAL, CONDITION, and stackPtr.

00468 {
00469     int
00470         index,
00471         returnflag;
00472 
00473     for (index = stackPtr, returnflag = 1; index >= 0 && returnflag != 0;
00474          index--) {
00475 #if 0
00476         returnflag = callback(EDBStack[index].statusCode,
00477                               EDBStack[index].statusText);
00478 #else
00479         AFNI_CALL_VALU_2ARG( callback , int,returnflag            ,
00480                              CONDITION,EDBStack[index].statusCode ,
00481                              char *   ,EDBStack[index].statusText  ) ;
00482 #endif
00483     }
00484 
00485     return COND_NORMAL;
00486 }

CONDITION COND_PopCondition CTNBOOLEAN    clearstack
 

Definition at line 566 of file l_mri_dicom_hdr.c.

References COND_NORMAL, CONDITION, CTNBOOLEAN, and stackPtr.

Referenced by DCM_AddElement(), DCM_AddSequenceElement(), DCM_GetString(), DCM_ModifyElements(), DCM_ParseObject(), mri_dicom_header(), readFile(), and readGroupElement().

00567 {
00568     CONDITION
00569         value;
00570 
00571     if (stackPtr >= 0)
00572         value = EDBStack[stackPtr].statusCode;
00573     else
00574         value = COND_NORMAL;
00575 
00576     if (clearstack) {
00577         stackPtr = -1;
00578     } else if (stackPtr <= 0) {
00579         stackPtr = -1;
00580     } else {
00581         stackPtr--;
00582     }
00583 
00584     return value;
00585 }

CONDITION COND_PushCondition CONDITION    cond,
char *    controlString,
...   
 

Definition at line 395 of file l_mri_dicom_hdr.c.

References AFNI_CALL_VOID_2ARG, args, CONDITION, dumpstack(), ErrorCallback, MAXEDB, and stackPtr.

Referenced by checkAttributeOrder(), checkObject(), copyData(), DCM_AddElement(), DCM_AddFragment(), DCM_AddSequenceElement(), DCM_CloseObject(), DCM_CopyObject(), DCM_CreateObject(), DCM_GetCompressedValue(), DCM_GetElement(), DCM_GetElementSize(), DCM_GetElementValue(), DCM_GetElementValueList(), DCM_GetElementValueOffset(), DCM_GetSequenceByOffset(), DCM_GetSequenceElement(), DCM_GetSequenceList(), DCM_ImportStream(), DCM_ListToString(), DCM_LookupElement(), DCM_MergeObject(), DCM_OpenFile(), DCM_PrintSequenceList(), DCM_ReadStream(), DCM_RemoveElement(), DCM_RemoveGroup(), DCM_WriteFile(), exportData(), exportEncapsulatedPixels(), exportPixels(), exportPreamble(), exportStream(), extractFileOptions(), findCreateGroup(), handleGroupItem(), insertNewElement(), insertThisElementItem(), newElementItem(), readData(), readFile(), readFile1(), readGroupElement(), readLengthToEnd(), readPreamble(), readSequence(), readVRLength(), and writeFile().

00396 {
00397     va_list
00398         args;
00399     char
00400         buffer[1024];
00401 
00402 /*lint -e40 -e50 */
00403     va_start(args, controlString);
00404     if (controlString == NULL)
00405         controlString = "NULL Control string passedto PushCondition";
00406     (void) vsprintf(buffer, controlString, args);
00407     va_end(args);
00408 /*lint +e40 +e50 */
00409 
00410     stackPtr++;
00411     EDBStack[stackPtr].statusCode = cond;
00412     buffer[256] = '\0';
00413 
00414     (void) strcpy(EDBStack[stackPtr].statusText, buffer);
00415     if (ErrorCallback != NULL)
00416 #if 0
00417         ErrorCallback(EDBStack[stackPtr].statusCode,
00418                       EDBStack[stackPtr].statusText);
00419 #else
00420         AFNI_CALL_VOID_2ARG( ErrorCallback ,
00421                              CONDITION,EDBStack[stackPtr].statusCode ,
00422                              char *   ,EDBStack[stackPtr].statusText  ) ;
00423 #endif
00424 
00425     if (stackPtr >= MAXEDB - 2) {
00426         dumpstack(stderr);
00427         fprintf(stderr, "CONDITION Stack overflow\n");
00428         stackPtr = 0;
00429     }
00430 
00431     return cond;
00432 
00433 }

CONDITION COND_TopCondition CONDITION   code,
char *    text,
unsigned long    maxlength
 

Definition at line 520 of file l_mri_dicom_hdr.c.

References COND_NORMAL, CONDITION, and stackPtr.

00521 {
00522     CONDITION rtnValue;
00523 
00524     if (stackPtr >= 0) {
00525         *code = EDBStack[stackPtr].statusCode;
00526         (void) strncpy(text, EDBStack[stackPtr].statusText, maxlength - 1);
00527         text[maxlength - 1] = '\0';
00528         rtnValue = EDBStack[stackPtr].statusCode;
00529     } else {
00530         *code = COND_NORMAL;
00531         *text = '\0';
00532         rtnValue = COND_NORMAL;
00533     }
00534 
00535     return rtnValue;
00536 }

void COND_WriteConditions FILE *    lfp
 

Definition at line 716 of file l_mri_dicom_hdr.c.

References dumpstack(), and stackPtr.

00717 {
00718     dumpstack(lfp);
00719     stackPtr = -1;
00720 }

CONDITION copyData PRIVATE_OBJECT **    object,
PRV_ELEMENT_ITEM   item,
DCM_ELEMENT   to,
U32   rtnLength
[static]
 

Definition at line 7393 of file l_mri_dicom_hdr.c.

References PRV_ELEMENT_ITEM::byteOrder, BYTEORDER_REVERSE, COND_PushCondition(), CONDITION, DCM_ELEMENT::d, PRV_ELEMENT_ITEM::dataOffset, DCM_AT, DCM_CANNOTGETSEQUENCEVALUE, DCM_FILEACCESSERROR, DCM_GETINCOMPLETE, DCM_Message(), DCM_NORMAL, DCM_SQ, PRV_ELEMENT_ITEM::element, l, DCM_ELEMENT::length, MIN, object, p, q, read(), DCM_ELEMENT::representation, swapATGroupElement(), swapInPlace(), DCM_ELEMENT::tag, and U32.

Referenced by DCM_ScanParseObject().

07395 {
07396     unsigned char *p = NULL;
07397     U32 l;
07398     int nBytes;
07399     CONDITION cond;
07400 
07401     if (from->element.representation == DCM_SQ)
07402         return COND_PushCondition(DCM_CANNOTGETSEQUENCEVALUE,
07403                                   DCM_Message(DCM_CANNOTGETSEQUENCEVALUE),
07404                               from->element.tag, "copyData (DCM internal)");
07405 
07406     l = MIN(from->element.length, to->length);
07407     if (rtnLength != NULL)
07408         *rtnLength = l;
07409 
07410     if (from->element.d.ot == NULL) {
07411         if ((*object)->fd != -1) {
07412             (void) lseek((*object)->fd,
07413                          from->dataOffset + (off_t) p, SEEK_SET);
07414             nBytes = read((*object)->fd, to->d.ot, (int) l);
07415         } else {
07416             (*object)->sk((*object)->userCtx,
07417                           (long) (from->dataOffset + (off_t) p), SEEK_SET);
07418             cond = (*object)->rd((*object)->userCtx, to->d.ot, (long) l, &nBytes);
07419         }
07420         if (nBytes != (int) l) {
07421             return COND_PushCondition(DCM_FILEACCESSERROR,
07422                                       DCM_Message(DCM_FILEACCESSERROR),
07423                                       (*object)->fileName,
07424                                       "copyData (DCM internal)");
07425         }
07426         if( LITTLE_ENDIAN_ARCHITECTURE ){
07427           if (from->element.representation == DCM_AT) {
07428             DCM_ELEMENT e;
07429             e = from->element;
07430             e.length = l;
07431             e.d.ot = to->d.ot;
07432             swapATGroupElement(&e);
07433           }
07434         }
07435         if (from->byteOrder == BYTEORDER_REVERSE) {
07436             DCM_ELEMENT e;
07437             e = from->element;
07438             e.length = l;
07439             e.d.ot = to->d.ot;
07440             swapInPlace(object, &e);
07441         }
07442     } else {
07443         unsigned char *q;
07444         q = (unsigned char *) from->element.d.ot +
07445             (U32) p;
07446         (void) memcpy(to->d.ot, q, l);
07447     }
07448     p += l;
07449     if ((unsigned) p == from->element.length)
07450         return DCM_NORMAL;
07451     else
07452         return DCM_GETINCOMPLETE;
07453 }

void copySequence PRIVATE_OBJECT **    dstObj,
DCM_ELEMENT   e
[static]
 

Definition at line 7657 of file l_mri_dicom_hdr.c.

References AFMALL, DCM_ELEMENT::d, DCM_AddSequenceElement(), DCM_CopyObject(), DCM_OBJECT, LST_Create(), LST_Enqueue(), LST_Head(), LST_Next(), LST_Position(), DCM_SEQUENCE_ITEM::object, DCM_ELEMENT::representation, and DCM_ELEMENT::tag.

Referenced by DCM_CopyObject(), and DCM_MergeObject().

07658 {
07659     LST_HEAD *lst;
07660     DCM_SEQUENCE_ITEM *sqItem;
07661     DCM_ELEMENT newElement;
07662 
07663     lst = LST_Create();
07664     if (e->d.sq != NULL) {
07665         sqItem = (void *)LST_Head(&e->d.sq);
07666         (void) LST_Position(&e->d.sq, (void *)sqItem);
07667     }
07668     while (sqItem != NULL) {
07669         DCM_OBJECT *copy;
07670         DCM_SEQUENCE_ITEM *copyItem;
07671 
07672         DCM_CopyObject(&sqItem->object, &copy);
07673         copyItem = AFMALL( DCM_SEQUENCE_ITEM, sizeof(*copyItem));
07674         copyItem->object = copy;
07675         (void) LST_Enqueue(&lst, (void *)copyItem);
07676 
07677         sqItem = (void *)LST_Next(&e->d.sq);
07678     }
07679 
07680     memset(&newElement, 0, sizeof(newElement));
07681     newElement.tag = e->tag;
07682     newElement.representation = e->representation;
07683     newElement.d.sq = lst;
07684     DCM_AddSequenceElement((DCM_OBJECT **) dstObj, &newElement);
07685 }

CONDITION countBytes void *    buffer,
U32    length,
int    flag,
void *    sizePtr
[static]
 

Definition at line 5047 of file l_mri_dicom_hdr.c.

References DCM_NORMAL, and U32.

Referenced by DCM_ComputeExportLength().

05049 {
05050     unsigned long *size;
05051 
05052     size = (unsigned long *) sizePtr;
05053 
05054     *size += length;
05055 
05056     return DCM_NORMAL;
05057 }

void ctxSensitiveLookup PRIVATE_OBJECT **    object,
DCM_ELEMENT   element
[static]
 

Definition at line 7361 of file l_mri_dicom_hdr.c.

References DCM_IMGLARGESTIMAGEPIXELVALUE, DCM_IMGLARGESTIMAGEPIXELVALUEPLANE, DCM_IMGLARGESTPIXELVALUESERIES, DCM_IMGLOOKUPDATABLUE, DCM_IMGLOOKUPDATAGREEN, DCM_IMGLOOKUPDATARED, DCM_IMGLUTDATA, DCM_IMGLUTDESCRIPTOR, DCM_IMGSMALLESTIMAGEPIXELVALUE, DCM_IMGSMALLESTIMAGEPIXELVALUEPLANE, DCM_IMGSMALLESTPIXELVALUESERIES, DCM_MAKETAG, DCM_SS, DCM_US, object, DCM_ELEMENT::representation, and DCM_ELEMENT::tag.

Referenced by readFile(), and readGroupElement().

07362 {
07363     switch (element->tag) {
07364         case DCM_IMGSMALLESTIMAGEPIXELVALUE:
07365         case DCM_IMGLARGESTIMAGEPIXELVALUE:
07366         case DCM_IMGSMALLESTPIXELVALUESERIES:
07367         case DCM_IMGLARGESTPIXELVALUESERIES:
07368         case DCM_IMGSMALLESTIMAGEPIXELVALUEPLANE:
07369         case DCM_IMGLARGESTIMAGEPIXELVALUEPLANE:
07370         case DCM_IMGLUTDESCRIPTOR:
07371         case DCM_IMGLUTDATA:
07372         case DCM_IMGLOOKUPDATARED:
07373         case DCM_IMGLOOKUPDATAGREEN:
07374         case DCM_IMGLOOKUPDATABLUE:
07375         if ((*object)->pixelRepresentation == 0x0000)
07376             element->representation = DCM_US;
07377         else if ((*object)->pixelRepresentation == 0x0001)
07378             element->representation = DCM_SS;
07379         else
07380             element->representation = DCM_US;
07381         break;
07382     case DCM_MAKETAG(0x003a, 0x1000):
07383         if (strcmp((*object)->waveformDataVR, "SS") == 0)
07384             element->representation = DCM_SS;
07385         break;
07386 
07387     default:
07388         break;
07389     }
07390 }

CONDITION DCM_AddElement DCM_OBJECT **    callerObject,
DCM_ELEMENT   element
 

Definition at line 1335 of file l_mri_dicom_hdr.c.

References checkObject(), COND_PopCondition(), COND_PushCondition(), CONDITION, DCM_CTX, DCM_ILLEGALADD, DCM_ILLEGALREPRESENTATION, DCM_INSERTFAILED, DCM_LookupElement(), DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_OT, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_UN, findCreateGroup(), insertNewElement(), object, DCM_ELEMENT::representation, DCM_ELEMENT::tag, and updateObjectType().

Referenced by DCM_AddElementList(), DCM_CopyObject(), DCM_MergeObject(), and DCM_ModifyElements().

01336 {
01337     CONDITION
01338         cond;
01339     DCM_ELEMENT
01340         localElement;
01341     PRIVATE_OBJECT
01342         ** object;
01343     PRV_GROUP_ITEM
01344         * groupItem;
01345 
01346     object = (PRIVATE_OBJECT **) callerObject;
01347 
01348     cond = checkObject(object, "DCM_AddElement");
01349     if (cond != DCM_NORMAL)
01350         return cond;
01351 
01352     if ((DCM_TAG_ELEMENT(element->tag) == 0x0000))
01353         return COND_PushCondition(DCM_ILLEGALADD,
01354                    DCM_Message(DCM_ILLEGALADD), DCM_TAG_GROUP(element->tag),
01355                            DCM_TAG_ELEMENT(element->tag), "DCM_AddElement");
01356 
01357 
01358     localElement = *element;
01359 
01360     cond = DCM_LookupElement(&localElement);
01361     if (cond != DCM_NORMAL) {
01362         (void) COND_PopCondition(0);
01363         localElement = *element;
01364     } else {
01365         if (localElement.representation == DCM_OT ||
01366             localElement.representation == DCM_CTX)
01367             localElement.representation = element->representation;
01368         if (element->representation != DCM_UN &&
01369             element->representation != localElement.representation) {
01370             return COND_PushCondition(DCM_ILLEGALREPRESENTATION,
01371                                       DCM_Message(DCM_ILLEGALREPRESENTATION),
01372                                       DCM_TAG_GROUP(element->tag),
01373                                       DCM_TAG_ELEMENT(element->tag),
01374                                       "DCM_AddElement");
01375         }
01376     }
01377 
01378     cond = findCreateGroup(object, DCM_TAG_GROUP(localElement.tag), &groupItem);
01379     if (cond != DCM_NORMAL)
01380         return COND_PushCondition(DCM_INSERTFAILED,
01381                  DCM_Message(DCM_INSERTFAILED), DCM_TAG_GROUP(element->tag),
01382                                   DCM_TAG_ELEMENT(element->tag),
01383                                   "DCM_AddElement");
01384 
01385     cond = insertNewElement(object, &localElement);
01386     if (cond != DCM_NORMAL)
01387         return COND_PushCondition(DCM_INSERTFAILED,
01388                  DCM_Message(DCM_INSERTFAILED), DCM_TAG_GROUP(element->tag),
01389                                   DCM_TAG_ELEMENT(element->tag),
01390                                   "DCM_AddElement");
01391 
01392     cond = updateObjectType(object, &localElement);
01393     if (cond != DCM_NORMAL)
01394         return COND_PushCondition(DCM_INSERTFAILED,
01395                  DCM_Message(DCM_INSERTFAILED), DCM_TAG_GROUP(element->tag),
01396                                   DCM_TAG_ELEMENT(element->tag),
01397                                   "DCM_AddElement");
01398 
01399     return DCM_NORMAL;
01400 }

CONDITION DCM_AddElementList DCM_OBJECT **    callerObject,
DCM_ELEMENT   element,
LST_HEAD   list,
long    offset
 

Definition at line 3335 of file l_mri_dicom_hdr.c.

References CONDITION, CTN_FREE, DCM_ELEMENT::d, DCM_AddElement(), DCM_ListToString(), DCM_NORMAL, DCM_OBJECT, DCM_ELEMENT::length, and offset.

03337 {
03338     DCM_ELEMENT
03339         e;                      /* Local copy of caller's element */
03340     CONDITION
03341         cond;
03342     char
03343        *s;
03344 
03345     e = *element;
03346     cond = DCM_ListToString(list, offset, &s);
03347     if (cond != DCM_NORMAL)
03348         return cond;
03349 
03350     e.d.string = s;
03351     e.length = strlen(s);
03352     cond = DCM_AddElement(callerObject, &e);
03353     CTN_FREE(s);
03354     return cond;
03355 }

CONDITION DCM_AddFragment DCM_OBJECT **    callerObject,
void *    fragment,
U32    fragmentLength
 

Definition at line 8124 of file l_mri_dicom_hdr.c.

References checkObject(), COND_PushCondition(), CONDITION, CTN_MALLOC, DCM_ELEMENT::d, DCM_INSERTFAILED, DCM_LISTFAILURE, DCM_MALLOCFAILURE, DCM_Message(), DCM_NORMAL, DCM_OB, DCM_OBJECT, DCM_PXLPIXELDATA, DCM_UNEVENFRAGMENTLENGTH, PRV_ELEMENT_ITEM::element, findCreateGroup(), DCM_FRAGMENT_ITEM::fragment, PRV_ELEMENT_ITEM::fragmentFlag, insertThisElementItem(), DCM_FRAGMENT_ITEM::length, DCM_ELEMENT::length, locateElement(), LST_Create(), LST_Enqueue(), DCM_ELEMENT::multiplicity, newElementItem(), object, DCM_ELEMENT::representation, DCM_ELEMENT::tag, and U32.

08125 {
08126   PRIVATE_OBJECT** object;
08127   PRV_ELEMENT_ITEM* elementItem;
08128   PRV_ELEMENT_ITEM* newItem;
08129   CONDITION cond;
08130   PRV_GROUP_ITEM *groupItem = 0;
08131   DCM_FRAGMENT_ITEM* fragmentItem;
08132   U32 mallocLength;
08133 
08134   if ((fragmentLength & 1) != 0) {
08135     return COND_PushCondition(DCM_UNEVENFRAGMENTLENGTH,
08136          DCM_Message(DCM_UNEVENFRAGMENTLENGTH), fragmentLength, "DCM_AddFragment");
08137   }
08138 
08139   object = (PRIVATE_OBJECT **) callerObject;
08140   cond = checkObject(object, "DCM_AddFragment");
08141   if (cond != DCM_NORMAL)
08142     return cond;
08143 
08144   cond = findCreateGroup(object, 0x7fe0, &groupItem);
08145   if (cond != DCM_NORMAL)
08146     return COND_PushCondition(DCM_INSERTFAILED,
08147          DCM_Message(DCM_INSERTFAILED), 0x7fe0, 0x0010, "DCM_AddFragment");
08148 
08149   elementItem = locateElement(object, 0x7fe00010);
08150   if (elementItem == NULL) {
08151     DCM_ELEMENT e;
08152     memset(&e, 0, sizeof(e));
08153     e.tag = DCM_PXLPIXELDATA;
08154     e.representation = DCM_OB;
08155     e.multiplicity = 1;
08156     e.length = 0;
08157     e.d.fragments = 0;
08158     cond = newElementItem(&e, FALSE, &newItem);
08159     if (cond != DCM_NORMAL)
08160       return cond;
08161     newItem->element.d.fragments = LST_Create();
08162     if (newItem->element.d.fragments == NULL) {
08163       return COND_PushCondition(DCM_LISTFAILURE,
08164                 DCM_Message(DCM_LISTFAILURE), "DCM_AddFragment");
08165     }
08166     cond = insertThisElementItem(object, newItem);
08167     if (cond != DCM_NORMAL)
08168       return cond;
08169   }
08170 
08171   elementItem = locateElement(object, 0x7fe00010);
08172 
08173   mallocLength = sizeof(DCM_FRAGMENT_ITEM) + fragmentLength;
08174   fragmentItem = CTN_MALLOC(mallocLength);
08175   if (fragmentItem == NULL) {
08176     return COND_PushCondition(DCM_MALLOCFAILURE,
08177                                 DCM_Message(DCM_MALLOCFAILURE), mallocLength,
08178                                 "DCM_AddFragment");
08179   }
08180 
08181   fragmentItem->fragment = ((char*)fragmentItem)+ sizeof(DCM_FRAGMENT_ITEM);
08182   fragmentItem->length = fragmentLength;
08183   memcpy(fragmentItem->fragment, fragment, fragmentLength);
08184   elementItem->fragmentFlag = 1;
08185   LST_Enqueue(&elementItem->element.d.fragments, (void *)fragmentItem);
08186 
08187   return DCM_NORMAL;
08188 }

CONDITION DCM_AddSequenceElement DCM_OBJECT **    callerObject,
DCM_ELEMENT   element
 

Definition at line 1426 of file l_mri_dicom_hdr.c.

References checkObject(), COND_PopCondition(), COND_PushCondition(), CONDITION, DCM_ELEMENT::d, DCM_ILLEGALADD, DCM_INSERTFAILED, DCM_LookupElement(), DCM_Message(), DCM_NORMAL, DCM_NOTASEQUENCE, DCM_OBJECT, DCM_SQ, DCM_TAG_ELEMENT, DCM_TAG_GROUP, findCreateGroup(), insertNewElement(), object, DCM_ELEMENT::representation, DCM_ELEMENT::tag, and updateObjectType().

Referenced by copySequence().

01427 {
01428     CONDITION cond;
01429     DCM_ELEMENT localElement;
01430     PRIVATE_OBJECT **object;
01431     PRV_GROUP_ITEM *groupItem;
01432 
01433     object = (PRIVATE_OBJECT **) callerObject;
01434 
01435     cond = checkObject(object, "DCM_AddSequenceElement");
01436     if (cond != DCM_NORMAL)
01437         return cond;
01438 
01439     if ((DCM_TAG_ELEMENT(element->tag) == 0x0000))
01440         return COND_PushCondition(DCM_ILLEGALADD,
01441                    DCM_Message(DCM_ILLEGALADD), DCM_TAG_GROUP(element->tag),
01442                            DCM_TAG_ELEMENT(element->tag), "DCM_AddElement");
01443 
01444 
01445     localElement = *element;
01446 
01447     cond = DCM_LookupElement(&localElement);
01448     if (cond != DCM_NORMAL) {
01449         (void) COND_PopCondition(0);
01450         localElement = *element;
01451     } else {
01452         localElement.representation = element->representation;
01453     }
01454     if (localElement.representation != DCM_SQ) {
01455         return COND_PushCondition(DCM_NOTASEQUENCE,
01456                                   DCM_Message(DCM_NOTASEQUENCE),
01457                                   DCM_TAG_GROUP(localElement.tag),
01458                                   DCM_TAG_ELEMENT(localElement.tag),
01459                                   "DCM_AddSequenceElement");
01460     }
01461     cond = findCreateGroup(object, DCM_TAG_GROUP(localElement.tag), &groupItem);
01462     if (cond != DCM_NORMAL)
01463         return COND_PushCondition(DCM_INSERTFAILED,
01464                  DCM_Message(DCM_INSERTFAILED), DCM_TAG_GROUP(element->tag),
01465                                   DCM_TAG_ELEMENT(element->tag),
01466                                   "DCM_AddSequenceElement");
01467 
01468     cond = insertNewElement(object, &localElement);
01469     if (cond != DCM_NORMAL)
01470         return COND_PushCondition(DCM_INSERTFAILED,
01471                  DCM_Message(DCM_INSERTFAILED), DCM_TAG_GROUP(element->tag),
01472                                   DCM_TAG_ELEMENT(element->tag),
01473                                   "DCM_AddElement");
01474 
01475     cond = updateObjectType(object, &localElement);
01476     if (cond != DCM_NORMAL)
01477         return COND_PushCondition(DCM_INSERTFAILED,
01478                  DCM_Message(DCM_INSERTFAILED), DCM_TAG_GROUP(element->tag),
01479                                   DCM_TAG_ELEMENT(element->tag),
01480                                   "DCM_AddSequenceElement");
01481 
01482     /*
01483      * We have taken ownership of the sequence list, so zero out caller's
01484      * copy
01485      */
01486     element->d.sq = NULL;
01487 
01488     return DCM_NORMAL;
01489 }

CONDITION DCM_CloseObject DCM_OBJECT **    callerObject
 

Definition at line 1208 of file l_mri_dicom_hdr.c.

References checkObject(), close(), COND_PushCondition(), CONDITION, CTN_FREE, DCM_ELEMENT::d, DCM_FILEDELETEFAILED, DCM_LISTFAILURE, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_SQ, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, PRV_ELEMENT_ITEM::fragmentFlag, PRV_GROUP_ITEM::group, LST_Destroy(), LST_NORMAL, LST_Pop(), DCM_SEQUENCE_ITEM::object, object, DCM_ELEMENT::representation, DCM_ELEMENT::tag, and unlink.

Referenced by DCM_CloseObject(), handleGroupItem(), mri_dicom_header(), readData(), readFile(), readFile1(), readGroupElement(), readLengthToEnd(), readPreamble(), and readVRLength().

01209 {
01210     CONDITION
01211         cond;
01212     PRV_GROUP_ITEM
01213         * group;
01214     PRV_ELEMENT_ITEM
01215         * element;
01216     PRIVATE_OBJECT
01217         ** object;
01218     DCM_SEQUENCE_ITEM
01219         * sequenceItem;
01220     DCM_FRAGMENT_ITEM* fragmentItem;
01221 
01222     if (debug)
01223         fprintf(stderr, "Starting DCM_CloseObject\n");
01224 
01225     object = (PRIVATE_OBJECT **) callerObject;
01226     cond = checkObject(object, "DCM_CloseObject");
01227     if (cond != DCM_NORMAL)
01228         return cond;
01229 
01230     if ((*object)->fd > 0)
01231         (void) close((*object)->fd);
01232 
01233     if (debug)
01234         fprintf(stderr, "DCM_CloseObject: Legal object and file closed\n");
01235 
01236     while ((group = (void *)LST_Pop(&(*object)->groupList)) != NULL) {
01237         if (debug)
01238             fprintf(stderr, "DCM_CloseObject: group %04x\n", group->group);
01239 
01240         while ((element = (void *)LST_Pop(&group->elementList)) != NULL) {
01241             if (debug)
01242                 fprintf(stderr, "DCM_CloseObject: Element %08x\n",
01243                         element->element.tag);
01244             if (element->element.representation == DCM_SQ) {
01245                 if (debug)
01246                     fprintf(stderr, "Sequence List Address: %p\n",
01247                             element->element.d.sq);
01248                 if (element->element.d.sq != NULL) {
01249                     while ((sequenceItem = (void *)LST_Pop(&element->element.d.sq)) != NULL) {
01250                         (void) DCM_CloseObject(&sequenceItem->object);
01251                         CTN_FREE(sequenceItem);
01252                     }
01253                     (void) LST_Destroy(&element->element.d.sq);
01254                 }
01255             } else if (element->fragmentFlag) {
01256                 if (debug)
01257                     fprintf(stderr, "Fragment List Address: %p\n",
01258                             element->element.d.fragments);
01259                 if (element->element.d.fragments != NULL) {
01260                     while ((fragmentItem = (void *)LST_Pop(&element->element.d.fragments)) != NULL) {
01261                         CTN_FREE(fragmentItem);
01262                     }
01263                     (void) LST_Destroy(&element->element.d.fragments);
01264                 }
01265             }
01266             if (debug)
01267                 fprintf(stderr, "DCM_CloseObject: free %8p\n", element);
01268 
01269             CTN_FREE(element);
01270         }
01271         cond = LST_Destroy(&group->elementList);
01272         if (cond != LST_NORMAL)
01273             return COND_PushCondition(DCM_LISTFAILURE,
01274                            DCM_Message(DCM_LISTFAILURE), "DCM_CloseObject");
01275         CTN_FREE(group);
01276     }
01277     cond = LST_Destroy(&(*object)->groupList);
01278     if (cond != LST_NORMAL)
01279         return COND_PushCondition(DCM_LISTFAILURE,
01280                            DCM_Message(DCM_LISTFAILURE), "DCM_CloseObject");
01281 
01282     cond = DCM_NORMAL;
01283     if ((*object)->deleteFlag) {
01284         if (unlink((*object)->fileName) != 0) {
01285 /****    (void) COND_PushCondition(DCM_FILEDELETEFAILED, strerror(errno));****/
01286             cond = COND_PushCondition(DCM_FILEDELETEFAILED,
01287                                       DCM_Message(DCM_FILEDELETEFAILED), (*object)->fileName, strerror(errno),
01288                                       "DCM_CloseObject");
01289 
01290         }
01291     }
01292     CTN_FREE(*object);
01293     *object = NULL;
01294     return cond;
01295 }

CONDITION DCM_CompareAttributes DCM_OBJECT **    o1,
DCM_OBJECT **    o2,
void(*    callback)(const DCM_ELEMENT *e1, const DCM_ELEMENT *e2, void *ctx),
void *    ctx
 

Definition at line 3433 of file l_mri_dicom_hdr.c.

References checkObject(), compareGroup(), CONDITION, DCM_NORMAL, DCM_OBJECT, PRV_GROUP_ITEM::group, LST_Head(), LST_Next(), and LST_Position().

03438 {
03439     PRIVATE_OBJECT **object1,
03440       **object2;
03441     PRV_GROUP_ITEM *groupItem1,
03442        *groupItem2;
03443     CONDITION cond;
03444 
03445     object1 = (PRIVATE_OBJECT **) o1;
03446     cond = checkObject(object1, "DCM_CompareAttributes");
03447     if (cond != DCM_NORMAL)
03448         return cond;
03449 
03450     object2 = (PRIVATE_OBJECT **) o2;
03451     cond = checkObject(object1, "DCM_CompareAttributes");
03452     if (cond != DCM_NORMAL)
03453         return cond;
03454 
03455     groupItem1 = (void *)LST_Head(&(*object1)->groupList);
03456     if (groupItem1 != NULL)
03457         (void) LST_Position(&(*object1)->groupList, (void *)groupItem1);
03458 
03459     groupItem2 = (void *)LST_Head(&(*object2)->groupList);
03460     if (groupItem2 != NULL)
03461         (void) LST_Position(&(*object2)->groupList, (void *)groupItem2);
03462 
03463 
03464     while (groupItem1 != NULL) {
03465         if (groupItem2 == NULL) {
03466             compareGroup(groupItem1, NULL, callback, ctx);
03467             groupItem1 = (void *)LST_Next(&(*object1)->groupList);
03468         } else if (groupItem1->group == groupItem2->group) {
03469             compareGroup(groupItem1, groupItem2, callback, ctx);
03470             groupItem1 = (void *)LST_Next(&(*object1)->groupList);
03471             groupItem2 = (void *)LST_Next(&(*object2)->groupList);
03472         } else if (groupItem1->group > groupItem2->group) {
03473             compareGroup(NULL, groupItem2, callback, ctx);
03474             groupItem2 = (void *)LST_Next(&(*object2)->groupList);
03475         } else {
03476             compareGroup(groupItem1, NULL, callback, ctx);
03477             groupItem1 = (void *)LST_Next(&(*object1)->groupList);
03478         }
03479     }
03480 
03481     while (groupItem2 != NULL) {
03482         compareGroup(NULL, groupItem2, callback, ctx);
03483         groupItem2 = (void *)LST_Next(&(*object2)->groupList);
03484     }
03485     return DCM_NORMAL;
03486 }

CONDITION DCM_ComputeExportLength DCM_OBJECT **    callerObject,
unsigned long    opt,
unsigned long *    length
 

Definition at line 3408 of file l_mri_dicom_hdr.c.

References checkObject(), CONDITION, countBytes(), DCM_ExportStream(), DCM_NORMAL, DCM_OBJECT, and object.

03410 {
03411     PRIVATE_OBJECT
03412         ** object;
03413     unsigned char
03414         buf[2048];
03415     CONDITION
03416         cond;
03417 
03418     object = (PRIVATE_OBJECT **) callerObject;
03419     cond = checkObject(object, "DCM_ComputeExportSize");
03420     if (cond != DCM_NORMAL)
03421         return cond;
03422 
03423     *length = 0;
03424     cond = DCM_ExportStream(callerObject, opt, buf,
03425                             (unsigned long) sizeof(buf), countBytes, length);
03426     if (cond != DCM_NORMAL)
03427         return cond;
03428 
03429     return DCM_NORMAL;
03430 }

CONDITION DCM_CopyObject DCM_OBJECT **    src,
DCM_OBJECT **    dst
 

Definition at line 7919 of file l_mri_dicom_hdr.c.

References PRIVATE_OBJECT::accessMethod, COND_PushCondition(), copySequence(), CTN_FREE, CTN_MALLOC, PRIVATE_OBJECT::dataOptions, DCM_AddElement(), DCM_LISTFAILURE, DCM_MALLOCFAILURE, DCM_MEMORY_ACCESS, DCM_Message(), DCM_NORMAL, DCM_NULLADDRESS, DCM_OBJECT, DCM_OBJECTCREATEFAILED, DCM_OBJECTUNKNOWN, DCM_SQ, PRIVATE_OBJECT::deleteFlag, PRV_ELEMENT_ITEM::element, PRIVATE_OBJECT::elementCtx, PRV_GROUP_ITEM::elementList, PRIVATE_OBJECT::fd, PRIVATE_OBJECT::fileName, PRIVATE_OBJECT::groupCtx, PRIVATE_OBJECT::groupLengthFlag, PRIVATE_OBJECT::groupList, KEY_DCM_OBJECT, PRIVATE_OBJECT::keyType, PRIVATE_OBJECT::longVRAttributes, LST_Create(), LST_Head(), LST_Next(), LST_Position(), PRIVATE_OBJECT::metaHeaderLength, PRIVATE_OBJECT::objectSize, PRIVATE_OBJECT::objectType, PRIVATE_OBJECT::offset, PRIVATE_OBJECT::pixelBitsAllocated, PRIVATE_OBJECT::pixelOffset, PRIVATE_OBJECT::pixelRepresentation, PRIVATE_OBJECT::pixelSize, PRIVATE_OBJECT::preamble, PRIVATE_OBJECT::preambleFlag, DCM_ELEMENT::representation, and PRIVATE_OBJECT::waveformDataVR.

Referenced by copySequence().

07920 {
07921     PRIVATE_OBJECT **srcObj;
07922     PRIVATE_OBJECT *dstObj;
07923     PRV_GROUP_ITEM *groupItem;
07924     PRV_ELEMENT_ITEM *elementItem;
07925 
07926     if (src == NULL) {
07927         (void) COND_PushCondition(DCM_NULLADDRESS,
07928                             DCM_Message(DCM_NULLADDRESS), "DCM_CopyObject");
07929         return COND_PushCondition(DCM_OBJECTCREATEFAILED,
07930                      DCM_Message(DCM_OBJECTCREATEFAILED), "DCM_CopyObject");
07931     }
07932     dstObj = (PRIVATE_OBJECT *) CTN_MALLOC(sizeof(PRIVATE_OBJECT));
07933     if (dstObj == NULL) {
07934         (void) COND_PushCondition(DCM_MALLOCFAILURE,
07935                      DCM_Message(DCM_MALLOCFAILURE), sizeof(PRIVATE_OBJECT),
07936                                   "DCM_CopyObject");
07937         *dst = NULL;
07938         return COND_PushCondition(DCM_OBJECTCREATEFAILED,
07939                      DCM_Message(DCM_OBJECTCREATEFAILED), "DCM_CopyObject");
07940     }
07941     (void) memset(dstObj, 0, sizeof(PRIVATE_OBJECT));
07942     (void) strcpy(dstObj->keyType, KEY_DCM_OBJECT);
07943 
07944     dstObj->objectType = DCM_OBJECTUNKNOWN;
07945     dstObj->accessMethod = DCM_MEMORY_ACCESS;
07946     dstObj->deleteFlag = FALSE;
07947     dstObj->groupLengthFlag = FALSE;
07948     dstObj->objectSize = 0;
07949     dstObj->offset = 0;
07950     dstObj->pixelSize = 0;
07951     dstObj->pixelOffset = 0;
07952     dstObj->pixelBitsAllocated = 0;
07953     dstObj->pixelRepresentation = 0xffff;
07954     dstObj->groupCtx = NULL;
07955     dstObj->elementCtx = NULL;
07956     dstObj->fd = -1;
07957     dstObj->fileName[0] = '\0';
07958     dstObj->preambleFlag = FALSE;
07959     dstObj->preamble[0] = '\0';
07960     dstObj->dataOptions = 0;
07961     dstObj->metaHeaderLength = 0xffffffff;
07962     dstObj->longVRAttributes = 0;
07963     dstObj->waveformDataVR[0] = '\0';
07964 
07965     dstObj->groupList = LST_Create();
07966     if (dstObj->groupList == NULL) {
07967         CTN_FREE(dstObj);
07968         *dst = NULL;
07969         return COND_PushCondition(DCM_LISTFAILURE,
07970                                   DCM_Message(DCM_LISTFAILURE),
07971                                   "DCM_CreateObject");
07972     }
07973     srcObj = (PRIVATE_OBJECT **) src;
07974 
07975     groupItem = (void *)LST_Head(&(*srcObj)->groupList);
07976     if (groupItem != NULL)
07977         (void) LST_Position(&(*srcObj)->groupList, (void *)groupItem);
07978 
07979     while (groupItem != NULL) {
07980         elementItem = (void *)LST_Head(&groupItem->elementList);
07981         if (elementItem != NULL)
07982             (void) LST_Position(&groupItem->elementList, (void *)elementItem);
07983         while (elementItem != NULL) {
07984             if (elementItem->element.representation == DCM_SQ) {
07985                 copySequence(&dstObj, &elementItem->element);
07986             } else {
07987                 DCM_AddElement((DCM_OBJECT **) & dstObj, &elementItem->element);
07988             }
07989             elementItem = (void *)LST_Next(&groupItem->elementList);
07990         }
07991         groupItem = (void *)LST_Next(&(*srcObj)->groupList);
07992     }
07993 
07994     *dst = (DCM_OBJECT *) dstObj;
07995     return DCM_NORMAL;
07996 }

CONDITION DCM_CreateObject DCM_OBJECT **    object,
unsigned long    opt
 

Definition at line 1126 of file l_mri_dicom_hdr.c.

References PRIVATE_OBJECT::accessMethod, COND_PushCondition(), CTN_FREE, CTN_MALLOC, PRIVATE_OBJECT::dataOptions, DCM_GROUPLENGTHMASK, DCM_LISTFAILURE, DCM_MALLOCFAILURE, DCM_MEMORY_ACCESS, DCM_Message(), DCM_NOGROUPLENGTH, DCM_NORMAL, DCM_NULLADDRESS, DCM_OBJECT, DCM_OBJECTCREATEFAILED, DCM_OBJECTUNKNOWN, PRIVATE_OBJECT::deleteFlag, PRIVATE_OBJECT::elementCtx, PRIVATE_OBJECT::fd, PRIVATE_OBJECT::fileName, PRIVATE_OBJECT::groupCtx, PRIVATE_OBJECT::groupLengthFlag, PRIVATE_OBJECT::groupList, KEY_DCM_OBJECT, PRIVATE_OBJECT::keyType, PRIVATE_OBJECT::longVRAttributes, LST_Create(), PRIVATE_OBJECT::metaHeaderLength, object, PRIVATE_OBJECT::objectSize, PRIVATE_OBJECT::objectType, PRIVATE_OBJECT::offset, PRIVATE_OBJECT::pixelBitsAllocated, PRIVATE_OBJECT::pixelOffset, PRIVATE_OBJECT::pixelRepresentation, PRIVATE_OBJECT::pixelSize, PRIVATE_OBJECT::preamble, PRIVATE_OBJECT::preambleFlag, and PRIVATE_OBJECT::waveformDataVR.

Referenced by readFile(), and readFile1().

01127 {
01128     PRIVATE_OBJECT
01129         * obj;
01130 
01131     if (object == NULL) {
01132         (void) COND_PushCondition(DCM_NULLADDRESS,
01133                           DCM_Message(DCM_NULLADDRESS), "DCM_CreateObject");
01134         return COND_PushCondition(DCM_OBJECTCREATEFAILED,
01135                    DCM_Message(DCM_OBJECTCREATEFAILED), "DCM_CreateObject");
01136     }
01137     obj = (PRIVATE_OBJECT *) CTN_MALLOC(sizeof(PRIVATE_OBJECT));
01138     if (obj == NULL) {
01139         (void) COND_PushCondition(DCM_MALLOCFAILURE,
01140                      DCM_Message(DCM_MALLOCFAILURE), sizeof(PRIVATE_OBJECT),
01141                                   "DCM_CreateObject");
01142         *object = NULL;
01143         return COND_PushCondition(DCM_OBJECTCREATEFAILED,
01144                    DCM_Message(DCM_OBJECTCREATEFAILED), "DCM_CreateObject");
01145     }
01146     (void) memset(obj, 0, sizeof(PRIVATE_OBJECT));
01147     (void) strcpy(obj->keyType, KEY_DCM_OBJECT);
01148 
01149 
01150     obj->objectType = DCM_OBJECTUNKNOWN;
01151     obj->accessMethod = DCM_MEMORY_ACCESS;
01152     obj->deleteFlag = FALSE;
01153     if ((opt & DCM_GROUPLENGTHMASK) == DCM_NOGROUPLENGTH)
01154         obj->groupLengthFlag = FALSE;
01155     else
01156         obj->groupLengthFlag = TRUE;
01157     obj->objectSize = 0;
01158     obj->offset = 0;
01159     obj->pixelSize = 0;
01160     obj->pixelOffset = 0;
01161     obj->pixelBitsAllocated = 0;
01162     obj->pixelRepresentation = 0xffff;
01163     obj->groupCtx = NULL;
01164     obj->elementCtx = NULL;
01165     obj->fd = -1;
01166     obj->fileName[0] = '\0';
01167     obj->preambleFlag = FALSE;
01168     obj->preamble[0] = '\0';
01169     obj->dataOptions = 0;
01170     obj->metaHeaderLength = 0xffffffff;
01171     obj->longVRAttributes = 0;
01172     obj->waveformDataVR[0] = '\0';
01173 
01174     obj->groupList = LST_Create();
01175     if (obj->groupList == NULL) {
01176         CTN_FREE(obj);
01177         *object = NULL;
01178         return COND_PushCondition(DCM_LISTFAILURE,
01179                                   DCM_Message(DCM_LISTFAILURE),
01180                                   "DCM_CreateObject");
01181     }
01182     *object = (DCM_OBJECT *) obj;
01183     return DCM_NORMAL;
01184 }

void DCM_Debug CTNBOOLEAN    flag
 

Definition at line 2708 of file l_mri_dicom_hdr.c.

References CTNBOOLEAN, and debug.

Referenced by mri_dicom_header().

02709 {
02710     debug = flag;
02711 }

CONDITION DCM_DumpElements DCM_OBJECT **    callerObject,
long    vm
 

Definition at line 2288 of file l_mri_dicom_hdr.c.

References PRV_GROUP_ITEM::baseLength, checkObject(), CONDITION, DCM_ELEMENT::d, DCM_ELEMENT::data_offset, DCM_AE, DCM_AS, DCM_AT, DCM_CS, DCM_DA, DCM_DD, DCM_DS, DCM_DT, DCM_FD, DCM_FL, DCM_IS, DCM_LO, DCM_LT, DCM_NORMAL, DCM_OB, DCM_OBJECT, DCM_OBJECTCOMMAND, DCM_OBJECTELEMENTLIST, DCM_OBJECTIMAGE, DCM_OBJECTUNKNOWN, DCM_OT, DCM_OW, DCM_PN, DCM_RET, DCM_SH, DCM_SL, DCM_SQ, DCM_SS, DCM_ST, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_TM, DCM_UI, DCM_UL, DCM_UN, DCM_US, DCM_UT, DCM_ELEMENT::description, dumpBinaryData(), PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, PRV_GROUP_ITEM::group, DCM_ELEMENT::length, LST_Head(), LST_Next(), LST_Position(), MIN, DCM_SEQUENCE_ITEM::object, object, DCM_ELEMENT::representation, RWC_NOHEX_MASK, RWC_NONAME_MASK, rwc_opt, RWC_printf(), rwc_vm, scratch, DCM_ELEMENT::tag, U32, and vm.

Referenced by DCM_DumpElements(), DCM_OpenFile(), mri_dicom_header(), readFile(), readGroupElement(), readPreamble(), and readVRLength().

02289 {
02290     PRV_GROUP_ITEM
02291         * groupItem;
02292     PRV_ELEMENT_ITEM
02293         * elementItem;
02294     PRIVATE_OBJECT
02295         ** object;
02296     CONDITION
02297         cond;
02298     DCM_SEQUENCE_ITEM
02299         * sq;
02300     char
02301         scratch[128];
02302     int
02303         stringLength;
02304 
02305     object = (PRIVATE_OBJECT **) callerObject;
02306 
02307     cond = checkObject(object, "DCM_DumpElements");
02308     if (cond != DCM_NORMAL)
02309         return cond;
02310 
02311     switch ((*object)->objectType) {
02312     case DCM_OBJECTUNKNOWN:
02313         RWC_printf("Object type: UNKNOWN\n");
02314         break;
02315     case DCM_OBJECTCOMMAND:
02316         RWC_printf("Object type: COMMAND\n");
02317         break;
02318     case DCM_OBJECTIMAGE:
02319         RWC_printf("Object type: IMAGE\n");
02320         break;
02321     case DCM_OBJECTELEMENTLIST:
02322         RWC_printf("Object type: ELEMENT LIST\n");
02323         break;
02324     default:
02325         RWC_printf("Object type: Unknown (error)\n");
02326         break;
02327     }
02328     RWC_printf("Object size: %ld\n", (*object)->objectSize);
02329 
02330     groupItem = (void *)LST_Head(&(*object)->groupList);
02331     if (groupItem != NULL)
02332         (void) LST_Position(&(*object)->groupList, (void *)groupItem);
02333 
02334     while (groupItem != NULL) {
02335 #ifdef MACOS
02336         RWC_printf("Group: %04x, Length: %8ld\n", groupItem->group,
02337                groupItem->baseLength);
02338 #else
02339         RWC_printf("Group: %04x, Length: %8d\n", groupItem->group,
02340                groupItem->baseLength);
02341 #endif
02342         elementItem = (void *)LST_Head(&groupItem->elementList);
02343         if (elementItem != NULL)
02344             (void) LST_Position(&groupItem->elementList, (void *)elementItem);
02345         while (elementItem != NULL) {
02346 #ifdef MACOS
02347             (void) RWC_printf("%04x %04x %8ld [%-8lu] ",
02348                           DCM_TAG_GROUP(elementItem->element.tag),
02349                           DCM_TAG_ELEMENT(elementItem->element.tag),
02350                           elementItem->element.length ,
02351                           (unsigned long) elementItem->element.data_offset );
02352 #else
02353             (void) RWC_printf("%04x %04x %8d [%-8lu] ",
02354                           DCM_TAG_GROUP(elementItem->element.tag),
02355                           DCM_TAG_ELEMENT(elementItem->element.tag),
02356                           elementItem->element.length ,
02357                           (unsigned long) elementItem->element.data_offset );
02358 #endif
02359 
02360             if( (rwc_opt & RWC_NONAME_MASK) == 0 )
02361               (void) RWC_printf("//%31s//", elementItem->element.description);
02362             else
02363               (void) RWC_printf("//") ;
02364 
02365             if (elementItem->element.d.ot == NULL)
02366                 (void) RWC_printf("Data on disk\n");
02367             else {
02368                 switch (elementItem->element.representation) {
02369                 case DCM_AE:
02370                 case DCM_AS:
02371                 case DCM_CS:
02372                 case DCM_DA:
02373                 case DCM_DT:
02374                     stringLength = MIN(sizeof(scratch) - 1, elementItem->element.length);
02375                     strncpy(scratch, elementItem->element.d.string, stringLength);
02376                     scratch[stringLength] = '\0';
02377                     (void) RWC_printf("%s\n", scratch);
02378                     break;
02379                 case DCM_DD:
02380                 case DCM_FD:
02381                 case DCM_FL:
02382                     (void) RWC_printf("Unimplemented\n");
02383                     break;
02384                 case DCM_DS:
02385                 case DCM_IS:
02386                 case DCM_LO:
02387                 case DCM_LT:
02388                 case DCM_PN:
02389                 case DCM_SH:
02390                 case DCM_UT:
02391                     stringLength = MIN(sizeof(scratch) - 1, elementItem->element.length);
02392                     strncpy(scratch, elementItem->element.d.string, stringLength);
02393                     scratch[stringLength] = '\0';
02394                     (void) RWC_printf("%s\n", scratch);
02395                     break;
02396                 case DCM_SL:
02397 #ifdef MACOS
02398                     (void) RWC_printf("%8lx %ld\n", *elementItem->element.d.sl,
02399                                   *elementItem->element.d.sl);
02400 #else
02401                     if( (rwc_opt & RWC_NOHEX_MASK) == 0 )
02402                       (void) RWC_printf("%8x %d\n", *elementItem->element.d.sl,
02403                                         *elementItem->element.d.sl);
02404                     else
02405                       (void) RWC_printf(" %d\n", *elementItem->element.d.sl ) ;
02406 
02407                     if (vm > 1)
02408                         dumpBinaryData(elementItem->element.d.ot,
02409                                        elementItem->element.representation,
02410                              elementItem->element.length / sizeof(U32), vm);
02411 #endif
02412                     break;
02413                 case DCM_SS:
02414                     if( (rwc_opt & RWC_NOHEX_MASK) == 0 )
02415                       (void) RWC_printf("%4x %d\n", *elementItem->element.d.ss,
02416                                     *elementItem->element.d.ss);
02417                     else
02418                       (void) RWC_printf(" %d\n", *elementItem->element.d.ss ) ;
02419 
02420                     if (vm > 1)
02421                         dumpBinaryData(elementItem->element.d.ot,
02422                                        elementItem->element.representation,
02423                            elementItem->element.length / sizeof(short), vm);
02424                     break;
02425                 case DCM_SQ:
02426                     (void) RWC_printf("SEQUENCE\n");
02427                     sq = (void *)LST_Head(&elementItem->element.d.sq);
02428                     if (sq != NULL)
02429                         (void) LST_Position(&elementItem->element.d.sq, (void *)sq);
02430                     RWC_printf("DCM Dump SEQUENCE\n");
02431                     while (sq != NULL) {
02432                         (void) DCM_DumpElements(&sq->object, vm);
02433                         sq = (void *)LST_Next(&elementItem->element.d.sq);
02434                     }
02435                     RWC_printf("DCM Dump SEQUENCE Complete\n");
02436                     break;
02437                 case DCM_ST:
02438                     stringLength = MIN(sizeof(scratch) - 1, elementItem->element.length);
02439                     strncpy(scratch, elementItem->element.d.string, stringLength);
02440                     scratch[stringLength] = '\0';
02441                     (void) RWC_printf("%s\n", scratch);
02442                     break;
02443                 case DCM_TM:
02444                 case DCM_UI:
02445                     stringLength = MIN(sizeof(scratch) - 1, elementItem->element.length);
02446                     strncpy(scratch, elementItem->element.d.string, stringLength);
02447                     scratch[stringLength] = '\0';
02448                     (void) RWC_printf("%s\n", scratch);
02449                     break;
02450                 case DCM_AT:
02451                 case DCM_UL:
02452 #ifdef MACOS
02453                     (void) RWC_printf("%8lx %ld\n", *elementItem->element.d.ul,
02454                                   *elementItem->element.d.ul);
02455 #else
02456                     if( (rwc_opt & RWC_NOHEX_MASK) == 0 )
02457                       (void) RWC_printf("%8x %d\n", *elementItem->element.d.ul,
02458                                     *elementItem->element.d.ul);
02459                     else
02460                       (void) RWC_printf(" %d\n", *elementItem->element.d.ul ) ;
02461 
02462                     if (vm > 1)
02463                         dumpBinaryData(elementItem->element.d.ot,
02464                                        elementItem->element.representation,
02465                              elementItem->element.length / sizeof(U32), vm);
02466 #endif
02467                     break;
02468                 case DCM_US:{
02469                     int nel = elementItem->element.length / sizeof(unsigned short) , rr ;
02470                     for( rr=0 ; rr < nel ; rr++ ){
02471                      if( (rwc_opt & RWC_NOHEX_MASK) == 0 )
02472                        (void) RWC_printf("%4x %d", elementItem->element.d.us[rr],
02473                                                    elementItem->element.d.us[rr]);
02474                      else
02475                        (void) RWC_printf(" %d", elementItem->element.d.us[rr] ) ;
02476                     }
02477                     RWC_printf("\n") ;
02478 
02479                     if (vm > 1)
02480                         dumpBinaryData(elementItem->element.d.ot,
02481                                        elementItem->element.representation,
02482                                        elementItem->element.length / sizeof(unsigned short), vm);
02483                     }
02484                     break;
02485                 case DCM_OB:
02486                 case DCM_UN:
02487                     dumpBinaryData(elementItem->element.d.ot,
02488                                        elementItem->element.representation,
02489                                elementItem->element.length , MAX(rwc_vm,8));
02490                     break;
02491 
02492                 case DCM_OT:
02493                 case DCM_OW:
02494                 /*case DCM_UNKNOWN:*/
02495                 case DCM_RET:
02496                     (void) RWC_printf("Unimplemented\n");
02497                     break;
02498                 default:
02499                     (void) RWC_printf("Some unimplemented logic if here\n");
02500                     break;
02501                 }
02502             }
02503             elementItem = (void *)LST_Next(&groupItem->elementList);
02504         }
02505         groupItem = (void *)LST_Next(&(*object)->groupList);
02506     }
02507 
02508     RWC_printf("DCM Dump Elements Complete\n");
02509     return DCM_NORMAL;
02510 }

DCM_DumpVector  
 

Definition at line 8334 of file l_mri_dicom_hdr.c.

References DIM_OF, vector::message, and RWC_printf().

08335 {
08336     int index;
08337 
08338     for (index = 0; index < (int) DIM_OF(messageVector); index++) {
08339         if (messageVector[index].message != NULL)
08340             RWC_printf("%8x %8d %s\n", messageVector[index].cond,
08341                    messageVector[index].cond,
08342                    messageVector[index].message);
08343     }
08344 }

CONDITION DCM_ElementDictionary DCM_TAG    tag,
void *    ctx,
void(*    callback)(DCM_TAG t, char *description, DCM_VALUEREPRESENTATION r, void *ctx)
 

Definition at line 10433 of file l_mri_dicom_hdr.c.

References DCM_NORMAL, DCM_TAG, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_VALUEREPRESENTATION, GROUPPTR::dict, DIM_OF, DCMDICT::englishDescription, GROUPPTR::entries, i, p, r, DCMDICT::representation, and DCMDICT::tag.

10436 {
10437     int i;
10438     unsigned long j;
10439     GROUPPTR *p;
10440     DCMDICT *dictionaryPtr;
10441 
10442     for (i = 0; i < (int) DIM_OF(group_dictionary); i++) {
10443         if ((DCM_TAG_GROUP(tag) == group_dictionary[i].group) ||
10444             (DCM_TAG_GROUP(tag) == 0xffff)) {
10445             p = &group_dictionary[i];
10446             dictionaryPtr = p->dict;
10447             for (j = 0; j < p->entries; j++, dictionaryPtr++) {
10448                 if ((DCM_TAG_ELEMENT(tag) == 0xffff) ||
10449                     (DCM_TAG_ELEMENT(tag) == DCM_TAG_ELEMENT(dictionaryPtr->tag))) {
10450                     callback(dictionaryPtr->tag,
10451                              dictionaryPtr->englishDescription,
10452                              dictionaryPtr->representation,
10453                              ctx);
10454                 }
10455             }
10456         }
10457     }
10458     return DCM_NORMAL;
10459 }

CONDITION DCM_ExportStream DCM_OBJECT **    callerObject,
unsigned long    opt,
void *    buffer,
unsigned long    bufferlength,
DCM_EXPORT_STREAM_CALLBACK   callback,
void *    ctx
 

Referenced by DCM_ComputeExportLength(), and DCM_WriteFile().

CONDITION DCM_FormatElements DCM_OBJECT **    callerObject,
long    vm,
const char *    prefix
 

Definition at line 2513 of file l_mri_dicom_hdr.c.

References PRV_GROUP_ITEM::baseLength, checkObject(), CONDITION, DCM_ELEMENT::d, DCM_AE, DCM_AS, DCM_AT, DCM_CS, DCM_DA, DCM_DD, DCM_DS, DCM_DT, DCM_FD, DCM_FL, DCM_IS, DCM_LO, DCM_LT, DCM_NORMAL, DCM_OB, DCM_OBJECT, DCM_OBJECTCOMMAND, DCM_OBJECTELEMENTLIST, DCM_OBJECTIMAGE, DCM_OBJECTUNKNOWN, DCM_OT, DCM_OW, DCM_PN, DCM_RET, DCM_SH, DCM_SL, DCM_SQ, DCM_SS, DCM_ST, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_TM, DCM_UI, DCM_UL, DCM_US, DCM_UT, DCM_ELEMENT::description, dumpBinaryData(), PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, PRV_GROUP_ITEM::group, DCM_ELEMENT::length, LST_Head(), LST_Next(), LST_Position(), MIN, DCM_SEQUENCE_ITEM::object, object, DCM_ELEMENT::representation, RWC_printf(), scratch, DCM_ELEMENT::tag, U32, and vm.

Referenced by DCM_FormatElements(), and mri_dicom_header().

02514 {
02515     PRV_GROUP_ITEM
02516         * groupItem;
02517     PRV_ELEMENT_ITEM
02518         * elementItem;
02519     PRIVATE_OBJECT
02520         ** object;
02521     CONDITION
02522         cond;
02523     DCM_SEQUENCE_ITEM
02524         * sq;
02525     char
02526         scratch[128];
02527     int
02528         stringLength;
02529     char localPrefix[128];
02530 
02531     object = (PRIVATE_OBJECT **) callerObject;
02532 
02533     cond = checkObject(object, "DCM_DumpElements");
02534     if (cond != DCM_NORMAL)
02535         return cond;
02536 
02537     RWC_printf("\n%sDCM Dump Elements\n", prefix);
02538     switch ((*object)->objectType) {
02539     case DCM_OBJECTUNKNOWN:
02540         RWC_printf("%sObject type: UNKNOWN\n", prefix);
02541         break;
02542     case DCM_OBJECTCOMMAND:
02543         RWC_printf("%sObject type: COMMAND\n", prefix);
02544         break;
02545     case DCM_OBJECTIMAGE:
02546         RWC_printf("%sObject type: IMAGE\n", prefix);
02547         break;
02548     case DCM_OBJECTELEMENTLIST:
02549         RWC_printf("%sObject type: ELEMENT LIST\n", prefix);
02550         break;
02551     default:
02552         RWC_printf("%sObject type: Unknown (error)\n", prefix);
02553         break;
02554     }
02555     RWC_printf("%sObject size: %ld\n", prefix, (*object)->objectSize);
02556 
02557     groupItem = (void *)LST_Head(&(*object)->groupList);
02558     if (groupItem != NULL)
02559         (void) LST_Position(&(*object)->groupList, (void *)groupItem);
02560 
02561     while (groupItem != NULL) {
02562         RWC_printf("%sGroup: %04x, Length: %8d\n", prefix, groupItem->group,
02563                groupItem->baseLength);
02564         elementItem = (void *)LST_Head(&groupItem->elementList);
02565         if (elementItem != NULL)
02566             (void) LST_Position(&groupItem->elementList, (void *)elementItem);
02567         while (elementItem != NULL) {
02568             (void) RWC_printf("%s%04x %04x %8d ",
02569                           prefix,
02570                           DCM_TAG_GROUP(elementItem->element.tag),
02571                           DCM_TAG_ELEMENT(elementItem->element.tag),
02572                           elementItem->element.length);
02573             (void) RWC_printf("//%31s//", elementItem->element.description);
02574             if (elementItem->element.d.ot == NULL)
02575                 (void) RWC_printf("Data on disk\n");
02576             else {
02577                 switch (elementItem->element.representation) {
02578                 case DCM_AE:
02579                 case DCM_AS:
02580                 case DCM_CS:
02581                 case DCM_DA:
02582                 case DCM_DT:
02583                     stringLength = MIN(sizeof(scratch) - 1, elementItem->element.length);
02584                     strncpy(scratch, elementItem->element.d.string, stringLength);
02585                     scratch[stringLength] = '\0';
02586                     (void) RWC_printf("%s\n", scratch);
02587                     break;
02588                 case DCM_DD:
02589                 case DCM_FD:
02590                 case DCM_FL:
02591                     (void) RWC_printf("Unimplemented\n");
02592                     break;
02593                 case DCM_DS:
02594                 case DCM_IS:
02595                 case DCM_LO:
02596                 case DCM_LT:
02597                 case DCM_PN:
02598                 case DCM_SH:
02599                 case DCM_UT:
02600                     stringLength = MIN(sizeof(scratch) - 1, elementItem->element.length);
02601                     strncpy(scratch, elementItem->element.d.string, stringLength);
02602                     scratch[stringLength] = '\0';
02603                     (void) RWC_printf("%s\n", scratch);
02604                     break;
02605                 case DCM_SL:
02606 #ifdef MACOS
02607                     (void) RWC_printf("%8lx %ld\n", *elementItem->element.d.sl,
02608                                   *elementItem->element.d.sl);
02609 #else
02610                     (void) RWC_printf("%8x %d\n", *elementItem->element.d.sl,
02611                                   *elementItem->element.d.sl);
02612                     if (vm > 1)
02613                         dumpBinaryData(elementItem->element.d.ot,
02614                                        elementItem->element.representation,
02615                              elementItem->element.length / sizeof(U32), vm);
02616 #endif
02617                     break;
02618                 case DCM_SS:
02619                     (void) RWC_printf("%4x %d\n", *elementItem->element.d.ss,
02620                                   *elementItem->element.d.ss);
02621                     if (vm > 1)
02622                         dumpBinaryData(elementItem->element.d.ot,
02623                                        elementItem->element.representation,
02624                            elementItem->element.length / sizeof(short), vm);
02625                     break;
02626                 case DCM_SQ:
02627                     (void) RWC_printf("SEQUENCE\n");
02628                     sq = (void *)LST_Head(&elementItem->element.d.sq);
02629                     if (sq != NULL)
02630                         (void) LST_Position(&elementItem->element.d.sq, (void *)sq);
02631                     RWC_printf("%sDCM Dump SEQUENCE\n", prefix);
02632                     strcpy(localPrefix, prefix);
02633                     strcat(localPrefix, " ");
02634                     while (sq != NULL) {
02635                         (void) DCM_FormatElements(&sq->object, vm, localPrefix);
02636                         sq = (void *)LST_Next(&elementItem->element.d.sq);
02637                     }
02638                     RWC_printf("%sDCM Dump SEQUENCE Complete\n", prefix);
02639                     break;
02640                 case DCM_ST:
02641                     stringLength = MIN(sizeof(scratch) - 1, elementItem->element.length);
02642                     strncpy(scratch, elementItem->element.d.string, stringLength);
02643                     scratch[stringLength] = '\0';
02644                     (void) RWC_printf("%s\n", scratch);
02645                     break;
02646                 case DCM_TM:
02647                 case DCM_UI:
02648                     stringLength = MIN(sizeof(scratch) - 1, elementItem->element.length);
02649                     strncpy(scratch, elementItem->element.d.string, stringLength);
02650                     scratch[stringLength] = '\0';
02651                     (void) RWC_printf("%s\n", scratch);
02652                     break;
02653                 case DCM_AT:
02654                 case DCM_UL:
02655                     (void) RWC_printf("%8x %d\n", *elementItem->element.d.ul,
02656                                   *elementItem->element.d.ul);
02657                     if (vm > 1)
02658                         dumpBinaryData(elementItem->element.d.ot,
02659                                        elementItem->element.representation,
02660                              elementItem->element.length / sizeof(U32), vm);
02661                     break;
02662                 case DCM_US:
02663                     (void) RWC_printf("%4x %d\n", *elementItem->element.d.us,
02664                                   *elementItem->element.d.us);
02665                     if (vm > 1)
02666                         dumpBinaryData(elementItem->element.d.ot,
02667                                        elementItem->element.representation,
02668                                        elementItem->element.length / sizeof(unsigned short), vm);
02669                     break;
02670                 case DCM_OT:
02671                 case DCM_OW:
02672                 case DCM_OB:
02673                 /*case DCM_UNKNOWN:*/
02674                 case DCM_RET:
02675                     (void) RWC_printf("Unimplemented\n");
02676                     break;
02677                 default:
02678                     (void) RWC_printf("Some unimplemented logic if here\n");
02679                     break;
02680                 }
02681             }
02682             elementItem = (void *)LST_Next(&groupItem->elementList);
02683         }
02684         groupItem = (void *)LST_Next(&(*object)->groupList);
02685     }
02686 
02687     RWC_printf("%sDCM Dump Elements Complete\n\n", prefix);
02688     return DCM_NORMAL;
02689 }

CONDITION DCM_GetCompressedValue DCM_OBJECT **    callerObject,
DCM_TAG    tag,
void *    buf,
size_t    bufSize,
DCM_GET_COMPRESSED_CALLBACK   callback,
void *    ctx
 

Definition at line 7690 of file l_mri_dicom_hdr.c.

References BIG_ORDER, BYTEORDER_REVERSE, checkObject(), COND_PushCondition(), CONDITION, CTN_MALLOC, CTNBOOLEAN, DCM_ELEMENT::d, PRV_ELEMENT_ITEM::dataOffset, DCM_ACCEPTVRMISMATCH, DCM_ELEMENTNOTFOUND, DCM_EXPLICITBIGENDIAN, DCM_EXPLICITLITTLEENDIAN, DCM_GET_COMPRESSED_CALLBACK, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_ORDERBIGENDIAN, DCM_ORDERLITTLEENDIAN, DCM_ORDERMASK, DCM_ORDERNATIVE, DCM_STREAMCOMPLETE, DCM_TAG, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_UL, DCM_UNSPECIFIEDLENGTH, DCM_VRMASK, l, DCM_ELEMENT::length, LITTLE_ORDER, locateElement(), MIN, NATIVE_ORDER, object, PRV_ELEMENT_ITEM::originalDataLength, read(), readGroupElement(), readVRLength(), DCM_ELEMENT::representation, swapInPlace(), and U32.

07693 {
07694     PRIVATE_OBJECT
07695         ** object;
07696     PRV_ELEMENT_ITEM
07697         * elementItem;
07698     S32 nBytes;
07699     S32 toRead;
07700     CONDITION cond;
07701     int doneFlag = 0;
07702     size_t elementLength;
07703     unsigned char *ptr;
07704     U32 size = 0;
07705     off_t fileOffset = 0;
07706     unsigned long opt;
07707     int byteOrder;
07708     int explicitVR;
07709     CTNBOOLEAN acceptVRMismatch = FALSE;
07710     DCM_ELEMENT e;
07711     U32 sequenceLength = 0;
07712     CONDITION flag;
07713     int index = 0;
07714     CTNBOOLEAN firstBuffer = TRUE;
07715     U32 *offsetBuffer = NULL;
07716     U32 offsetBufferCount = 0;
07717     U32 streamOffset = 0;
07718     int startOfFragment = 1;
07719 
07720     object = (PRIVATE_OBJECT **) callerObject;
07721     cond = checkObject(object, "DCM_GetCompressedValue");
07722     if (cond != DCM_NORMAL)
07723         return cond;
07724 
07725     elementItem = locateElement(object, tag);
07726 
07727     if (elementItem == NULL)
07728         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
07729                        DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(tag),
07730                                   DCM_TAG_ELEMENT(tag),
07731                                   "DCM_GetEncodedValue");
07732 
07733     elementLength = elementItem->originalDataLength;
07734     ptr = NULL;                 /* Means reading from a file */
07735     size = DCM_UNSPECIFIEDLENGTH;
07736     fileOffset = elementItem->dataOffset;
07737 
07738     opt |= (*object)->dataOptions & DCM_ORDERMASK;
07739     explicitVR = FALSE;
07740     switch (opt & DCM_ORDERMASK) {
07741     case DCM_ORDERNATIVE:
07742         byteOrder = NATIVE_ORDER;
07743         break;
07744     case DCM_ORDERLITTLEENDIAN:
07745         byteOrder = LITTLE_ORDER;
07746         break;
07747     case DCM_EXPLICITLITTLEENDIAN:
07748         byteOrder = LITTLE_ORDER;
07749         explicitVR = TRUE;
07750         break;
07751     case DCM_ORDERBIGENDIAN:
07752         byteOrder = BIG_ORDER;
07753         break;
07754     case DCM_EXPLICITBIGENDIAN:
07755         byteOrder = BIG_ORDER;
07756         explicitVR = TRUE;
07757         break;
07758     default:
07759         byteOrder = LITTLE_ORDER;
07760         explicitVR = TRUE;
07761         break;
07762     }
07763     if ((opt & DCM_VRMASK) == DCM_ACCEPTVRMISMATCH)
07764         acceptVRMismatch = TRUE;
07765 
07766     (void) lseek((*object)->fd, elementItem->dataOffset, SEEK_SET);
07767     while (elementLength != 0) {
07768         sequenceLength = 0;
07769         memset(&e, 0, sizeof(e));
07770         flag = readGroupElement("", &ptr, (*object)->fd, &size, &fileOffset,
07771                              FALSE, byteOrder, explicitVR, acceptVRMismatch,
07772                                 object, &sequenceLength, &e);
07773         if (flag == DCM_STREAMCOMPLETE)
07774             break;
07775         else if (flag != DCM_NORMAL)
07776             return flag;
07777 
07778         flag = readVRLength("", &ptr, (*object)->fd, &size, &fileOffset,
07779                             FALSE,      /* Known length */
07780                             byteOrder, explicitVR, acceptVRMismatch, object,
07781                             &sequenceLength, &e);
07782         if (flag != DCM_NORMAL)
07783             return flag;
07784 
07785         elementLength -= sequenceLength + e.length;
07786 
07787         if (firstBuffer) {
07788             firstBuffer = FALSE;
07789             if (e.length != 0) {
07790                 offsetBuffer = CTN_MALLOC(e.length);
07791                 offsetBufferCount = e.length / sizeof(U32);
07792                 if (offsetBuffer == NULL)
07793                     exit(1);    /* repair */
07794                 nBytes = read((*object)->fd, offsetBuffer, e.length);
07795                 if (nBytes != e.length) {
07796                     exit(1);    /* repair */
07797                 }
07798                 if (byteOrder == BYTEORDER_REVERSE) {
07799                     DCM_ELEMENT offsetBufferElement;
07800                     memset(&offsetBufferElement, 0, sizeof(DCM_ELEMENT));
07801                     offsetBufferElement.length = e.length;
07802                     offsetBufferElement.d.ul = offsetBuffer;
07803                     offsetBufferElement.representation = DCM_UL;
07804                     swapInPlace(object, &offsetBufferElement);
07805                 }
07806                 callback(offsetBuffer, e.length, index, 1, 0, 1, ctx);
07807                 streamOffset = 0;
07808             } else {
07809                 streamOffset = 0xffffffff;
07810             }
07811         } else {
07812             U32 l = e.length;
07813             int j;
07814             int lastIndex;
07815 
07816             lastIndex = index;
07817             for (j = 0; j < offsetBufferCount; j++) {
07818                 if (streamOffset == offsetBuffer[j])
07819                     index = j + 1;
07820             }
07821             startOfFragment = 1;
07822             while (l != 0) {
07823                 toRead = MIN(bufSize, l);
07824                 nBytes = read((*object)->fd, buf, toRead);
07825                 if (nBytes != toRead) {
07826                     exit(1);    /* repair */
07827                 }
07828                 callback(buf, toRead, index,
07829                          (index != lastIndex) ? 1 : 0,
07830                          0, startOfFragment, ctx);
07831                 l -= toRead;
07832                 lastIndex = index;      /* Guarantee first flag is off */
07833                 startOfFragment = 0;
07834             }
07835             streamOffset += sequenceLength + e.length;
07836         }
07837         fileOffset += e.length;
07838         index++;
07839     }
07840     callback(buf, 0, index, 0, 1, 1, ctx);
07841     return DCM_NORMAL;
07842 }

CONDITION DCM_GetElement DCM_OBJECT **    callerObject,
DCM_TAG    tag,
DCM_ELEMENT   element
 

Definition at line 3382 of file l_mri_dicom_hdr.c.

References checkObject(), COND_PushCondition(), CONDITION, DCM_ELEMENT::d, DCM_ELEMENTNOTFOUND, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_TAG, DCM_TAG_ELEMENT, DCM_TAG_GROUP, PRV_ELEMENT_ITEM::element, and locateElement().

Referenced by DCM_GetString().

03383 {
03384     PRIVATE_OBJECT
03385         ** obj;
03386     CONDITION
03387         cond;
03388     PRV_ELEMENT_ITEM
03389         * elementItem;
03390 
03391     obj = (PRIVATE_OBJECT **) callerObject;
03392     cond = checkObject(obj, "DCM_GetElementVM");
03393     if (cond != DCM_NORMAL)
03394         return cond;
03395 
03396     elementItem = locateElement(obj, tag);
03397     if (elementItem == NULL)
03398         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
03399                        DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(tag),
03400                                   DCM_TAG_ELEMENT(tag),
03401                                   "DCM_GetElementVM");
03402     *element = elementItem->element;
03403     element->d.ot = NULL;
03404     return DCM_NORMAL;
03405 }

CONDITION DCM_GetElementSize DCM_OBJECT **    callerObject,
DCM_TAG    tag,
U32   rtnLength
 

Definition at line 1991 of file l_mri_dicom_hdr.c.

References checkObject(), COND_PushCondition(), CONDITION, CTNBOOLEAN, DCM_ELEMENTNOTFOUND, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_TAG, DCM_TAG_ELEMENT, DCM_TAG_GROUP, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, PRV_GROUP_ITEM::group, DCM_ELEMENT::length, LST_Head(), LST_Next(), LST_Position(), object, DCM_ELEMENT::tag, and U32.

01993 {
01994     PRIVATE_OBJECT
01995         ** object;
01996     PRV_GROUP_ITEM
01997         * groupItem;
01998     PRV_ELEMENT_ITEM
01999         * elementItem;
02000     CONDITION
02001         cond;
02002     CTNBOOLEAN
02003         flag;
02004     unsigned short
02005         group,
02006         element;
02007 
02008     object = (PRIVATE_OBJECT **) callerObject;
02009     cond = checkObject(object, "DCM_GetElementSize");
02010     if (cond != DCM_NORMAL)
02011         return cond;
02012 
02013     group = DCM_TAG_GROUP(tag);
02014     element = DCM_TAG_ELEMENT(tag);
02015 
02016     groupItem = (void *)LST_Head(&((*object)->groupList));
02017     if (groupItem == NULL)
02018         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
02019                            DCM_Message(DCM_ELEMENTNOTFOUND), group, element,
02020                                   "DCM_GetElementSize");
02021 
02022     (void) LST_Position(&((*object)->groupList), (void *)groupItem);
02023 
02024     flag = FALSE;
02025     while ((groupItem != NULL) && (flag == FALSE)) {
02026         if (groupItem->group == group)
02027             flag = TRUE;
02028         else
02029             groupItem = (void *)LST_Next(&(*object)->groupList);
02030     }
02031     if (flag == FALSE)
02032         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
02033                            DCM_Message(DCM_ELEMENTNOTFOUND), group, element,
02034                                   "DCM_GetElementSize");
02035 
02036     elementItem = (void *)LST_Head(&groupItem->elementList);
02037     if (elementItem == NULL)
02038         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
02039                            DCM_Message(DCM_ELEMENTNOTFOUND), group, element,
02040                                   "DCM_GetElementSize");
02041 
02042     (void) LST_Position(&groupItem->elementList, (void *)elementItem);
02043 
02044     flag = FALSE;
02045     while ((elementItem != NULL) && (flag == FALSE)) {
02046         if (elementItem->element.tag == tag)
02047             flag = TRUE;
02048         else
02049             elementItem = (void *)LST_Next(&groupItem->elementList);
02050     }
02051 
02052     if (flag == FALSE)
02053         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
02054                            DCM_Message(DCM_ELEMENTNOTFOUND), group, element,
02055                                   "DCM_GetElementSize");
02056 
02057 
02058     *rtnLength = elementItem->element.length;
02059     return DCM_NORMAL;
02060 }

CONDITION DCM_GetElementValue DCM_OBJECT **    callerObject,
DCM_ELEMENT   element,
U32   rtnLength,
void **    ctx
 

Definition at line 1652 of file l_mri_dicom_hdr.c.

References PRV_ELEMENT_ITEM::byteOrder, BYTEORDER_REVERSE, checkObject(), COND_PushCondition(), CONDITION, DCM_ELEMENT::d, PRV_ELEMENT_ITEM::dataOffset, DCM_AT, DCM_CANNOTGETSEQUENCEVALUE, DCM_ELEMENTNOTFOUND, DCM_FILEACCESSERROR, DCM_GETINCOMPLETE, DCM_ILLEGALCONTEXT, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_SQ, DCM_TAG_ELEMENT, DCM_TAG_GROUP, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, PRV_GROUP_ITEM::group, l, DCM_ELEMENT::length, LST_Head(), LST_Next(), LST_Position(), MIN, object, p, q, read(), DCM_ELEMENT::representation, swapATGroupElement(), swapInPlace(), DCM_ELEMENT::tag, and U32.

Referenced by DCM_ParseObject(), and readLengthToEnd().

01654 {
01655     PRIVATE_OBJECT
01656         ** object;
01657     PRV_GROUP_ITEM
01658         * groupItem;
01659     PRV_ELEMENT_ITEM
01660         * elementItem;
01661     int
01662         nBytes;
01663     CONDITION
01664         cond;
01665 
01666     object = (PRIVATE_OBJECT **) callerObject;
01667     cond = checkObject(object, "DCM_GetElementValue");
01668     if (cond != DCM_NORMAL)
01669         return cond;
01670 
01671     groupItem = (void *)LST_Head(&(*object)->groupList);
01672     if (groupItem == NULL)
01673         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
01674               DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(element->tag),
01675                                   DCM_TAG_ELEMENT(element->tag),
01676                                   "DCM_GetElementValue");
01677 
01678     (void) LST_Position(&(*object)->groupList, (void *)groupItem);
01679     while (groupItem != NULL) {
01680         if (groupItem->group == DCM_TAG_GROUP(element->tag))
01681             break;
01682 
01683         groupItem = (void *)LST_Next(&(*object)->groupList);
01684     }
01685     if (groupItem == NULL)
01686         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
01687               DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(element->tag),
01688                                   DCM_TAG_ELEMENT(element->tag),
01689                                   "DCM_GetElementValue");
01690 
01691     elementItem = (void *)LST_Head(&groupItem->elementList);
01692     if (elementItem == NULL)
01693         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
01694               DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(element->tag),
01695                                   DCM_TAG_GROUP(element->tag),
01696                                   "DCM_GetElementValue");
01697 
01698     (void) LST_Position(&groupItem->elementList, (void *)elementItem);
01699     while (elementItem != NULL) {
01700         if (elementItem->element.tag == element->tag) {
01701             unsigned char *p;
01702             U32 l;
01703 
01704             if (element->representation == DCM_SQ)
01705                 return COND_PushCondition(DCM_CANNOTGETSEQUENCEVALUE,
01706                                     DCM_Message(DCM_CANNOTGETSEQUENCEVALUE),
01707                                        element->tag, "DCM_GetElementValue");
01708 
01709             p = *ctx;
01710             if ((U32) p > elementItem->element.length)
01711                 return COND_PushCondition(DCM_ILLEGALCONTEXT,
01712                                           DCM_Message(DCM_ILLEGALCONTEXT),
01713                                           "DCM_GetElementValue");
01714 
01715             l = MIN(element->length, (elementItem->element.length - (U32) p));
01716 
01717             *rtnLength = l;
01718             {
01719                 if (elementItem->element.d.ot == NULL) {
01720                     if ((*object)->fd != -1) {
01721                         (void) lseek((*object)->fd,
01722                              elementItem->dataOffset + (off_t) p, SEEK_SET);
01723                         nBytes = read((*object)->fd, element->d.ot, (int) l);
01724                     } else {
01725                         (*object)->sk((*object)->userCtx,
01726                                       (long) (elementItem->dataOffset + (off_t) p), SEEK_SET);
01727                         cond = (*object)->rd((*object)->userCtx, element->d.ot, l,
01728                                              &nBytes);
01729                     }
01730                     if ((unsigned) nBytes != l) {
01731                         return COND_PushCondition(DCM_FILEACCESSERROR,
01732                                            DCM_Message(DCM_FILEACCESSERROR),
01733                                                   (*object)->fileName,
01734                                                   "DCM_GetElementValue");
01735                     }
01736                     if( LITTLE_ENDIAN_ARCHITECTURE ){
01737                       if (elementItem->element.representation == DCM_AT) {
01738                           DCM_ELEMENT e;
01739                           e = elementItem->element;
01740                           e.length = l;
01741                           e.d.ot = element->d.ot;
01742                           swapATGroupElement(&e);
01743                       }
01744                     }
01745                     if (elementItem->byteOrder == BYTEORDER_REVERSE) {
01746                         DCM_ELEMENT e;
01747                         e = elementItem->element;
01748                         e.length = l;
01749                         e.d.ot = element->d.ot;
01750                         swapInPlace(object, &e);
01751                     }
01752                 } else {
01753                     unsigned char *q;
01754                     q = (unsigned char *) elementItem->element.d.ot +
01755                         (U32) p;
01756                     (void) memcpy(element->d.ot, q, l);
01757                     if (elementItem->byteOrder == BYTEORDER_REVERSE) {
01758                         DCM_ELEMENT e;
01759                         e = elementItem->element;
01760                         e.length = l;
01761                         e.d.ot = element->d.ot;
01762                         swapInPlace(object, &e);
01763                     }
01764                 }
01765                 p += l;
01766                 *ctx = (void *) p;
01767                 if ((unsigned) p == elementItem->element.length)
01768                     return DCM_NORMAL;
01769                 else
01770                     return DCM_GETINCOMPLETE;
01771             }
01772 
01773         }
01774         elementItem = (void *)LST_Next(&groupItem->elementList);
01775     }
01776     return COND_PushCondition(DCM_ELEMENTNOTFOUND,
01777               DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(element->tag),
01778                               DCM_TAG_ELEMENT(element->tag),
01779                               "DCM_GetElementValue");
01780 }

CONDITION DCM_GetElementValueList DCM_OBJECT **    object,
DCM_TAG    tag,
size_t    structureSize,
long    stringOffset,
LST_HEAD **    list
 

Definition at line 3199 of file l_mri_dicom_hdr.c.

References checkObject(), COND_PushCondition(), CONDITION, CTN_MALLOC, CTNBOOLEAN, DCM_ELEMENT::d, DCM_DELIMITOR, DCM_ELEMENTNOTFOUND, DCM_IsString(), DCM_LISTFAILURE, DCM_MALLOCFAILURE, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_TAG, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_UNEXPECTEDREPRESENTATION, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, PRV_GROUP_ITEM::group, l, DCM_ELEMENT::length, LST_Enqueue(), LST_Head(), LST_Next(), LST_NORMAL, LST_Position(), object, p, DCM_ELEMENT::representation, DCM_ELEMENT::tag, and U32.

03201 {
03202     PRIVATE_OBJECT
03203         ** obj;
03204     CONDITION
03205         cond;
03206     PRV_GROUP_ITEM
03207         * groupItem;
03208     PRV_ELEMENT_ITEM
03209         * elementItem;
03210     CTNBOOLEAN
03211         found = FALSE;
03212     char
03213        *src,
03214        *dst,
03215        *p;
03216     U32
03217         l;
03218 
03219     obj = (PRIVATE_OBJECT **) object;
03220     cond = checkObject(obj, "DCM_GetSequenceList");
03221     if (cond != DCM_NORMAL)
03222         return cond;
03223 
03224     groupItem = (void *)LST_Head(&(*obj)->groupList);
03225     if (groupItem == NULL)
03226         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
03227                        DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(tag),
03228                                   DCM_TAG_ELEMENT(tag),
03229                                   "DCM_GetSequenceList");
03230 
03231     (void) LST_Position(&(*obj)->groupList, (void *)groupItem);
03232     while (groupItem != NULL) {
03233         if (groupItem->group == DCM_TAG_GROUP(tag))
03234             break;
03235 
03236         groupItem = (void *)LST_Next(&(*obj)->groupList);
03237     }
03238     if (groupItem == NULL)
03239         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
03240                        DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(tag),
03241                                   DCM_TAG_ELEMENT(tag),
03242                                   "DCM_GetSequenceList");
03243 
03244     elementItem = (void *)LST_Head(&groupItem->elementList);
03245     if (elementItem == NULL)
03246         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
03247                        DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(tag),
03248                                   DCM_TAG_GROUP(tag),
03249                                   "DCM_GetSequenceTag");
03250 
03251     (void) LST_Position(&groupItem->elementList, (void *)elementItem);
03252     while (!found && (elementItem != NULL)) {
03253         if (elementItem->element.tag == tag) {
03254             found = TRUE;
03255         } else
03256             elementItem = (void *)LST_Next(&groupItem->elementList);
03257     }
03258     if (!found)
03259         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
03260                        DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(tag),
03261                                   DCM_TAG_ELEMENT(tag),
03262                                   "DCM_GetElementValueList");
03263 
03264     if (!DCM_IsString(elementItem->element.representation)) {
03265         return COND_PushCondition(DCM_UNEXPECTEDREPRESENTATION,
03266         DCM_Message(DCM_UNEXPECTEDREPRESENTATION), "DCM_GetElementValueList",
03267                                   "string");
03268     }
03269     src = elementItem->element.d.string;
03270     l = elementItem->element.length;
03271     while (l > 0) {
03272         while (l > 1 && (*src == ' ' || *src == DCM_DELIMITOR)) {
03273             l--;
03274             src++;
03275         }
03276         if ((l == 1) && (*src == ' ' || *src == DCM_DELIMITOR))
03277             l--;
03278 
03279         if (l != 0) {
03280             p = CTN_MALLOC(structureSize);
03281             if (p == NULL)
03282                 return COND_PushCondition(DCM_MALLOCFAILURE,
03283                               DCM_Message(DCM_MALLOCFAILURE), structureSize,
03284                                           "DCM_GetElementValueList");
03285             dst = p + stringOffset;
03286             while ((l > 1) && (*src != DCM_DELIMITOR)) {
03287                 *dst++ = *src++;
03288                 l--;
03289             }
03290             if ((l == 1) && (*src != ' ')) {
03291                 *dst++ = *src++;
03292                 l--;
03293             }
03294             *dst = '\0';;
03295             cond = LST_Enqueue(list, (void *)p);
03296             if (cond != LST_NORMAL)
03297                 return COND_PushCondition(DCM_LISTFAILURE,
03298                    DCM_Message(DCM_LISTFAILURE), "DCM_GetElementValueList");
03299         }
03300     }
03301     return DCM_NORMAL;
03302 }

CONDITION DCM_GetElementValueOffset DCM_OBJECT **    callerObject,
DCM_ELEMENT   element,
unsigned long    offset
 

Definition at line 1867 of file l_mri_dicom_hdr.c.

References PRV_ELEMENT_ITEM::byteOrder, BYTEORDER_REVERSE, checkObject(), COND_PushCondition(), CONDITION, DCM_ELEMENT::d, PRV_ELEMENT_ITEM::dataOffset, DCM_AT, DCM_BADLENGTH, DCM_BADOFFSET, DCM_CANNOTGETSEQUENCEVALUE, DCM_ELEMENTNOTFOUND, DCM_FILEACCESSERROR, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_SQ, DCM_TAG_ELEMENT, DCM_TAG_GROUP, PRV_ELEMENT_ITEM::element, l, DCM_ELEMENT::length, locateElement(), object, offset, p, q, read(), DCM_ELEMENT::representation, swapATGroupElement(), swapInPlace(), DCM_ELEMENT::tag, and U32.

01869 {
01870     PRIVATE_OBJECT **object;
01871     PRV_ELEMENT_ITEM *elementItem;
01872     int nBytes;
01873     CONDITION cond;
01874 
01875     object = (PRIVATE_OBJECT **) callerObject;
01876     cond = checkObject(object, "DCM_GetElementValue");
01877     if (cond != DCM_NORMAL)
01878         return cond;
01879 
01880     elementItem = locateElement(object, element->tag);
01881     if (elementItem == NULL)
01882         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
01883               DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(element->tag),
01884                                   DCM_TAG_ELEMENT(element->tag),
01885                                   "DCM_GetElementValueOffset");
01886 
01887 
01888     {
01889         unsigned char *p;
01890         U32 l;
01891 
01892         if (element->representation == DCM_SQ)
01893             return COND_PushCondition(DCM_CANNOTGETSEQUENCEVALUE,
01894                                     DCM_Message(DCM_CANNOTGETSEQUENCEVALUE),
01895                                  element->tag, "DCM_GetElementValueOffset");
01896 
01897         p = (unsigned char *) offset;;
01898         if ((U32) p > elementItem->element.length)
01899             return COND_PushCondition(DCM_BADOFFSET,
01900                                       DCM_Message(DCM_BADOFFSET),
01901                                       (int) offset,
01902                                       (int) elementItem->element.length,
01903                                       "DCM_GetElementValueLength");
01904 
01905         l = element->length;
01906         if (l + offset > elementItem->element.length) {
01907             return COND_PushCondition(DCM_BADLENGTH,
01908                                       DCM_Message(DCM_BADLENGTH),
01909                                       (int) offset, (int) l,
01910                                       (int) elementItem->element.length,
01911                                       "DCM_GetElementValueLength");
01912         } {
01913             if (elementItem->element.d.ot == NULL) {
01914                 if ((*object)->fd != -1) {
01915                     (void) lseek((*object)->fd,
01916                              elementItem->dataOffset + (off_t) p, SEEK_SET);
01917                     nBytes = read((*object)->fd, element->d.ot, (int) l);
01918                 } else {
01919                     (*object)->sk((*object)->userCtx,
01920                     (long) (elementItem->dataOffset + (off_t) p), SEEK_SET);
01921                     cond = (*object)->rd((*object)->userCtx, element->d.ot, l,
01922                                          &nBytes);
01923                 }
01924                 if ((unsigned) nBytes != l) {
01925                     return COND_PushCondition(DCM_FILEACCESSERROR,
01926                                            DCM_Message(DCM_FILEACCESSERROR),
01927                                               (*object)->fileName,
01928                                               "DCM_GetElementValueValue");
01929                 }
01930                 if( LITTLE_ENDIAN_ARCHITECTURE ){
01931                   if (elementItem->element.representation == DCM_AT) {
01932                       DCM_ELEMENT e;
01933                       e = elementItem->element;
01934                       e.length = l;
01935                       e.d.ot = element->d.ot;
01936                       swapATGroupElement(&e);
01937                   }
01938                 }
01939                 if (elementItem->byteOrder == BYTEORDER_REVERSE) {
01940                     DCM_ELEMENT e;
01941                     e = elementItem->element;
01942                     e.length = l;
01943                     e.d.ot = element->d.ot;
01944                     swapInPlace(object, &e);
01945                 }
01946             } else {
01947                 unsigned char *q;
01948                 q = (unsigned char *) elementItem->element.d.ot +
01949                     (U32) p;
01950                 (void) memcpy(element->d.ot, q, l);
01951                 if (elementItem->byteOrder == BYTEORDER_REVERSE) {
01952                     DCM_ELEMENT e;
01953                     e = elementItem->element;
01954                     e.length = l;
01955                     e.d.ot = element->d.ot;
01956                     swapInPlace(object, &e);
01957                 }
01958             }
01959             return DCM_NORMAL;
01960         }
01961 
01962     }
01963 }

CONDITION DCM_GetFirstElement DCM_OBJECT **    callerObject,
DCM_ELEMENT **    e
 

dst = (DCM_OBJECT *) dstObj;

Definition at line 8048 of file l_mri_dicom_hdr.c.

References checkObject(), CONDITION, DCM_EMPTYOBJECT, DCM_GetNextElement(), DCM_NORMAL, DCM_OBJECT, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, LST_Head(), LST_Position(), and object.

08049 {
08050   PRIVATE_OBJECT** object;
08051   PRV_GROUP_ITEM* groupItem;
08052   PRV_ELEMENT_ITEM* elementItem;
08053   CONDITION cond;
08054 
08055   object = (PRIVATE_OBJECT **) callerObject;
08056   cond = checkObject(object, "DCM_GetFirstElement");
08057   if (cond != DCM_NORMAL)
08058     return cond;
08059 
08060   groupItem = (void *)LST_Head(&(*object)->groupList);
08061 
08062   if (groupItem == NULL) {
08063     *e = 0;
08064     return DCM_EMPTYOBJECT;
08065   }
08066   (void) LST_Position(&(*object)->groupList, (void *)groupItem);
08067   (*object)->groupCtx = groupItem;
08068 
08069   elementItem = (void *)LST_Head(&groupItem->elementList);
08070   (*object)->elementCtx = elementItem;
08071   if (elementItem == NULL) {
08072     return DCM_GetNextElement(callerObject, e);
08073   }
08074 
08075   *e = &elementItem->element;
08076   return DCM_NORMAL;
08077 }

CONDITION DCM_GetNextElement DCM_OBJECT **    callerObject,
DCM_ELEMENT **    e
 

Definition at line 8080 of file l_mri_dicom_hdr.c.

References checkObject(), CONDITION, DCM_GETNEXTELEMENTCOMPLETE, DCM_NORMAL, DCM_OBJECT, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, LST_Head(), LST_Next(), LST_Position(), and object.

Referenced by DCM_GetFirstElement(), and DCM_GetNextElement().

08081 {
08082   PRIVATE_OBJECT** object;
08083   PRV_GROUP_ITEM* groupItem;
08084   PRV_ELEMENT_ITEM* elementItem;
08085   CONDITION cond;
08086 
08087   object = (PRIVATE_OBJECT **) callerObject;
08088   cond = checkObject(object, "DCM_GetNextElement");
08089   if (cond != DCM_NORMAL)
08090     return cond;
08091 
08092   groupItem = (*object)->groupCtx;
08093   elementItem = (*object)->elementCtx;
08094 
08095   if (elementItem != 0) {
08096     (void)LST_Position(&groupItem->elementList, (void *)elementItem);
08097     elementItem = (PRV_ELEMENT_ITEM*)LST_Next(&groupItem->elementList);
08098   }
08099 
08100   if (elementItem == 0) {
08101     (void)LST_Position(&(*object)->groupList, (void *)groupItem);
08102     groupItem = (PRV_GROUP_ITEM*)LST_Next(&(*object)->groupList);
08103     if (groupItem != 0) {
08104       elementItem = (PRV_ELEMENT_ITEM*)LST_Head(&groupItem->elementList);
08105     }
08106   }
08107 
08108   if (groupItem == 0) {
08109     *e = 0;
08110     return DCM_GETNEXTELEMENTCOMPLETE;
08111   }
08112 
08113   (*object)->groupCtx = groupItem;
08114   (*object)->elementCtx = elementItem;
08115 
08116   if (elementItem == 0)
08117     return DCM_GetNextElement(callerObject, e);
08118 
08119   *e = &elementItem->element;
08120   return DCM_NORMAL;
08121 }

CONDITION DCM_GetObjectSize DCM_OBJECT **    callerObject,
unsigned long *    returnlength
 

Definition at line 2243 of file l_mri_dicom_hdr.c.

References checkObject(), CONDITION, DCM_NORMAL, DCM_OBJECT, and object.

02244 {
02245     PRIVATE_OBJECT
02246         ** object;
02247     CONDITION
02248         cond;
02249 
02250     object = (PRIVATE_OBJECT **) callerObject;
02251     cond = checkObject(object, "DCM_GetObjectSize");
02252     if (cond != DCM_NORMAL)
02253         return cond;
02254 
02255     *returnlength = (*object)->objectSize;
02256     return DCM_NORMAL;
02257 }

CONDITION DCM_GetSequenceByOffset DCM_OBJECT **    object,
DCM_TAG    tag,
unsigned long    offset,
DCM_OBJECT **    rtnObject
 

Definition at line 7881 of file l_mri_dicom_hdr.c.

References checkObject(), COND_PushCondition(), CONDITION, DCM_ELEMENT::d, DCM_ELEMENTNOTFOUND, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_TAG, DCM_TAG_ELEMENT, DCM_TAG_GROUP, PRV_ELEMENT_ITEM::element, locateElement(), LST_Head(), LST_Next(), LST_Position(), DCM_SEQUENCE_ITEM::object, object, PRIVATE_OBJECT::offset, and offset.

07883 {
07884     PRIVATE_OBJECT **obj,
07885        *sqObject;
07886     CONDITION cond;
07887     PRV_ELEMENT_ITEM *elementItem;
07888     LST_HEAD *lst;
07889     DCM_SEQUENCE_ITEM *sqItem;
07890 
07891     obj = (PRIVATE_OBJECT **) object;
07892     cond = checkObject(obj, "DCM_PrintSequenceList");
07893     if (cond != DCM_NORMAL)
07894         return cond;
07895 
07896     elementItem = locateElement(obj, tag);
07897 
07898     if (elementItem == NULL)
07899         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
07900                        DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(tag),
07901                                   DCM_TAG_ELEMENT(tag),
07902                                   "DCM_PrintSequenceList");
07903 
07904     lst = elementItem->element.d.sq;
07905     sqItem = (void *)LST_Head(&lst);
07906     (void) LST_Position(&lst, (void *)sqItem);
07907     while (sqItem != NULL) {
07908         sqObject = (PRIVATE_OBJECT *) sqItem->object;
07909         if (sqObject->offset == offset) {
07910             *rtnObject = sqItem->object;
07911             return DCM_NORMAL;
07912         }
07913         sqItem = (void *)LST_Next(&lst);
07914     }
07915     return 0;
07916 }

CONDITION DCM_GetSequenceElement DCM_OBJECT **    object,
DCM_TAG    top,
DCM_ELEMENT   e
 

Definition at line 3140 of file l_mri_dicom_hdr.c.

References checkObject(), COND_PushCondition(), CONDITION, CTNBOOLEAN, DCM_ELEMENT::d, DCM_ELEMENTNOTFOUND, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_ParseObject(), DCM_SQ, DCM_TAG, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_UNEXPECTEDREPRESENTATION, PRV_ELEMENT_ITEM::element, locateElement(), LST_Head(), DCM_SEQUENCE_ITEM::object, object, DCM_ELEMENT::representation, and top.

03141 {
03142     PRIVATE_OBJECT **obj;
03143     CONDITION cond;
03144     PRV_GROUP_ITEM *groupItem;
03145     PRV_ELEMENT_ITEM *elementItem;
03146     DCM_SEQUENCE_ITEM *seqItem;
03147 
03148     CTNBOOLEAN found = FALSE;
03149 
03150     obj = (PRIVATE_OBJECT **) object;
03151     cond = checkObject(obj, "DCM_GetSequenceElement");
03152     if (cond != DCM_NORMAL)
03153         return cond;
03154 
03155     elementItem = locateElement(obj, top);
03156     if (elementItem == NULL) {
03157         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
03158                                   DCM_Message(DCM_ELEMENTNOTFOUND),
03159                                   DCM_TAG_GROUP(top),
03160                                   DCM_TAG_ELEMENT(top),
03161                                   "DCM_GetElementSequence");
03162     }
03163     if (elementItem->element.representation != DCM_SQ) {
03164         return COND_PushCondition(DCM_UNEXPECTEDREPRESENTATION,
03165                                   DCM_Message(DCM_UNEXPECTEDREPRESENTATION),
03166                                   "DCM_GetSequenceElement", "sequence");
03167     }
03168     seqItem = (void *)LST_Head(&elementItem->element.d.sq);
03169     cond = DCM_ParseObject(&seqItem->object, e, 1, NULL, 0, NULL);
03170     return cond;
03171 
03172 #if 0
03173     return DCM_NORMAL;
03174 #endif
03175 }

CONDITION DCM_GetSequenceList DCM_OBJECT **    object,
DCM_TAG    tag,
LST_HEAD **    list
 

Definition at line 3077 of file l_mri_dicom_hdr.c.

References checkObject(), COND_PushCondition(), CONDITION, CTNBOOLEAN, DCM_ELEMENT::d, DCM_ELEMENTNOTFOUND, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_TAG, DCM_TAG_ELEMENT, DCM_TAG_GROUP, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, PRV_GROUP_ITEM::group, LST_Head(), LST_Next(), LST_Position(), object, and DCM_ELEMENT::tag.

03078 {
03079     PRIVATE_OBJECT
03080         ** obj;
03081     CONDITION
03082         cond;
03083     PRV_GROUP_ITEM
03084         * groupItem;
03085     PRV_ELEMENT_ITEM
03086         * elementItem;
03087     CTNBOOLEAN
03088         found = FALSE;
03089 
03090     obj = (PRIVATE_OBJECT **) object;
03091     cond = checkObject(obj, "DCM_GetSequenceList");
03092     if (cond != DCM_NORMAL)
03093         return cond;
03094 
03095     groupItem = (void *)LST_Head(&(*obj)->groupList);
03096     if (groupItem == NULL)
03097         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
03098                        DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(tag),
03099                                   DCM_TAG_ELEMENT(tag),
03100                                   "DCM_GetSequenceList");
03101 
03102     (void) LST_Position(&(*obj)->groupList, (void *)groupItem);
03103     while (groupItem != NULL) {
03104         if (groupItem->group == DCM_TAG_GROUP(tag))
03105             break;
03106 
03107         groupItem = (void *)LST_Next(&(*obj)->groupList);
03108     }
03109     if (groupItem == NULL)
03110         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
03111                        DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(tag),
03112                                   DCM_TAG_ELEMENT(tag),
03113                                   "DCM_GetSequenceList");
03114 
03115     elementItem = (void *)LST_Head(&groupItem->elementList);
03116     if (elementItem == NULL)
03117         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
03118                        DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(tag),
03119                                   DCM_TAG_GROUP(tag),
03120                                   "DCM_GetSequenceTag");
03121 
03122     (void) LST_Position(&groupItem->elementList, (void *)elementItem);
03123     while (!found && (elementItem != NULL)) {
03124         if (elementItem->element.tag == tag) {
03125             *list = elementItem->element.d.sq;
03126             found = TRUE;
03127         }
03128         elementItem = (void *)LST_Next(&groupItem->elementList);
03129     }
03130     if (found)
03131         return DCM_NORMAL;
03132     else
03133         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
03134                        DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(tag),
03135                                   DCM_TAG_ELEMENT(tag),
03136                                   "DCM_GetSequenceList");
03137 }

char* DCM_GetString DCM_OBJECT **    callerObject,
DCM_TAG    tag
 

Definition at line 1783 of file l_mri_dicom_hdr.c.

References AFMALL, COND_PopCondition(), CONDITION, DCM_ELEMENT::d, DCM_AT, DCM_CTX, DCM_DLM, DCM_FD, DCM_FL, DCM_GetElement(), DCM_IsString(), DCM_NORMAL, DCM_OB, DCM_OBJECT, DCM_OW, DCM_ParseObject(), DCM_RET, DCM_SL, DCM_SQ, DCM_SS, DCM_TAG, DCM_UL, DCM_UN, DCM_US, free, DCM_ELEMENT::length, malloc, DCM_ELEMENT::representation, and DCM_ELEMENT::tag.

01784 {
01785   DCM_ELEMENT e;
01786   CONDITION cond;
01787   char* s;
01788   char tmp[64] = "";
01789   char b[64] = "";
01790 
01791   e.tag = tag;
01792   cond = DCM_GetElement(callerObject, tag, &e);
01793   if (cond != DCM_NORMAL) {
01794     COND_PopCondition(TRUE);
01795     return 0;
01796   }
01797 
01798   if (DCM_IsString(e.representation)) {
01799     s = AFMALL( char, e.length + 1);
01800     e.d.string = s;
01801     cond = DCM_ParseObject(callerObject, &e, 1, 0, 0, 0);
01802     if (cond != DCM_NORMAL) {
01803       free(s);
01804       s = 0;
01805     }
01806     return s;
01807   }
01808 
01809   if (e.representation == DCM_SQ) {
01810     return 0;
01811   }
01812 
01813   if (e.length > sizeof(b))
01814     return 0;
01815 
01816   e.d.ot = b;
01817   cond = DCM_ParseObject(callerObject, &e, 1, 0, 0, 0);
01818   if (cond != DCM_NORMAL) {
01819     COND_PopCondition(TRUE);
01820     return 0;
01821   }
01822 
01823   switch (e.representation) {
01824     case DCM_AT:
01825     case DCM_FD:
01826     case DCM_FL:
01827       strcpy(tmp, "<Unimplemented>");
01828       break;
01829     case DCM_SL:
01830       sprintf(tmp, "%d", *e.d.sl);
01831       break;
01832     case DCM_SQ:
01833       strcpy(tmp, "<Unimplemented>");
01834       break;
01835     case DCM_SS:
01836       sprintf(tmp, "%d", *e.d.ss);
01837       break;
01838     case DCM_UL:
01839       sprintf(tmp, "%d", *e.d.ul);
01840       break;
01841     case DCM_UN:
01842       strcpy(tmp, "<Unimplemented>");
01843       break;
01844     case DCM_US:
01845       sprintf(tmp, "%d", *e.d.us);
01846       break;
01847     /*case DCM_UNKNOWN:*/
01848     case DCM_RET:
01849     case DCM_CTX:
01850     case DCM_OB:
01851     case DCM_OW:
01852     case DCM_DLM:
01853     default:
01854       strcpy(tmp, "<Unimplemented>");
01855       break;
01856   }
01857 
01858   s = (char*) malloc(strlen(tmp) + 1);
01859   strcpy(s, tmp);
01860 
01861   return s;
01862 }

CONDITION DCM_GroupDictionary unsigned short    group,
void *    ctx,
void(*    callback)(unsigned short g, char *description, void *ctx)
 

Definition at line 10385 of file l_mri_dicom_hdr.c.

References DCM_NORMAL, DIM_OF, and i.

10387 {
10388     int i;
10389 
10390     for (i = 0; i < (int) DIM_OF(groupTable); i++) {
10391         if ((group == 0xffff) || (group == groupTable[i].group)) {
10392             callback(groupTable[i].group, groupTable[i].description, ctx);
10393         }
10394     }
10395     return DCM_NORMAL;
10396 }

CTNBOOLEAN DCM_GroupPresent DCM_OBJECT **    o1,
U16    group
 

Definition at line 3489 of file l_mri_dicom_hdr.c.

References checkObject(), CONDITION, CTNBOOLEAN, DCM_NORMAL, DCM_OBJECT, PRV_GROUP_ITEM::group, LST_Head(), LST_Next(), LST_Position(), object, and U16.

03490 {
03491     PRIVATE_OBJECT **object;
03492     PRV_GROUP_ITEM * item;
03493     CONDITION cond;
03494     CTNBOOLEAN tooFar = FALSE;
03495 
03496     object = (PRIVATE_OBJECT **) o1;
03497     cond = checkObject(object, "DCM_CompareAttributes");
03498     if (cond != DCM_NORMAL)
03499         return FALSE;
03500 
03501 
03502     item = (void *)LST_Head(&(*object)->groupList);
03503     if (item != NULL)
03504         (void) LST_Position(&(*object)->groupList, (void *)item);
03505 
03506     while (item != NULL && !tooFar) {
03507         if (item->group == group) {
03508             return TRUE;
03509         } else if (item->group > group) {
03510             tooFar = TRUE;
03511         } else {
03512             item = (void *)LST_Next(&(*object)->groupList);
03513         }
03514     }
03515     return FALSE;
03516 }

CONDITION DCM_ImportStream unsigned char *    buf,
unsigned long    length,
unsigned long    opt,
DCM_OBJECT **    callerObject
 

Definition at line 2204 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), DCM_ILLEGALOPTION, DCM_Message(), DCM_OBJECT, DCM_ORDERMASK, and readFile().

Referenced by readLengthToEnd().

02206 {
02207 #ifdef DEBUG
02208     if (debug)
02209         (void) fprintf(stderr, "DCM_ImportStream, %ld bytes\n", length);
02210 #endif
02211 
02212     if ((opt & DCM_ORDERMASK) == 0)
02213         return COND_PushCondition(DCM_ILLEGALOPTION,
02214                                DCM_Message(DCM_ILLEGALOPTION), "Byte order",
02215                                   "DCM_ImportStream");
02216 
02217     return readFile("", buf, -1, length, 0, 0, opt, callerObject, NULL, NULL,
02218                     NULL, NULL, NULL);
02219 }

CTNBOOLEAN DCM_IsString DCM_VALUEREPRESENTATION    representation
 

Definition at line 10612 of file l_mri_dicom_hdr.c.

References CTNBOOLEAN, DCM_AE, DCM_AS, DCM_AT, DCM_CS, DCM_CTX, DCM_DA, DCM_DD, DCM_DS, DCM_DT, DCM_FD, DCM_FL, DCM_IS, DCM_LO, DCM_LT, DCM_OB, DCM_OT, DCM_OW, DCM_PN, DCM_RET, DCM_SH, DCM_SL, DCM_SQ, DCM_SS, DCM_ST, DCM_TM, DCM_UI, DCM_UL, DCM_US, DCM_UT, and DCM_VALUEREPRESENTATION.

Referenced by DCM_GetElementValueList(), DCM_GetString(), DCM_ModifyElements(), DCM_ParseObject(), and DCM_ScanParseObject().

10613 {
10614     CTNBOOLEAN
10615         flag = FALSE;
10616 
10617     switch (representation) {
10618     case DCM_AE:                /* Application Entity */
10619     case DCM_AS:                /* Age string */
10620         flag = TRUE;
10621         break;
10622     case DCM_AT:                /* Attribute tag */
10623         break;
10624     case DCM_CS:                /* Control string */
10625     case DCM_DA:                /* Date */
10626         flag = TRUE;
10627         break;
10628     case DCM_DD:                /* Data set */
10629         break;
10630     case DCM_DS:                /* Decimal string */
10631     case DCM_DT:                /* Old date/time */
10632         flag = TRUE;
10633         break;
10634     case DCM_FD:                /* Floating double */
10635     case DCM_FL:                /* Float */
10636         break;
10637     case DCM_IS:                /* Integer string */
10638     case DCM_LO:                /* Long string */
10639     case DCM_LT:                /* Long text */
10640         flag = TRUE;
10641         break;
10642     case DCM_OB:                /* Other binary value (byte) */
10643     case DCM_OT:                /* Other binary value */
10644     case DCM_OW:                /* Other binary value (word) */
10645         break;
10646     case DCM_SH:                /* Short string */
10647         flag = TRUE;
10648         break;
10649     case DCM_SL:                /* Signed long */
10650     case DCM_SQ:                /* Sequence of items */
10651     case DCM_SS:                /* Signed short */
10652         break;
10653     case DCM_ST:                /* Short text */
10654     case DCM_TM:                /* Time */
10655         flag = TRUE;
10656         break;
10657     case DCM_UL:                /* Unsigned long */
10658     case DCM_US:                /* Unsigned short */
10659     /*case DCM_UNKNOWN:*/       /* Unknown/unspecified */
10660     case DCM_RET:               /* Retired */
10661     case DCM_CTX:               /* Context sensitive */
10662         break;
10663     case DCM_PN:                /* Person Name */
10664     case DCM_UI:                /* Unique identifier (UID) */
10665     case DCM_UT:                /* Unlimited Text */
10666         flag = TRUE;
10667         break;
10668     };
10669     return flag;
10670 }

CONDITION DCM_ListToString LST_HEAD   list,
long    offset,
char **    string
 

Definition at line 10540 of file l_mri_dicom_hdr.c.

References c, COND_PushCondition(), CTN_MALLOC, DCM_LISTFAILURE, DCM_MALLOCFAILURE, DCM_Message(), DCM_NORMAL, LST_Head(), LST_Next(), LST_Position(), offset, and p.

Referenced by DCM_AddElementList().

10541 {
10542     GENERIC
10543         * g;
10544     char
10545        *c,
10546        *p;
10547     long
10548         length;
10549 
10550     *string = NULL;
10551     if (list == NULL)
10552         return DCM_NORMAL;
10553 
10554     g = (void *)LST_Head(&list);
10555     if (g == NULL)
10556         return DCM_NORMAL;
10557 
10558     (void) LST_Position(&list, (void *)g);
10559 
10560     length = 0;
10561     while (g != NULL) {
10562         c = ((char *) g) + offset;
10563         length += strlen(c) + 1;
10564         g = (void *)LST_Next(&list);
10565     }
10566 
10567     p = CTN_MALLOC(length);
10568     if (p == NULL)
10569         return COND_PushCondition(DCM_MALLOCFAILURE,
10570                 DCM_Message(DCM_MALLOCFAILURE), length, "DCM_ListToString");
10571 
10572     *string = p;
10573     g = (void *)LST_Head(&list);
10574     if (g == NULL)
10575         return COND_PushCondition(DCM_LISTFAILURE, DCM_Message(DCM_LISTFAILURE),
10576                                   "DCM_ListToString");
10577     (void) LST_Position(&list, (void *)g);
10578 
10579     length = 0;
10580     while (g != NULL) {
10581         c = ((char *) g) + offset;
10582         length = strlen(c);
10583         (void) memcpy(p, c, length);
10584         p += length;
10585         *p++ = '\\';
10586         g = (void *)LST_Next(&list);
10587     }
10588     *--p = '\0';
10589     return DCM_NORMAL;
10590 }

CONDITION DCM_LookupElement DCM_ELEMENT   element
 

Definition at line 10257 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), DCM_Message(), DCM_NORMAL, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_UL, DCM_UN, DCM_UNRECOGNIZEDELEMENT, DCM_UNRECOGNIZEDGROUP, DCM_ELEMENT::description, GROUPPTR::dict, DCMDICT::englishDescription, GROUPPTR::entries, GROUPPTR::group, p, DCMDICT::representation, DCM_ELEMENT::representation, DCMDICT::tag, and DCM_ELEMENT::tag.

Referenced by DCM_AddElement(), DCM_AddSequenceElement(), readFile(), and readGroupElement().

10258 {
10259     int
10260         found;
10261     unsigned long
10262         index,
10263         entries;
10264     GROUPPTR
10265         * p;
10266     DCMDICT
10267         * dictionaryPtr;
10268 
10269     element->representation = DCM_UN;
10270     (void) strcpy(element->description, "");
10271 
10272     for (index = 0, p = NULL;
10273          index < sizeof(group_dictionary) / sizeof(group_dictionary[0]) && p == NULL;
10274          index++)
10275         if (DCM_TAG_GROUP(element->tag) == group_dictionary[index].group)
10276             p = &group_dictionary[index];
10277 
10278     if (p == NULL) {
10279         if (DCM_TAG_ELEMENT(element->tag) == 0x0000) {
10280             element->representation = DCM_UL;
10281             (void) strcpy(element->description, "Unknown group length");
10282             return DCM_NORMAL;
10283         }
10284         return COND_PushCondition(DCM_UNRECOGNIZEDGROUP,
10285                                   DCM_Message(DCM_UNRECOGNIZEDGROUP),
10286                                   DCM_TAG_GROUP(element->tag),
10287                                   "DCM_LookupElement");
10288     }
10289     entries = p->entries;
10290     dictionaryPtr = p->dict;
10291 
10292     for (found = 0; !found && entries > 0; entries--)
10293         if (element->tag == dictionaryPtr->tag)
10294             found++;
10295         else
10296             dictionaryPtr++;
10297 
10298     if (!found)
10299         return COND_PushCondition(DCM_UNRECOGNIZEDELEMENT,
10300                                   DCM_Message(DCM_UNRECOGNIZEDELEMENT),
10301                                   DCM_TAG_GROUP(element->tag),
10302                                   DCM_TAG_ELEMENT(element->tag),
10303                                   "DCM_LookupElement");
10304 
10305 
10306     element->representation = dictionaryPtr->representation;
10307     (void) strcpy(element->description, dictionaryPtr->englishDescription);
10308     return DCM_NORMAL;
10309 }

CONDITION DCM_MergeObject DCM_OBJECT **    src,
DCM_OBJECT **    dst
 

Definition at line 7999 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), copySequence(), DCM_AddElement(), DCM_MALLOCFAILURE, DCM_Message(), DCM_NORMAL, DCM_NULLADDRESS, DCM_OBJECT, DCM_OBJECTCREATEFAILED, DCM_SQ, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, LST_Head(), LST_Next(), LST_Position(), and DCM_ELEMENT::representation.

08000 {
08001     PRIVATE_OBJECT **srcObj;
08002     PRIVATE_OBJECT *dstObj;
08003     PRV_GROUP_ITEM *groupItem;
08004     PRV_ELEMENT_ITEM *elementItem;
08005 
08006     if (src == NULL) {
08007         (void) COND_PushCondition(DCM_NULLADDRESS,
08008                             DCM_Message(DCM_NULLADDRESS), "DCM_MergeObject");
08009         return COND_PushCondition(DCM_OBJECTCREATEFAILED,
08010                      DCM_Message(DCM_OBJECTCREATEFAILED), "DCM_MergeObject");
08011     }
08012     dstObj = *((PRIVATE_OBJECT **)dst);
08013     if (dstObj == NULL) {
08014         (void) COND_PushCondition(DCM_MALLOCFAILURE,
08015                      DCM_Message(DCM_MALLOCFAILURE), sizeof(PRIVATE_OBJECT),
08016                                   "DCM_MergeObject");
08017         *dst = NULL;
08018         return COND_PushCondition(DCM_OBJECTCREATEFAILED,
08019                      DCM_Message(DCM_OBJECTCREATEFAILED), "DCM_MergeObject");
08020     }
08021     srcObj = (PRIVATE_OBJECT **) src;
08022 
08023     groupItem = (void *)LST_Head(&(*srcObj)->groupList);
08024     if (groupItem != NULL)
08025         (void) LST_Position(&(*srcObj)->groupList, (void *)groupItem);
08026 
08027     while (groupItem != NULL) {
08028         elementItem = (void *)LST_Head(&groupItem->elementList);
08029         if (elementItem != NULL)
08030             (void) LST_Position(&groupItem->elementList, (void *)elementItem);
08031         while (elementItem != NULL) {
08032             if (elementItem->element.representation == DCM_SQ) {
08033                 copySequence(&dstObj, &elementItem->element);
08034             } else {
08035                 DCM_AddElement((DCM_OBJECT **) & dstObj, &elementItem->element);
08036             }
08037             elementItem = (void *)LST_Next(&groupItem->elementList);
08038         }
08039         groupItem = (void *)LST_Next(&(*srcObj)->groupList);
08040     }
08041 
08042     /**dst = (DCM_OBJECT *) dstObj;*/
08043     return DCM_NORMAL;
08044 }

char* DCM_Message CONDITION    condition
 

Definition at line 8322 of file l_mri_dicom_hdr.c.

References vector::cond, CONDITION, and vector::message.

Referenced by checkAttributeOrder(), checkObject(), copyData(), DCM_AddElement(), DCM_AddFragment(), DCM_AddSequenceElement(), DCM_CloseObject(), DCM_CopyObject(), DCM_CreateObject(), DCM_GetCompressedValue(), DCM_GetElement(), DCM_GetElementSize(), DCM_GetElementValue(), DCM_GetElementValueList(), DCM_GetElementValueOffset(), DCM_GetSequenceByOffset(), DCM_GetSequenceElement(), DCM_GetSequenceList(), DCM_ImportStream(), DCM_ListToString(), DCM_LookupElement(), DCM_MergeObject(), DCM_OpenFile(), DCM_PrintSequenceList(), DCM_ReadStream(), DCM_RemoveElement(), DCM_RemoveGroup(), DCM_WriteFile(), exportData(), exportEncapsulatedPixels(), exportPixels(), exportPreamble(), exportStream(), extractFileOptions(), findCreateGroup(), handleGroupItem(), insertNewElement(), insertThisElementItem(), newElementItem(), readData(), readFile(), readFile1(), readGroupElement(), readLengthToEnd(), readPreamble(), readSequence(), readVRLength(), and writeFile().

08323 {
08324     int
08325         index;
08326 
08327     for (index = 0; messageVector[index].message != NULL; index++)
08328         if (condition == messageVector[index].cond)
08329             return messageVector[index].message;
08330 
08331     return NULL;
08332 }

CONDITION DCM_ModifyElements DCM_OBJECT **    callerObject,
DCM_ELEMENT   vector,
int    count,
DCM_FLAGGED_ELEMENT   flaggedVector,
int    flaggedCount,
int *    updateCount
 

Definition at line 2828 of file l_mri_dicom_hdr.c.

References c, checkObject(), COND_PopCondition(), CONDITION, DCM_ELEMENT::d, DCM_AddElement(), DCM_IsString(), DCM_NORMAL, DCM_OBJECT, DCM_RemoveElement(), DCM_FLAGGED_ELEMENT::e, DCM_FLAGGED_ELEMENT::flag, DCM_FLAGGED_ELEMENT::flagAddress, DCM_ELEMENT::length, object, DCM_ELEMENT::representation, and DCM_ELEMENT::tag.

02831 {
02832     PRIVATE_OBJECT
02833         ** object;
02834     CONDITION
02835         cond;
02836     DCM_ELEMENT
02837         e;
02838     int
02839         c = 0;
02840 
02841     object = (PRIVATE_OBJECT **) callerObject;
02842     cond = checkObject(object, "DCM_ModifyElement");
02843     if (cond != DCM_NORMAL)
02844         return cond;
02845 
02846     while (count-- > 0) {
02847         cond = DCM_RemoveElement(callerObject, vector->tag);
02848         if (cond != DCM_NORMAL)
02849             (void) COND_PopCondition(FALSE);
02850 
02851         e = *vector;
02852         if (DCM_IsString(e.representation))
02853             e.length = strlen(e.d.string);
02854 
02855         cond = DCM_AddElement(callerObject, &e);
02856         if (cond != DCM_NORMAL)
02857             return cond;
02858 
02859         c++;
02860         vector++;
02861     }
02862 
02863     while (flaggedCount-- > 0) {
02864         if ((*(flaggedVector->flagAddress) & flaggedVector->flag) != 0) {
02865             cond = DCM_RemoveElement(callerObject, flaggedVector->e.tag);
02866             if (cond != DCM_NORMAL)
02867                 (void) COND_PopCondition(FALSE);
02868 
02869             e = flaggedVector->e;
02870             if (DCM_IsString(e.representation))
02871                 e.length = strlen(e.d.string);
02872             cond = DCM_AddElement(callerObject, &e);
02873             if (cond != DCM_NORMAL)
02874                 return cond;
02875             c++;
02876         }
02877         flaggedVector++;
02878     }
02879 
02880     if (updateCount != NULL)
02881         *updateCount = c;
02882     return DCM_NORMAL;
02883 }

CONDITION DCM_OpenFile const char *    name,
unsigned long    opt,
DCM_OBJECT **    callerObject
 

Definition at line 1002 of file l_mri_dicom_hdr.c.

References close(), COND_PushCondition(), CONDITION, CTNBOOLEAN, DCM_DumpElements(), DCM_FILEACCESSERROR, DCM_FILEFORMATMASK, DCM_FILENAMEMASK, DCM_FILEOPENFAILED, DCM_ILLEGALOPTION, DCM_LENGTHTOENDMASK, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_ORDERMASK, DCM_TRYFILENAMECHANGE, DCM_USELENGTHTOEND, ENTRY, fd, fileSize(), name, O_BINARY, readFile(), readFile1(), readLengthToEnd(), remapFileName(), RETURN, rwc_fd, and U32.

Referenced by mri_dicom_header().

01003 {
01004     CONDITION cond;
01005     int fd;
01006     off_t fileOffset = 0;
01007     U32 lengthToEnd;
01008     U32 size;
01009     CTNBOOLEAN
01010         remainFileOpen = FALSE; /* Leave file open after parse ? */
01011 
01012 ENTRY("DCM_OpenFile") ;
01013 
01014     if ((opt & (DCM_ORDERMASK | DCM_FILEFORMATMASK)) == 0)
01015         RETURN(COND_PushCondition(DCM_ILLEGALOPTION,
01016                                DCM_Message(DCM_ILLEGALOPTION), "Byte order",
01017                                   "DCM_OpenFile"));
01018 
01019 #ifdef _MSC_VER
01020     fd = open(name, O_RDONLY | O_BINARY);
01021 #else
01022     rwc_fd = fd = open(name, O_RDONLY);
01023 #endif
01024     if ((fd < 0) && ((opt & DCM_FILENAMEMASK) == DCM_TRYFILENAMECHANGE)) {
01025         char mapName[1024];
01026         remapFileName(name, mapName);
01027 #ifdef _MSC_VER
01028         fd = open(mapName, O_RDONLY | O_BINARY);
01029 #else
01030         fd = open(mapName, O_RDONLY);
01031         if (fd < 0) {
01032             strcat(mapName, ".");
01033             fd = open(mapName, O_RDONLY);
01034         }
01035 #endif
01036     }
01037     if (fd < 0) {
01038         char msg[1024] ;
01039         sprintf(msg,"DCM_OpenFile open(%s) fails",name) ;
01040         perror(msg) ;
01041         RETURN(COND_PushCondition(DCM_FILEOPENFAILED,
01042                                   DCM_Message(DCM_FILEOPENFAILED), name,
01043                                   "DCM_OpenFile"));
01044     }
01045     size = fileSize(fd);
01046     if (size <= 0)
01047         RETURN(DCM_FILEACCESSERROR);
01048 
01049     if ((opt & DCM_LENGTHTOENDMASK) == DCM_USELENGTHTOEND) {
01050         cond = readLengthToEnd(fd, name,
01051                                opt & (~DCM_LENGTHTOENDMASK), &lengthToEnd);
01052         if (cond != DCM_NORMAL) {
01053             (void) close(fd); rwc_fd = -1 ;
01054             RETURN(COND_PushCondition(DCM_FILEOPENFAILED,
01055                      DCM_Message(DCM_FILEOPENFAILED), name, "DCM_OpenFile"));
01056         }
01057         size = lengthToEnd;
01058         fileOffset = 24;
01059         (void) lseek(fd, 24, SEEK_SET);
01060     }
01061 #ifdef OLDSMM
01062     cond = readFile(name, NULL, fd, size, 0, 0, opt, callerObject, NULL,
01063                     &remainFileOpen, NULL, NULL, NULL);
01064 #endif
01065     cond = readFile1(name, NULL, fd, size, &fileOffset, 0, opt, NULL,
01066                      callerObject, NULL, &remainFileOpen, NULL, NULL, NULL);
01067     if ((cond != DCM_NORMAL) || !remainFileOpen){
01068         (void) close(fd); rwc_fd = -1 ;
01069     }
01070     if (cond != DCM_NORMAL) {
01071         if (debug)
01072             DCM_DumpElements(callerObject, 1);
01073         RETURN(COND_PushCondition(DCM_FILEOPENFAILED,
01074                      DCM_Message(DCM_FILEOPENFAILED), name, "DCM_OpenFile"));
01075     } else
01076         RETURN(DCM_NORMAL);
01077 }

CONDITION DCM_ParseObject DCM_OBJECT **    callerObject,
DCM_ELEMENT   vector,
int    count,
DCM_FLAGGED_ELEMENT   flaggedVector,
int    flagCount,
int *    parseCount
 

Definition at line 2918 of file l_mri_dicom_hdr.c.

References c, checkObject(), COND_PopCondition(), CONDITION, DCM_ELEMENT::d, DCM_GetElementValue(), DCM_IsString(), DCM_NORMAL, DCM_OBJECT, DCM_FLAGGED_ELEMENT::e, DCM_FLAGGED_ELEMENT::flag, DCM_FLAGGED_ELEMENT::flagAddress, l, object, p, DCM_ELEMENT::representation, and U32.

Referenced by DCM_GetSequenceElement(), DCM_GetString(), and setFileOptions().

02921 {
02922     PRIVATE_OBJECT
02923         ** object;
02924     CONDITION
02925         cond;
02926     void
02927        *ctx;
02928     U32
02929         l;
02930     int
02931         c = 0;
02932     char
02933        *p;
02934 
02935     object = (PRIVATE_OBJECT **) callerObject;
02936     cond = checkObject(object, "DCM_ParseObject");
02937     if (cond != DCM_NORMAL)
02938         return cond;
02939 
02940     while (count-- > 0) {
02941         ctx = NULL;
02942         cond = DCM_GetElementValue(callerObject, vector, &l, &ctx);
02943         if (cond != DCM_NORMAL)
02944             return cond;
02945         if (DCM_IsString(vector->representation)) {
02946             vector->d.string[l] = '\0';
02947             p = vector->d.string + l - 1;
02948             while (p >= vector->d.string && (*p == ' '))
02949                 *p-- = '\0';
02950         }
02951         c++;
02952         vector++;
02953     }
02954 
02955     while (flagCount-- > 0) {
02956         ctx = NULL;
02957         cond = DCM_GetElementValue(callerObject, &flaggedVector->e, &l, &ctx);
02958         if (cond != DCM_NORMAL) {
02959             (void) COND_PopCondition(FALSE);
02960         } else {
02961             c++;
02962             if (DCM_IsString(flaggedVector->e.representation)) {
02963                 flaggedVector->e.d.string[l] = '\0';
02964                 p = flaggedVector->e.d.string + l - 1;
02965                 while (p >= flaggedVector->e.d.string && (*p == ' '))
02966                     *p-- = '\0';
02967             }
02968             *(flaggedVector->flagAddress) |= flaggedVector->flag;
02969         }
02970         flaggedVector++;
02971     }
02972 
02973     if (parseCount != NULL)
02974         *parseCount = c;
02975     return DCM_NORMAL;
02976 }

CONDITION DCM_PrintSequenceList DCM_OBJECT **    object,
DCM_TAG    tag
 

Definition at line 7845 of file l_mri_dicom_hdr.c.

References checkObject(), COND_PushCondition(), CONDITION, DCM_ELEMENT::d, DCM_ELEMENTNOTFOUND, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_TAG, DCM_TAG_ELEMENT, DCM_TAG_GROUP, PRV_ELEMENT_ITEM::element, locateElement(), LST_Head(), LST_Next(), LST_Position(), DCM_SEQUENCE_ITEM::object, object, PRIVATE_OBJECT::objectSize, PRIVATE_OBJECT::offset, PRIVATE_OBJECT::pixelOffset, and RWC_printf().

07846 {
07847     PRIVATE_OBJECT **obj,
07848        *sqObject;
07849     CONDITION cond;
07850     PRV_ELEMENT_ITEM *elementItem;
07851     LST_HEAD *lst;
07852     DCM_SEQUENCE_ITEM *sqItem;
07853 
07854     obj = (PRIVATE_OBJECT **) object;
07855     cond = checkObject(obj, "DCM_PrintSequenceList");
07856     if (cond != DCM_NORMAL)
07857         return cond;
07858 
07859     elementItem = locateElement(obj, tag);
07860 
07861     if (elementItem == NULL)
07862         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
07863                        DCM_Message(DCM_ELEMENTNOTFOUND), DCM_TAG_GROUP(tag),
07864                                   DCM_TAG_ELEMENT(tag),
07865                                   "DCM_PrintSequenceList");
07866 
07867     lst = elementItem->element.d.sq;
07868     sqItem = (void *)LST_Head(&lst);
07869     (void) LST_Position(&lst, (void *)sqItem);
07870     while (sqItem != NULL) {
07871         sqObject = (PRIVATE_OBJECT *) sqItem->object;
07872         RWC_printf("size: %6d offset: %6d, pixel offset: %6d\n",
07873                sqObject->objectSize,
07874                sqObject->offset,
07875                sqObject->pixelOffset);
07876         sqItem = (void *)LST_Next(&lst);
07877     }
07878 }

CONDITION DCM_ReadStream DCM_OBJECT **    callerObject,
unsigned long    opt,
long    size,
void *    ctx,
CONDITION(*    rd)(void *ctx, void *buf, int toRead, int *bytesRead),
CONDITION(*    sk)(void *ctx, int offset, int flag)
 

Definition at line 1080 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), CONDITION, CTNBOOLEAN, DCM_FILEFORMATMASK, DCM_ILLEGALOPTION, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_ORDERMASK, DCM_READSTREAMFAILED, fd, offset, and readFile1().

01084 {
01085     CONDITION cond;
01086     int fd = -1;
01087     CTNBOOLEAN
01088         remainFileOpen = FALSE; /* Leave file open after parse ? */
01089     off_t fileOffset = 0;
01090 
01091     if ((opt & (DCM_ORDERMASK | DCM_FILEFORMATMASK)) == 0)
01092         return COND_PushCondition(DCM_ILLEGALOPTION,
01093                                DCM_Message(DCM_ILLEGALOPTION), "Byte order",
01094                                   "DCM_ReadStream");
01095 
01096     cond = readFile1("", NULL, fd, size, &fileOffset, 0, opt, NULL,
01097                      callerObject, NULL, &remainFileOpen, ctx, rd, sk);
01098     if (cond != DCM_NORMAL)
01099         return COND_PushCondition(DCM_READSTREAMFAILED,
01100                        DCM_Message(DCM_READSTREAMFAILED), "DCM_ReadStream");
01101     else
01102         return DCM_NORMAL;
01103 }

CONDITION DCM_RemoveElement DCM_OBJECT **    callerObject,
DCM_TAG    tag
 

Definition at line 1512 of file l_mri_dicom_hdr.c.

References PRV_GROUP_ITEM::baseLength, checkObject(), COND_PushCondition(), CONDITION, CTN_FREE, CTNBOOLEAN, DCM_ELEMENT::d, DCM_ELEMENTNOTFOUND, DCM_Message(), DCM_NORMAL, DCM_OB, DCM_OBJECT, DCM_OW, DCM_SQ, DCM_TAG, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_UNSPECIFIEDLENGTH, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, PRV_GROUP_ITEM::group, PRV_GROUP_ITEM::longVRAttributes, LST_Head(), LST_K_AFTER, LST_Next(), LST_Position(), LST_Remove(), object, PRV_ELEMENT_ITEM::paddedDataLength, DCM_ELEMENT::representation, and DCM_ELEMENT::tag.

Referenced by DCM_ModifyElements().

01513 {
01514     PRIVATE_OBJECT
01515         ** object;
01516     PRV_GROUP_ITEM
01517         * groupItem;
01518     PRV_ELEMENT_ITEM
01519         * elementItem,
01520         *groupLengthItem;
01521     CONDITION
01522         cond;
01523     CTNBOOLEAN
01524         flag;
01525     unsigned short
01526         group,
01527         element;
01528 
01529     object = (PRIVATE_OBJECT **) callerObject;
01530     cond = checkObject(object, "DCM_RemoveElement");
01531     if (cond != DCM_NORMAL)
01532         return cond;
01533 
01534     group = DCM_TAG_GROUP(tag);
01535     element = DCM_TAG_ELEMENT(tag);
01536 
01537     groupItem = (void *)LST_Head(&((*object)->groupList));
01538     if (groupItem == NULL)
01539         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
01540                            DCM_Message(DCM_ELEMENTNOTFOUND), group, element,
01541                                   "DCM_RemoveElement");
01542 
01543     (void) LST_Position(&((*object)->groupList), (void *)groupItem);
01544 
01545     flag = FALSE;
01546     while ((groupItem != NULL) && (flag == FALSE)) {
01547         if (groupItem->group == group)
01548             flag = TRUE;
01549         else
01550             groupItem = (void *)LST_Next(&(*object)->groupList);
01551     }
01552     if (flag == FALSE)
01553         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
01554                            DCM_Message(DCM_ELEMENTNOTFOUND), group, element,
01555                                   "DCM_RemoveElement");
01556 
01557     elementItem = (void *)LST_Head(&groupItem->elementList);
01558     if (elementItem == NULL)
01559         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
01560                            DCM_Message(DCM_ELEMENTNOTFOUND), group, element,
01561                                   "DCM_RemoveElement");
01562 
01563     (void) LST_Position(&groupItem->elementList, (void *)elementItem);
01564 
01565     groupLengthItem = elementItem;
01566     if (DCM_TAG_ELEMENT(groupLengthItem->element.tag) != 0x0000)
01567         groupLengthItem = NULL;
01568 
01569 
01570     flag = FALSE;
01571     while ((elementItem != NULL) && (flag == FALSE)) {
01572         if (DCM_TAG_ELEMENT(elementItem->element.tag) == element)
01573             flag = TRUE;
01574         else
01575             elementItem = (void *)LST_Next(&groupItem->elementList);
01576     }
01577 
01578     if (flag == FALSE)
01579         return COND_PushCondition(DCM_ELEMENTNOTFOUND,
01580                            DCM_Message(DCM_ELEMENTNOTFOUND), group, element,
01581                                   "DCM_RemoveElement");
01582 
01583     if (groupItem->baseLength != DCM_UNSPECIFIEDLENGTH) {
01584         groupItem->baseLength -= elementItem->paddedDataLength + 2 + 2 + 4;
01585         if (groupLengthItem != NULL) {
01586             *groupLengthItem->element.d.ul = groupItem->baseLength;
01587         }
01588     }
01589     if ((*object)->objectSize != DCM_UNSPECIFIEDLENGTH)
01590         (*object)->objectSize -= elementItem->paddedDataLength + 2 + 2 + 4;
01591     if (elementItem->element.representation == DCM_OW ||
01592         elementItem->element.representation == DCM_OB ||
01593         elementItem->element.representation == DCM_SQ) {
01594         groupItem->longVRAttributes--;
01595         (*object)->longVRAttributes--;
01596     }
01597     (void) LST_Remove(&(groupItem->elementList), LST_K_AFTER);
01598     CTN_FREE(elementItem);
01599     return DCM_NORMAL;
01600 }

CONDITION DCM_RemoveGroup DCM_OBJECT **    callerObject,
unsigned short    group
 

Definition at line 3003 of file l_mri_dicom_hdr.c.

References checkObject(), COND_PushCondition(), CONDITION, CTN_FREE, CTNBOOLEAN, DCM_GROUPNOTFOUND, DCM_LISTFAILURE, DCM_Message(), DCM_NORMAL, DCM_OBJECT, PRV_GROUP_ITEM::elementList, PRV_GROUP_ITEM::group, LST_Destroy(), LST_Head(), LST_K_AFTER, LST_Next(), LST_NORMAL, LST_Pop(), LST_Position(), LST_Remove(), and object.

03004 {
03005     PRIVATE_OBJECT
03006         ** object;
03007     CONDITION
03008         cond;
03009     PRV_GROUP_ITEM
03010         * groupItem;
03011     PRV_ELEMENT_ITEM
03012         * elementItem;
03013     CTNBOOLEAN
03014         found = FALSE;
03015 
03016     object = (PRIVATE_OBJECT **) callerObject;
03017     cond = checkObject(object, "DCM_RemoveGroup");
03018     if (cond != DCM_NORMAL)
03019         return cond;
03020 
03021     groupItem = (void *)LST_Head(&(*object)->groupList);
03022     if (groupItem == NULL)
03023         return COND_PushCondition(DCM_GROUPNOTFOUND,
03024             DCM_Message(DCM_GROUPNOTFOUND), (int) group, "DCM_RemoveGroup");
03025 
03026     (void) LST_Position(&(*object)->groupList, (void *)groupItem);
03027 
03028     while (!found && (groupItem != NULL)) {
03029         if (groupItem->group == group)
03030             found = TRUE;
03031         else
03032             groupItem = (void *)LST_Next(&(*object)->groupList);
03033     }
03034     if (groupItem == NULL)
03035         return COND_PushCondition(DCM_GROUPNOTFOUND,
03036             DCM_Message(DCM_GROUPNOTFOUND), (int) group, "DCM_RemoveGroup");
03037 
03038 
03039     while ((elementItem = (void *)LST_Pop(&groupItem->elementList)) != NULL)
03040         CTN_FREE(elementItem);
03041 
03042     groupItem = (void *)LST_Remove(&(*object)->groupList, LST_K_AFTER);
03043     cond = LST_Destroy(&groupItem->elementList);
03044     if (cond != LST_NORMAL)
03045         return COND_PushCondition(DCM_LISTFAILURE,
03046                            DCM_Message(DCM_LISTFAILURE), "DCM_RemoveGroup");
03047     CTN_FREE(groupItem);
03048     return DCM_NORMAL;
03049 }

CONDITION DCM_ScanParseObject DCM_OBJECT **    callerObject,
void *    buf,
size_t    bufferSize,
DCM_FLAGGED_ELEMENT   elementVector,
int    vectorLength,
CONDITION(*    callback)(const DCM_ELEMENT *e, void *ctx),
void *    ctx
 

Definition at line 2105 of file l_mri_dicom_hdr.c.

References checkObject(), CONDITION, copyData(), CTNBOOLEAN, DCM_IsString(), DCM_NORMAL, DCM_OBJECT, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, i, l, LST_Head(), LST_Next(), LST_Position(), object, p, DCM_ELEMENT::representation, DCM_ELEMENT::tag, and U32.

02109 {
02110     PRIVATE_OBJECT
02111         ** object;
02112     PRV_GROUP_ITEM
02113         * groupItem;
02114     PRV_ELEMENT_ITEM
02115         * elementItem;
02116     CONDITION
02117         cond;
02118     CTNBOOLEAN
02119         done = FALSE;
02120     DCM_ELEMENT
02121         e;
02122     int
02123         i;
02124     CTNBOOLEAN
02125         found;
02126     U32
02127         l;
02128     char
02129        *p;
02130 
02131     object = (PRIVATE_OBJECT **) callerObject;
02132     cond = checkObject(object, "DCM_ScanParseObject");
02133     if (cond != DCM_NORMAL)
02134         return cond;
02135 
02136     groupItem = (void *)LST_Head(&((*object)->groupList));
02137     (void) LST_Position(&((*object)->groupList), (void *)groupItem);
02138     while (groupItem != NULL && !done) {
02139         elementItem = (void *)LST_Head(&groupItem->elementList);
02140         (void) LST_Position(&groupItem->elementList, (void *)elementItem);
02141         while (elementItem != NULL && !done) {
02142             for (found = FALSE, i = 0; !found && i < vectorLength; i++) {
02143                 if (elementItem->element.tag == elementVector[i].e.tag) {
02144                     found = TRUE;
02145                     (void)copyData(object,elementItem,&elementVector[i].e, &l);
02146                     *elementVector[i].flagAddress |= elementVector[i].flag;
02147 
02148                     if (DCM_IsString(elementVector[i].e.representation)) {
02149                         elementVector[i].e.d.string[l] = '\0';
02150                         p = elementVector[i].e.d.string + l - 1;
02151                         while (p >= elementVector[i].e.d.string && (*p == ' '))
02152                             *p-- = '\0';
02153                     }
02154                 }
02155             }
02156             if (!found) {
02157                 e = elementItem->element;
02158                 cond = callback(&e, ctx);
02159                 if (cond != DCM_NORMAL)
02160                     done = TRUE;
02161             }
02162             elementItem = (void *)LST_Next(&groupItem->elementList);
02163         }
02164         groupItem = (void *)LST_Next(&((*object)->groupList));
02165     }
02166     return DCM_NORMAL;
02167 }

CONDITION DCM_WriteFile DCM_OBJECT **    callerObject,
unsigned long    opt,
const char *    file
 

Definition at line 2748 of file l_mri_dicom_hdr.c.

References checkObject(), close(), COND_PushCondition(), CONDITION, DCM_ExportStream(), DCM_FILECREATEFAILED, DCM_Message(), DCM_NORMAL, DCM_OBJECT, fd, file, O_BINARY, O_WRONLY, object, strerror(), and writeFile().

02749 {
02750     PRIVATE_OBJECT
02751         ** object;
02752     int
02753         fd;
02754     unsigned char
02755         buf[2048];
02756     CONDITION
02757         cond;
02758 
02759     object = (PRIVATE_OBJECT **) callerObject;
02760     cond = checkObject(object, "DCM_WriteFile");
02761     if (cond != DCM_NORMAL)
02762         return cond;
02763 #ifdef MACOS
02764     fd = open(file, O_WRONLY | O_CREAT | O_TRUNC);
02765 #elif _MSC_VER
02766     fd = _open(file, O_WRONLY | O_CREAT | O_TRUNC | O_BINARY,
02767                _S_IREAD | _S_IWRITE);
02768 #else
02769     fd = open(file, O_WRONLY | O_CREAT | O_TRUNC, 0666);
02770 #endif
02771     if (fd < 0) {
02772         return COND_PushCondition(DCM_FILECREATEFAILED,
02773                    DCM_Message(DCM_FILECREATEFAILED), file, strerror(errno),
02774                                   "DCM_WriteFile");
02775     }
02776     cond = DCM_ExportStream(callerObject, opt, buf,
02777                             (unsigned long) sizeof(buf), writeFile, &fd);
02778     if (cond != DCM_NORMAL)
02779         return cond;
02780 
02781     (void) close(fd);
02782     return DCM_NORMAL;
02783 }

void dumpBinaryData void *    d,
DCM_VALUEREPRESENTATION    vr,
long    vm,
long    vmLimit
[static]
 

Definition at line 7567 of file l_mri_dicom_hdr.c.

References DCM_OB, DCM_SL, DCM_SS, DCM_UL, DCM_UN, DCM_US, DCM_VALUEREPRESENTATION, dumpOB(), dumpSL(), dumpSS(), dumpUL(), dumpUS(), U32, and vm.

Referenced by DCM_DumpElements(), and DCM_FormatElements().

07569 {
07570     vm = (vm < vmLimit) ? vm : vmLimit;
07571 
07572     if (vm <= 1)
07573         return;
07574 
07575     switch (vr) {
07576     case DCM_SL:
07577         dumpSL((S32 *) d, vm);
07578         break;
07579     case DCM_UL:
07580         dumpUL((U32 *) d, vm);
07581         break;
07582     case DCM_SS:
07583         dumpSS((short *) d, vm);
07584         break;
07585     case DCM_US:
07586         dumpUS((unsigned short *) d, vm);
07587         break;
07588     case DCM_OB:
07589     case DCM_UN:
07590         dumpOB((unsigned char*) d, vm);
07591         break;
07592     default:
07593         break;
07594     }
07595 }

void dumpOB unsigned char *    c,
long    vm
[static]
 

Definition at line 7554 of file l_mri_dicom_hdr.c.

References c, RWC_printf(), and vm.

Referenced by dumpBinaryData().

07555 {
07556   long index = 0;
07557   RWC_printf("hex OB:") ;
07558   while (index < vm) {
07559     RWC_printf("%02x ", *(c++));
07560     if ((++index) % 8 == 0)
07561       RWC_printf("\n");
07562   }
07563   if( index%8 != 0 ) RWC_printf("\n");
07564 }

void dumpSL S32   sl,
long    vm
[static]
 

Definition at line 7517 of file l_mri_dicom_hdr.c.

References RWC_printf(), and vm.

Referenced by dumpBinaryData().

07518 {
07519     long index = 0;
07520     RWC_printf("decimal SL:") ;
07521     while (index < vm) {
07522         RWC_printf("%7d ", *(sl++));
07523         if ((++index) % 8 == 0)
07524             RWC_printf("\n");
07525     }
07526     RWC_printf("\n");
07527 }

void dumpSS short *    ss,
long    vm
[static]
 

Definition at line 7504 of file l_mri_dicom_hdr.c.

References RWC_printf(), and vm.

Referenced by dumpBinaryData().

07505 {
07506     long index = 0;
07507     RWC_printf("decimal SS:") ;
07508     while (index < vm) {
07509         RWC_printf("%7d ", *(ss++));
07510         if ((++index) % 8 == 0)
07511             RWC_printf("\n");
07512     }
07513     RWC_printf("\n");
07514 }

void dumpstack FILE *    fp [static]
 

Definition at line 645 of file l_mri_dicom_hdr.c.

References stackPtr.

Referenced by COND_DumpConditions(), COND_PushCondition(), and COND_WriteConditions().

00646 {
00647     int
00648         index;
00649 
00650     for (index = 0; index <= stackPtr; index++)
00651         fprintf(lfp, "%8x %s\n", (unsigned int)EDBStack[index].statusCode,
00652                 EDBStack[index].statusText);
00653 }

void dumpUL U32   ul,
long    vm
[static]
 

Definition at line 7542 of file l_mri_dicom_hdr.c.

References RWC_printf(), U32, and vm.

Referenced by dumpBinaryData().

07543 {
07544     long index = 0;
07545     RWC_printf("decimal UL:") ;
07546     while (index < vm) {
07547         RWC_printf("%7d ", *(ul++));
07548         if ((++index) % 8 == 0)
07549             RWC_printf("\n");
07550     }
07551     RWC_printf("\n");
07552 }

void dumpUS unsigned short *    us,
long    vm
[static]
 

Definition at line 7530 of file l_mri_dicom_hdr.c.

References RWC_printf(), and vm.

Referenced by dumpBinaryData().

07531 {
07532     long index = 0;
07533     RWC_printf("decimal US:") ;
07534     while (index < vm) {
07535         RWC_printf("%7d ", *(us++));
07536         if ((++index) % 8 == 0)
07537             RWC_printf("\n");
07538     }
07539     RWC_printf("\n");
07540 }

CONDITION exportData PRIVATE_OBJECT **    object,
PRV_ELEMENT_ITEM   item,
unsigned char *    src,
unsigned char *    dst,
U32    length,
int    byteOrder,
U32   rtnLength
[static]
 

Definition at line 4441 of file l_mri_dicom_hdr.c.

References PRV_ELEMENT_ITEM::byteOrder, BYTEORDER_SAME, COND_PushCondition(), CONDITION, PRV_ELEMENT_ITEM::currentOffset, DCM_ELEMENT::d, DCM_AE, DCM_AS, DCM_AT, DCM_CS, DCM_DA, DCM_DD, DCM_DS, DCM_DT, DCM_FD, DCM_FILEACCESSERROR, DCM_FL, DCM_GENERALWARNING, DCM_IS, DCM_LO, DCM_LT, DCM_Message(), DCM_NORMAL, DCM_OB, DCM_OT, DCM_OW, DCM_PN, DCM_PXLPIXELDATA, DCM_SH, DCM_SL, DCM_SQ, DCM_SS, DCM_ST, DCM_TAG, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_TM, DCM_UI, DCM_UL, DCM_UN, DCM_US, DCM_UT, PRV_ELEMENT_ITEM::element, groupElement, DCM_ELEMENT::length, object, p, read(), DCM_ELEMENT::representation, swab, swapATGroupElement(), swapInPlace(), DCM_ELEMENT::tag, and U32.

Referenced by exportPixels(), and exportStream().

04445 {
04446 /* repair OT for pixel data*/
04447     unsigned char
04448        *p;
04449     DCM_TAG
04450         * tag;
04451     DCM_ELEMENT
04452         * element;
04453     int nBytes;
04454     CONDITION cond;
04455 
04456     element = &item->element;
04457 
04458     *rtnLength = 0;
04459     if (element->d.ot == NULL) {
04460         if ((*object)->fd != -1) {
04461             (void) lseek((*object)->fd, item->currentOffset, SEEK_SET);
04462             nBytes = read((*object)->fd, b, (int) length);
04463         } else {
04464             (*object)->sk((*object)->userCtx, item->currentOffset, SEEK_SET);
04465             cond = (*object)->rd((*object)->userCtx, b, (long) length, &nBytes);
04466         }
04467         if ((U32) nBytes != length) {
04468             char b[512];
04469             sprintf(b, "byte count: %d %d, errno: %d", nBytes, length, errno);
04470             (void) COND_PushCondition(DCM_GENERALWARNING,
04471                           DCM_Message(DCM_GENERALWARNING), "exportData", b);
04472             return COND_PushCondition(DCM_FILEACCESSERROR,
04473                       DCM_Message(DCM_FILEACCESSERROR), (*object)->fileName,
04474                                       "exportData");
04475         }
04476         if( LITTLE_ENDIAN_ARCHITECTURE ){
04477           if (item->element.representation == DCM_AT) {
04478               DCM_ELEMENT e;
04479               e = *element;
04480               e.length = length;
04481               e.d.ot = b;
04482               swapATGroupElement(&e);
04483           }
04484         }
04485         if (byteOrder != item->byteOrder) {
04486             DCM_ELEMENT e;
04487             e = *element;
04488             e.length = length;
04489             e.d.ot = b;
04490             swapInPlace(object, &e);
04491         }
04492         *rtnLength = (U32) nBytes;
04493         item->currentOffset += nBytes;
04494     } else {
04495         p = src;
04496         switch (element->representation) {
04497         case DCM_AE:
04498         case DCM_AS:
04499         case DCM_CS:
04500         case DCM_DA:
04501         case DCM_DT:
04502         case DCM_DD:
04503         case DCM_DS:
04504         case DCM_FD:
04505         case DCM_IS:
04506         case DCM_LO:
04507         case DCM_LT:
04508         case DCM_OB:
04509         case DCM_OT:
04510         case DCM_PN:
04511         case DCM_SH:
04512         case DCM_SQ:
04513         case DCM_ST:
04514         case DCM_TM:
04515         case DCM_UI:
04516         case DCM_UT:
04517             (void) memcpy(b, p, length);
04518             *rtnLength = length;
04519             break;
04520         case DCM_AT:
04521             tag = (DCM_TAG *) p;
04522             while (length >= 4) {
04523                 groupElement.sh[0] = DCM_TAG_GROUP(*tag);
04524                 groupElement.sh[1] = DCM_TAG_ELEMENT(*tag);
04525                 if (byteOrder == BYTEORDER_SAME) {
04526                     *b++ = groupElement.ch[0];  /* Copy the group */
04527                     *b++ = groupElement.ch[1];
04528                     *b++ = groupElement.ch[2];  /* Now, the element */
04529                     *b++ = groupElement.ch[3];
04530                 } else {
04531                     *b++ = groupElement.ch[1];  /* Copy the group */
04532                     *b++ = groupElement.ch[0];
04533                     *b++ = groupElement.ch[3];  /* Now, the element */
04534                     *b++ = groupElement.ch[2];
04535                 }
04536                 tag++;
04537                 length -= 4;
04538                 *rtnLength += 4;
04539             }
04540             break;
04541         case DCM_SL:
04542         case DCM_UL:
04543         case DCM_FL:
04544             while (length >= 4) {
04545                 if (byteOrder == BYTEORDER_SAME) {
04546                     *b++ = *p++;
04547                     *b++ = *p++;
04548                     *b++ = *p++;
04549                     *b++ = *p++;
04550                 } else {
04551                     *b++ = p[3];
04552                     *b++ = p[2];
04553                     *b++ = p[1];
04554                     *b++ = p[0];
04555                     p += 4;
04556                 }
04557                 length -= 4;
04558                 *rtnLength += 4;
04559             }
04560             break;
04561         case DCM_SS:
04562         case DCM_US:
04563         case DCM_OW:
04564             /*
04565              * Temorary hack by Nilesh to support memory mapping for testing
04566              * purposes.
04567              */
04568             length &= ~1;
04569             *rtnLength += length;
04570             if (element->tag == DCM_PXLPIXELDATA) {
04571                 if (byteOrder == item->byteOrder)
04572                     (void) memcpy(b, p, length);
04573                 else
04574 #ifdef SOLARIS
04575                     swab((char *) p, (char *) b, length);
04576 #elif defined AIXV3
04577                 swab((short *) p, (short *) b, length);
04578 #elif defined MACOS
04579                 /* Not Yet Defined */
04580 #else
04581                     swab(p, b, length);
04582 #endif
04583             } else {
04584                 if (byteOrder == BYTEORDER_SAME)
04585                     (void) memcpy(b, p, length);
04586                 else
04587 #ifdef SOLARIS
04588                     swab((char *) p, (char *) b, length);
04589 #elif defined AIXV3
04590                 swab((short *) p, (short *) b, length);
04591 #elif defined MACOS
04592                 /* Not Yet Defined */
04593 #else
04594                     swab(p, b, length);
04595 #endif
04596             }
04597             break;
04598         /*case DCM_UNKNOWN:*/
04599         case DCM_UN:
04600         default:
04601 #if 0
04602             fprintf(stderr, "Should not get to default in exportData: %08x\n",
04603                     element->tag);
04604 #endif
04605             (void) memcpy(b, p, length);
04606             *rtnLength = length;
04607             break;
04608         }
04609     }
04610     return DCM_NORMAL;
04611 }

CONDITION exportEncapsulatedPixels PRIVATE_OBJECT **    object,
PRV_ELEMENT_ITEM   item,
unsigned char *    buffer,
U32    bufferlength,
DCM_EXPORT_STREAM_CALLBACK   callback,
void *    ctx
[static]
 

Definition at line 4614 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), CONDITION, DCM_ELEMENT::d, PRV_ELEMENT_ITEM::dataOffset, DCM_CALLBACKABORTED, DCM_DLM, DCM_EXPORT_STREAM_CALLBACK, DCM_FILEACCESSERROR, DCM_GENERALWARNING, DCM_Message(), DCM_NOFRAGMENTSINOBJECT, DCM_NORMAL, DCM_OB, DCM_PXLPIXELDATA, PRV_ELEMENT_ITEM::element, exportFixedFields(), DCM_FRAGMENT_ITEM::fragment, PRV_ELEMENT_ITEM::fragmentFlag, DCM_FRAGMENT_ITEM::length, DCM_ELEMENT::length, LITTLE_ORDER, LST_Head(), LST_Next(), LST_Position(), object, PRV_ELEMENT_ITEM::originalDataLength, read(), DCM_ELEMENT::representation, RWC_printf(), DCM_ELEMENT::tag, and U32.

Referenced by exportPixels().

04617 {
04618   DCM_ELEMENT * element;
04619   int nBytes;
04620   CONDITION cond;
04621   U32 toExport;
04622   int length;
04623   DCM_FRAGMENT_ITEM* fragmentItem = 0;
04624   DCM_ELEMENT e;
04625   U32 rtnLength = 0;
04626 
04627   element = &item->element;
04628   if (element->d.ot == NULL) {
04629     if ((*object)->fd != -1) {
04630       /* Seek to the beginning of the data. Have to back up 12 bytes to
04631       ** get the pixel tag, VR, etc
04632       */
04633       (void) lseek((*object)->fd, item->dataOffset-12, SEEK_SET);
04634     } else {
04635       (*object)->sk((*object)->userCtx, item->dataOffset-12, SEEK_SET);
04636     }
04637 
04638     toExport = item->originalDataLength + 12;
04639     while(toExport > 0) {
04640       length = (toExport < bufferlength) ? toExport : bufferlength;
04641 
04642       if ((*object)->fd != -1) {
04643         nBytes = read((*object)->fd, buffer, length);
04644       } else {
04645         cond = (*object)->rd((*object)->userCtx, buffer, (long) length, &nBytes);
04646       }
04647       if ((U32) nBytes != length) {
04648         char b[512];
04649         sprintf(b, "byte count: %d %d, errno: %d", nBytes, length, errno);
04650         (void) COND_PushCondition(DCM_GENERALWARNING,
04651                           DCM_Message(DCM_GENERALWARNING), "exportEncapsualtedPixels", b);
04652         return COND_PushCondition(DCM_FILEACCESSERROR,
04653                       DCM_Message(DCM_FILEACCESSERROR), (*object)->fileName,
04654                                       "exportEncapsualtedPixels");
04655       }
04656       cond = callback(buffer, length, 0, ctx);
04657       if (cond != DCM_NORMAL) {
04658         return COND_PushCondition(DCM_CALLBACKABORTED,
04659               DCM_Message(DCM_CALLBACKABORTED), "exportStream");
04660       }
04661       toExport -= length;
04662     }
04663   } else {
04664     if (item->fragmentFlag != 1) {
04665       return COND_PushCondition(DCM_NOFRAGMENTSINOBJECT,
04666         "DCM Exporting pixels but did not find expected fragments in object");
04667     }
04668     e.tag = DCM_PXLPIXELDATA;
04669     e.d.ot = 0;
04670     e.representation = DCM_OB;
04671     e.length = 0xffffffff;
04672     exportFixedFields(&e, buffer, bufferlength,
04673                         LITTLE_ORDER /*byteOrder*/,
04674                         1 /* explicitV*/,
04675                         &rtnLength);
04676     toExport = rtnLength;
04677     e.tag = 0xfffee000;
04678     e.length = 0;
04679     e.representation = DCM_DLM;
04680     e.d.ot = 0;
04681     exportFixedFields(&e, buffer+toExport, bufferlength,
04682                         LITTLE_ORDER /*byteOrder*/,
04683                         1 /* explicitV*/,
04684                         &rtnLength);
04685     toExport += rtnLength;
04686 
04687     cond = callback(buffer, toExport, 0, ctx);
04688     if (cond != DCM_NORMAL) {
04689       return COND_PushCondition(DCM_CALLBACKABORTED,
04690               DCM_Message(DCM_CALLBACKABORTED), "exportEncapsulatedPixels");
04691     }
04692 
04693     fragmentItem = (DCM_FRAGMENT_ITEM*)LST_Head(&item->element.d.fragments);
04694     (void)LST_Position(&item->element.d.fragments, (void *)fragmentItem);
04695     while (fragmentItem != NULL) {
04696       RWC_printf("Fragment size: %6d\n", fragmentItem->length);
04697       e.tag = 0xfffee000;
04698       e.length = fragmentItem->length;
04699       e.representation = DCM_DLM;
04700       exportFixedFields(&e, buffer, bufferlength,
04701                         LITTLE_ORDER /*byteOrder*/,
04702                         1 /* explicitV*/,
04703                         &rtnLength);
04704       cond = callback(buffer, rtnLength, 0, ctx);
04705       if (cond != DCM_NORMAL) {
04706         return COND_PushCondition(DCM_CALLBACKABORTED,
04707               DCM_Message(DCM_CALLBACKABORTED), "exportEncapsulatedPixels");
04708       }
04709       cond = callback(fragmentItem->fragment, fragmentItem->length, 0, ctx);
04710       if (cond != DCM_NORMAL) {
04711         return COND_PushCondition(DCM_CALLBACKABORTED,
04712               DCM_Message(DCM_CALLBACKABORTED), "exportEncapsulatedPixels");
04713       }
04714 
04715       fragmentItem = (void *)LST_Next(&item->element.d.fragments);
04716     }
04717     e.tag = 0xfffee0dd;
04718     e.length = 0;
04719     e.representation = DCM_DLM;
04720     e.d.ot = 0;
04721     exportFixedFields(&e, buffer, bufferlength,
04722                         LITTLE_ORDER /*byteOrder*/,
04723                         1 /* explicitV*/,
04724                         &rtnLength);
04725     cond = callback(buffer, rtnLength, 0, ctx);
04726     if (cond != DCM_NORMAL) {
04727       return COND_PushCondition(DCM_CALLBACKABORTED,
04728               DCM_Message(DCM_CALLBACKABORTED), "exportEncapsulatedPixels");
04729     }
04730   }
04731   return DCM_NORMAL;
04732 }

void exportFixedFields DCM_ELEMENT   element,
unsigned char *    b,
U32    length,
int    byteOrder,
CTNBOOLEAN    explicitVR,
U32   rtnLength
[static]
 

Definition at line 4307 of file l_mri_dicom_hdr.c.

References BYTEORDER_SAME, CTNBOOLEAN, DCM_DLM, DCM_TAG_ELEMENT, DCM_TAG_GROUP, exportVRLength(), DCM_ELEMENT::length, p, DCM_ELEMENT::representation, DCM_ELEMENT::tag, and U32.

Referenced by exportEncapsulatedPixels(), exportPixels(), and exportStream().

04310 {
04311     unsigned char
04312        *p;
04313     unsigned short
04314         group,
04315         element;
04316     U32
04317         minimumLength;
04318 
04319     group = DCM_TAG_GROUP(e->tag);
04320     element = DCM_TAG_ELEMENT(e->tag);
04321     if (e->representation == DCM_DLM)
04322         explicitVR = FALSE;
04323 
04324     minimumLength = sizeof(group) + sizeof(element) + sizeof(e->length);
04325     if (explicitVR)
04326         minimumLength += 4;
04327 
04328     *rtnLength = 0;
04329     if (length >= minimumLength) {
04330         if (byteOrder == BYTEORDER_SAME) {
04331             p = (unsigned char *) &group;
04332             *b++ = *p++;
04333             *b++ = *p++;
04334             p = (unsigned char *) &element;
04335             *b++ = *p++;
04336             *b++ = *p++;
04337             *rtnLength += 4;
04338             if (explicitVR) {
04339                 exportVRLength(e, b, byteOrder, rtnLength);
04340             } else {
04341                 p = (unsigned char *) &e->length;
04342                 *b++ = *p++;
04343                 *b++ = *p++;
04344                 *b++ = *p++;
04345                 *b++ = *p++;
04346                 *rtnLength += 4;
04347             }
04348         } else {
04349             p = (unsigned char *) &group;
04350             *b++ = p[1];
04351             *b++ = p[0];
04352             p = (unsigned char *) &element;
04353             *b++ = p[1];
04354             *b++ = p[0];
04355             *rtnLength += 4;
04356             if (explicitVR) {
04357                 exportVRLength(e, b, byteOrder, rtnLength);
04358             } else {
04359                 p = (unsigned char *) &e->length;
04360                 *b++ = p[3];
04361                 *b++ = p[2];
04362                 *b++ = p[1];
04363                 *b++ = p[0];
04364                 *rtnLength += 4;
04365             }
04366         }
04367     }
04368 }

CONDITION exportPixels PRIVATE_OBJECT **    object,
PRV_ELEMENT_ITEM   item,
int    encapsulatedPixels,
unsigned char *    buffer,
U32    bufferlength,
DCM_EXPORT_STREAM_CALLBACK   callback,
void *    ctx,
int    byteOrder,
int    explicitVR
[static]
 

Definition at line 4735 of file l_mri_dicom_hdr.c.

References c, COND_PushCondition(), CONDITION, PRV_ELEMENT_ITEM::currentOffset, DCM_ELEMENT::d, PRV_ELEMENT_ITEM::dataOffset, DCM_CALLBACKABORTED, DCM_EXPORT_STREAM_CALLBACK, DCM_FILEACCESSERROR, DCM_GENERALWARNING, DCM_Message(), DCM_NORMAL, PRV_ELEMENT_ITEM::element, exportData(), exportEncapsulatedPixels(), exportFixedFields(), DCM_ELEMENT::length, object, PRV_ELEMENT_ITEM::originalDataLength, read(), DCM_ELEMENT::tag, and U32.

Referenced by exportStream().

04740 {
04741   DCM_ELEMENT * element;
04742   int nBytes;
04743   CONDITION cond;
04744   U32 toExport;
04745   U32 bytesExported = 0;
04746   U32 exportLength = 0;
04747   int length;
04748   U32 rtnLength;
04749   U32 remainingData;
04750   unsigned char* dst;
04751   unsigned char* src;
04752   int c;
04753 
04754   if (encapsulatedPixels) {
04755     return exportEncapsulatedPixels(object, item, buffer,
04756         bufferlength, callback, ctx);
04757   }
04758 
04759   element = &item->element;
04760   rtnLength = 0;
04761   dst = buffer;
04762   c = bufferlength;
04763   exportFixedFields(element, dst, bufferlength, byteOrder,
04764                                   explicitVR, &rtnLength);
04765   dst += rtnLength;
04766   c -= rtnLength;
04767   bytesExported = rtnLength;
04768 
04769   remainingData = element->length;
04770   src = element->d.ot;
04771   item->currentOffset = item->dataOffset;
04772 
04773   while (remainingData > 0) {
04774     if (debug) {
04775       fprintf(stderr, "Export: (%08x) %d\n", element->tag, element->length);
04776     }
04777 
04778     if (element->d.ot != NULL) {
04779       remainingData = element->length -
04780                             (src - ((unsigned char *) element->d.ot));
04781     } else {
04782       remainingData = element->length -
04783                             (item->currentOffset - item->dataOffset);
04784     }
04785 
04786     exportLength = (remainingData < c) ? remainingData : c;
04787     cond = exportData(object, item, src, dst,
04788                       exportLength, byteOrder, &rtnLength);
04789     if (cond != DCM_NORMAL)
04790       return cond;
04791 
04792     src += rtnLength;
04793     dst += rtnLength;
04794     bytesExported += rtnLength;
04795     c -= rtnLength;
04796 
04797     if (c <= 20) {
04798       cond = callback(buffer, bytesExported, 0, ctx);
04799       if (cond != DCM_NORMAL) {
04800         return COND_PushCondition(DCM_CALLBACKABORTED,
04801               DCM_Message(DCM_CALLBACKABORTED), "exportPixels");
04802       }
04803       bytesExported = 0;
04804       c = bufferlength;
04805       dst = (unsigned char *) buffer;
04806     }
04807   }
04808   if (bytesExported > 0) {
04809     cond = callback(buffer, bytesExported, 0, ctx);
04810     if (cond != DCM_NORMAL) {
04811       return COND_PushCondition(DCM_CALLBACKABORTED,
04812               DCM_Message(DCM_CALLBACKABORTED), "exportPixels");
04813     }
04814   }
04815 
04816   return DCM_NORMAL;
04817 
04818 #if 0
04819   if (element->d.ot == NULL) {
04820     if ((*object)->fd != -1) {
04821       /* Seek to the beginning of the data. Have to back up 12 bytes to
04822       ** get the pixel tag, VR, etc
04823       */
04824       (void) lseek((*object)->fd, item->dataOffset-12, SEEK_SET);
04825     } else {
04826       (*object)->sk((*object)->userCtx, item->dataOffset-12, SEEK_SET);
04827     }
04828 
04829     toExport = item->originalDataLength + 12;
04830     while(toExport > 0) {
04831       length = (toExport < bufferlength) ? toExport : bufferlength;
04832 
04833       if ((*object)->fd != -1) {
04834         nBytes = read((*object)->fd, buffer, length);
04835       } else {
04836         cond = (*object)->rd((*object)->userCtx, buffer, (long) length, &nBytes);
04837       }
04838       if ((U32) nBytes != length) {
04839         char b[512];
04840         sprintf(b, "byte count: %d %d, errno: %d", nBytes, length, errno);
04841         (void) COND_PushCondition(DCM_GENERALWARNING,
04842                           DCM_Message(DCM_GENERALWARNING), "exportPixels", b);
04843         return COND_PushCondition(DCM_FILEACCESSERROR,
04844                       DCM_Message(DCM_FILEACCESSERROR), (*object)->fileName,
04845                                       "exportPixels");
04846       }
04847       cond = callback(buffer, length, 0, ctx);
04848       if (cond != DCM_NORMAL) {
04849         return COND_PushCondition(DCM_CALLBACKABORTED,
04850               DCM_Message(DCM_CALLBACKABORTED), "exportStream");
04851       }
04852       toExport -= length;
04853     }
04854   } else {
04855   }
04856   return DCM_NORMAL;
04857 #endif
04858 
04859 }

CONDITION exportPreamble PRIVATE_OBJECT **    obj,
unsigned char *    dst,
U32    bufferLength,
U32   rtnLength
[static]
 

Definition at line 4253 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), DCM_EXPORTBUFFERTOOSMALL, DCM_Message(), DCM_NORMAL, DCM_PREAMBLELENGTH, and U32.

Referenced by exportStream().

04255 {
04256     *rtnLength = 0;
04257     if (bufferLength < (DCM_PREAMBLELENGTH + 4))
04258         return COND_PushCondition(DCM_EXPORTBUFFERTOOSMALL,
04259                   DCM_Message(DCM_EXPORTBUFFERTOOSMALL), (int) bufferLength,
04260                                   "exportPreamble");
04261 
04262     (void) memcpy(dst, (*obj)->preamble, DCM_PREAMBLELENGTH);
04263     dst += DCM_PREAMBLELENGTH;
04264     (void) memcpy(dst, "DICM", 4);
04265     *rtnLength += DCM_PREAMBLELENGTH + 4;
04266 
04267     return DCM_NORMAL;
04268 }

CONDITION exportStream DCM_OBJECT **    callerObject,
unsigned long    opt,
void *    buffer,
U32    bufferlength,
DCM_EXPORT_STREAM_CALLBACK   callback,
void *    ctx,
int    sequenceLevel
[static]
 

Definition at line 5183 of file l_mri_dicom_hdr.c.

References BIG_ORDER, c, checkObject(), computeGroupLength(), COND_PushCondition(), CONDITION, CTNBOOLEAN, PRV_ELEMENT_ITEM::currentOffset, DCM_ELEMENT::d, PRV_ELEMENT_ITEM::dataOffset, DCM_CALLBACKABORTED, DCM_DLM, DCM_DLMITEM, DCM_DLMITEMDELIMITATIONITEM, DCM_DLMSEQUENCEDELIMITATIONITEM, DCM_ENCAPSULATEDPIXELS, DCM_EXPLICITBIGENDIAN, DCM_EXPLICITLITTLEENDIAN, DCM_EXPORT_STREAM_CALLBACK, DCM_FILEFORMATMASK, DCM_GROUPFILEMETA, DCM_ILLEGALOPTION, DCM_LISTFAILURE, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_ORDERBIGENDIAN, DCM_ORDERLITTLEENDIAN, DCM_ORDERMASK, DCM_ORDERNATIVE, DCM_PART10FILE, DCM_PXLPIXELDATA, DCM_SEQUENCELENGTHMASK, DCM_SQ, DCM_TAG_ELEMENT, DCM_UNSPECIFIEDLENGTH, DCM_UNSPECIFIEDLENGTHFLAG, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, exportData(), exportFixedFields(), exportPixels(), exportPreamble(), extractFileOptions(), PRV_GROUP_ITEM::group, l, DCM_ELEMENT::length, LITTLE_ORDER, LST_Head(), LST_Next(), LST_Position(), NATIVE_ORDER, DCM_SEQUENCE_ITEM::object, object, PRV_ELEMENT_ITEM::paddedDataLength, DCM_ELEMENT::representation, setFileOptions(), DCM_ELEMENT::tag, and U32.

Referenced by exportStream().

05186 {
05187     PRIVATE_OBJECT
05188     ** object;
05189     PRV_GROUP_ITEM
05190         * groupItem;
05191     PRV_ELEMENT_ITEM
05192         * elementItem;
05193     DCM_ELEMENT
05194         element;
05195     int
05196         byteOrder;
05197     int
05198         lastFlag = 0;
05199     unsigned char
05200        *src,
05201        *dst;
05202     U32
05203         c,
05204         bytesExported = 0,
05205         rtnLength,
05206         remainingData,
05207         exportLength;
05208     CONDITION
05209         cond;
05210     DCM_SEQUENCE_ITEM
05211         * sequenceItem;
05212     DCM_ELEMENT
05213         itemMarker = {
05214         DCM_DLMITEM, DCM_DLM, "", 1, DCM_UNSPECIFIEDLENGTH, NULL
05215     },
05216         itemDelimiter = {
05217         DCM_DLMITEMDELIMITATIONITEM, DCM_DLM, "", 1, 0, NULL
05218     },
05219         sequenceDelimiter = {
05220         DCM_DLMSEQUENCEDELIMITATIONITEM, DCM_DLM, "", 1, 0, NULL
05221     };
05222     CTNBOOLEAN
05223         unspecifiedSQLength = FALSE,
05224         explicitVR = FALSE,
05225         part10File = FALSE,
05226         encapsulatedPixels = FALSE;
05227     unsigned long fileOptions = 0;
05228 
05229     object = (PRIVATE_OBJECT **) callerObject;
05230     cond = checkObject(object, "exportStream");
05231     if (cond != DCM_NORMAL)
05232         return cond;
05233 
05234     if ((opt & DCM_FILEFORMATMASK) == DCM_PART10FILE) {
05235         part10File = TRUE;
05236         opt &= ~DCM_ORDERMASK;
05237         opt |= DCM_EXPLICITLITTLEENDIAN;
05238         cond = setFileOptions(callerObject, &fileOptions);
05239         if (cond != DCM_NORMAL)
05240             return cond;
05241     }
05242     if ((opt & DCM_ORDERMASK) == 0)
05243         return COND_PushCondition(DCM_ILLEGALOPTION,
05244                                DCM_Message(DCM_ILLEGALOPTION), "Byte order",
05245                                   "exportStream");
05246 
05247     switch (opt & DCM_ORDERMASK) {
05248     case DCM_ORDERNATIVE:
05249         byteOrder = NATIVE_ORDER;
05250         break;
05251     case DCM_ORDERLITTLEENDIAN:
05252         byteOrder = LITTLE_ORDER;
05253         break;
05254     case DCM_EXPLICITLITTLEENDIAN:
05255         byteOrder = LITTLE_ORDER;
05256         explicitVR = TRUE;
05257         break;
05258     case DCM_ORDERBIGENDIAN:
05259         byteOrder = BIG_ORDER;
05260         break;
05261     case DCM_EXPLICITBIGENDIAN:
05262         byteOrder = BIG_ORDER;
05263         explicitVR = TRUE;
05264         break;
05265     case DCM_ENCAPSULATEDPIXELS:
05266         byteOrder = LITTLE_ORDER;
05267         explicitVR = TRUE;
05268         encapsulatedPixels = TRUE;
05269         break;
05270     default:
05271         byteOrder = LITTLE_ORDER;
05272         break;
05273     }
05274 
05275 /*  We are making this step mandatory for now (smm)*/
05276 
05277     opt &= ~DCM_SEQUENCELENGTHMASK;
05278     opt |= DCM_UNSPECIFIEDLENGTHFLAG;
05279 
05280 /*  End of something that is out of place */
05281 
05282     if ((opt & DCM_SEQUENCELENGTHMASK) == DCM_UNSPECIFIEDLENGTHFLAG)
05283         unspecifiedSQLength = TRUE;
05284 
05285     dst = (unsigned char *) buffer;
05286     c = bufferlength;
05287 
05288     if (part10File) {
05289         cond = exportPreamble(object, dst, c, &rtnLength);
05290         if (cond != DCM_NORMAL)
05291             return cond;
05292 
05293         dst += rtnLength;
05294         c -= rtnLength;
05295         bytesExported += rtnLength;
05296     }
05297     if (sequenceLevel != 0) {
05298         if (!unspecifiedSQLength)
05299             itemMarker.length = (*object)->objectSize;
05300         exportFixedFields(&itemMarker, dst, bufferlength, byteOrder,
05301                           explicitVR, &rtnLength);
05302         dst += rtnLength;
05303         c -= rtnLength;
05304         bytesExported += rtnLength;
05305     }
05306     groupItem = (void *)LST_Head(&(*object)->groupList);
05307 
05308 /*  Take this code out to allow empty groups. */
05309 #if 0
05310     if (groupItem == NULL)
05311         return COND_PushCondition(DCM_LISTFAILURE,
05312                               DCM_Message(DCM_LISTFAILURE), "exportStream");
05313 #endif
05314     if (groupItem != NULL)
05315         (void) LST_Position(&(*object)->groupList, (void *)groupItem);
05316 
05317     while (groupItem != NULL) {
05318         if (part10File && groupItem->group != DCM_GROUPFILEMETA) {
05319             if (opt != fileOptions) {
05320                 opt = fileOptions;
05321                 cond = extractFileOptions(opt, &part10File,
05322                                           &explicitVR, &byteOrder,
05323                                           &encapsulatedPixels);
05324                 if (cond != DCM_NORMAL)
05325                     return cond;
05326             }
05327         }
05328         elementItem = (void *)LST_Head(&groupItem->elementList);
05329         if (elementItem != NULL)
05330             (void) LST_Position(&groupItem->elementList, (void *)elementItem);
05331         if (DCM_TAG_ELEMENT(elementItem->element.tag) == 0x0000) {
05332             U32 l;
05333             l = computeGroupLength(groupItem, explicitVR);
05334             *elementItem->element.d.ul = l;
05335 
05336 /* We have some problems computing group length for groups with sequences.
05337 ** For now, just remove this attribute, except for group 0000 and 0002.
05338 */
05339             if (groupItem->group != 0x0000 && groupItem->group != 0x0002)
05340                 elementItem = (void *)LST_Next(&groupItem->elementList);
05341         }
05342         while (elementItem != NULL) {
05343             if (c <= 20) {
05344                 cond = callback(buffer, bytesExported, 0, ctx);
05345                 if (cond != DCM_NORMAL)
05346                     return COND_PushCondition(DCM_CALLBACKABORTED,
05347                           DCM_Message(DCM_CALLBACKABORTED), "exportStream");
05348 
05349                 bytesExported = 0;
05350                 c = bufferlength;
05351                 dst = (unsigned char *) buffer;
05352             }
05353             element = elementItem->element;
05354 
05355             if (element.tag == DCM_PXLPIXELDATA) {
05356                 /* Lots of special rules for pixel data. Handle separately */
05357                 /* First, dump the current buffer */
05358                 cond = callback(buffer, bytesExported, 0, ctx);
05359                 if (cond != DCM_NORMAL)
05360                     return COND_PushCondition(DCM_CALLBACKABORTED,
05361                           DCM_Message(DCM_CALLBACKABORTED), "exportStream");
05362 
05363                 cond = exportPixels(object, elementItem, encapsulatedPixels,
05364                         buffer, bufferlength, callback, ctx, byteOrder, explicitVR);
05365                 if (cond != DCM_NORMAL)
05366                     return cond;
05367 
05368                 bytesExported = 0;
05369                 c = bufferlength;
05370                 dst = (unsigned char *) buffer;
05371                 rtnLength = 0;
05372             } else if (element.representation == DCM_SQ) {
05373                 if (unspecifiedSQLength)
05374                     element.length = DCM_UNSPECIFIEDLENGTH;
05375 
05376                 exportFixedFields(&element, dst, bufferlength, byteOrder,
05377                                   explicitVR, &rtnLength);
05378             } else {
05379                 element.length = elementItem->paddedDataLength;
05380                 exportFixedFields(&element, dst, bufferlength, byteOrder,
05381                                   explicitVR, &rtnLength);
05382             }
05383             dst += rtnLength;
05384             c -= rtnLength;
05385             bytesExported += rtnLength;
05386 
05387             remainingData = element.length;
05388             src = element.d.ot;
05389             elementItem->currentOffset = elementItem->dataOffset;
05390 
05391             if (element.tag == DCM_PXLPIXELDATA) {
05392                 /* Then, we did that above */
05393                 ;
05394             } else if (element.representation == DCM_SQ) {
05395 
05396                 cond = callback(buffer, bytesExported, 0, ctx);
05397                 if (cond != DCM_NORMAL)
05398                     return COND_PushCondition(DCM_CALLBACKABORTED,
05399                           DCM_Message(DCM_CALLBACKABORTED), "exportStream");
05400 
05401                 bytesExported = 0;
05402                 c = bufferlength;
05403                 dst = (unsigned char *) buffer;
05404 
05405                 if (element.d.sq != NULL) {
05406                     sequenceItem = (void *)LST_Head(&element.d.sq);
05407                     if (sequenceItem != NULL)
05408                         (void) LST_Position(&element.d.sq, (void *)sequenceItem);
05409                     while (sequenceItem != NULL) {
05410                         cond = exportStream(&sequenceItem->object, opt,
05411                                         buffer, bufferlength, callback, ctx,
05412                                             sequenceLevel + 1);
05413                         if (cond != DCM_NORMAL)
05414                             return cond;
05415                         sequenceItem = (void *)LST_Next(&element.d.sq);
05416                     }
05417                 }
05418                 if (element.length == DCM_UNSPECIFIEDLENGTH) {
05419                     sequenceDelimiter.length = 0;
05420                     exportFixedFields(&sequenceDelimiter, dst, bufferlength,
05421                                       byteOrder, explicitVR, &rtnLength);
05422                     dst += rtnLength;
05423                     c -= rtnLength;
05424                     bytesExported += rtnLength;
05425                 }
05426             } else {
05427                 while (remainingData > 0) {
05428                     if (debug)
05429                         fprintf(stderr, "Export: (%08x) %d\n",
05430                                 element.tag, element.length);
05431                     if (element.d.ot != NULL)
05432                         remainingData = element.length -
05433                             (src - ((unsigned char *) element.d.ot));
05434                     else
05435                         remainingData = element.length -
05436                             (elementItem->currentOffset - elementItem->dataOffset);
05437 
05438                     exportLength = (remainingData < c) ? remainingData : c;
05439                     cond = exportData(object, elementItem, src, dst,
05440                                       exportLength, byteOrder, &rtnLength);
05441                     if (cond != DCM_NORMAL)
05442                         return cond;
05443 
05444                     src += rtnLength;
05445                     dst += rtnLength;
05446                     bytesExported += rtnLength;
05447                     c -= rtnLength;
05448 
05449                     if (c <= 20) {
05450                         cond = callback(buffer, bytesExported, 0, ctx);
05451                         if (cond != DCM_NORMAL)
05452                             return COND_PushCondition(DCM_CALLBACKABORTED,
05453                                                       DCM_Message(DCM_CALLBACKABORTED), "exportStream");
05454 
05455                         bytesExported = 0;
05456                         c = bufferlength;
05457                         dst = (unsigned char *) buffer;
05458                     }
05459                 }
05460             }
05461             elementItem = (void *)LST_Next(&groupItem->elementList);
05462         }
05463         groupItem = (void *)LST_Next(&(*object)->groupList);
05464     }
05465     if ((sequenceLevel != 0) && unspecifiedSQLength) {
05466         if (c <= 20) {
05467             cond = callback(buffer, bytesExported, 0, ctx);
05468             if (cond != DCM_NORMAL)
05469                 return COND_PushCondition(DCM_CALLBACKABORTED,
05470                           DCM_Message(DCM_CALLBACKABORTED), "exportStream");
05471 
05472             bytesExported = 0;
05473             c = bufferlength;
05474             dst = (unsigned char *) buffer;
05475         }
05476         exportFixedFields(&itemDelimiter, dst, bufferlength, byteOrder,
05477                           explicitVR, &rtnLength);
05478         dst += rtnLength;
05479         c -= rtnLength;
05480         bytesExported += rtnLength;
05481     }
05482     lastFlag = (sequenceLevel == 0) ? 1 : 0;
05483     cond = callback(buffer, bytesExported, lastFlag, ctx);
05484     if (cond != DCM_NORMAL)
05485         return COND_PushCondition(DCM_CALLBACKABORTED,
05486                           DCM_Message(DCM_CALLBACKABORTED), "exportStream");
05487 
05488     return DCM_NORMAL;
05489 }

CONDITION exportStream DCM_OBJECT **    callerObject,
unsigned long    opt,
void *    buffer,
U32    bufferlength,
CONDITION(*    callback)(),
void *    ctx,
int    sequenceLevel
[static]
 

void exportVRLength DCM_ELEMENT   e,
unsigned char *    b,
int    byteOrder,
U32   rtnLength
[static]
 

Definition at line 4196 of file l_mri_dicom_hdr.c.

References BYTEORDER_SAME, c, DCM_MAKETAG, DCM_OB, DCM_OW, DCM_SQ, DCM_UN, DCM_VALUEREPRESENTATION, DIM_OF, i, DCM_ELEMENT::length, p, DCM_ELEMENT::representation, DCM_ELEMENT::tag, U16, and U32.

Referenced by exportFixedFields().

04198 {
04199     int i;
04200     char *c = "xx";
04201     unsigned char *p;
04202     U16 shortLength;
04203     DCM_VALUEREPRESENTATION vr;
04204 
04205     vr = e->representation;
04206     if (e->tag == DCM_MAKETAG(0x003a, 0x1000))
04207         vr = DCM_OB;
04208 
04209     for (i = 0; i < DIM_OF(vrMap); i++) {
04210         if (vr == vrMap[i].representation) {
04211             c = vrMap[i].code;
04212             break;
04213         }
04214     }
04215 
04216     *b++ = *c++;
04217     *b++ = *c++;
04218     *rtnLength += 2;
04219 
04220     if (vr == DCM_OB || vr == DCM_OW || vr == DCM_SQ || vr == DCM_UN) {
04221         *b++ = 0x00;
04222         *b++ = 0x00;
04223         if (byteOrder == BYTEORDER_SAME) {
04224             p = (unsigned char *) &e->length;
04225             *b++ = *p++;
04226             *b++ = *p++;
04227             *b++ = *p++;
04228             *b++ = *p++;
04229         } else {
04230             p = (unsigned char *) &e->length;
04231             *b++ = p[3];
04232             *b++ = p[2];
04233             *b++ = p[1];
04234             *b++ = p[0];
04235         }
04236         *rtnLength += 6;
04237     } else {
04238         shortLength = (U16) e->length;
04239         if (byteOrder == BYTEORDER_SAME) {
04240             p = (unsigned char *) &shortLength;
04241             *b++ = *p++;
04242             *b++ = *p++;
04243         } else {
04244             p = (unsigned char *) &shortLength;
04245             *b++ = p[1];
04246             *b++ = p[0];
04247         }
04248         *rtnLength += 2;
04249     }
04250 }

CONDITION extractFileOptions unsigned long    opt,
CTNBOOLEAN   part10File,
CTNBOOLEAN   explicitVR,
int *    byteOrder,
CTNBOOLEAN   encapsulatedPixels
[static]
 

Definition at line 5087 of file l_mri_dicom_hdr.c.

References BIG_ORDER, COND_PushCondition(), CTNBOOLEAN, DCM_ENCAPSULATEDPIXELS, DCM_EXPLICITBIGENDIAN, DCM_EXPLICITLITTLEENDIAN, DCM_FILEFORMATMASK, DCM_ILLEGALOPTION, DCM_Message(), DCM_NORMAL, DCM_ORDERBIGENDIAN, DCM_ORDERLITTLEENDIAN, DCM_ORDERMASK, DCM_ORDERNATIVE, DCM_PART10FILE, LITTLE_ORDER, and NATIVE_ORDER.

Referenced by exportStream().

05090 {
05091     *part10File = *explicitVR = FALSE;
05092 
05093     if ((opt & DCM_FILEFORMATMASK) == DCM_PART10FILE) {
05094         *part10File = TRUE;
05095         opt &= ~DCM_ORDERMASK;
05096         opt |= DCM_EXPLICITLITTLEENDIAN;
05097     }
05098     if ((opt & DCM_ORDERMASK) == 0)
05099         return COND_PushCondition(DCM_ILLEGALOPTION,
05100                                DCM_Message(DCM_ILLEGALOPTION), "Byte order",
05101                                   "extractFileOptions");
05102 
05103     switch (opt & DCM_ORDERMASK) {
05104     case DCM_ORDERNATIVE:
05105         *byteOrder = NATIVE_ORDER;
05106         *encapsulatedPixels = FALSE;
05107         break;
05108     case DCM_ORDERLITTLEENDIAN:
05109         *byteOrder = LITTLE_ORDER;
05110         *encapsulatedPixels = FALSE;
05111         break;
05112     case DCM_EXPLICITLITTLEENDIAN:
05113         *byteOrder = LITTLE_ORDER;
05114         *explicitVR = TRUE;
05115         *encapsulatedPixels = FALSE;
05116         break;
05117     case DCM_ORDERBIGENDIAN:
05118         *byteOrder = BIG_ORDER;
05119         *encapsulatedPixels = FALSE;
05120         break;
05121     case DCM_EXPLICITBIGENDIAN:
05122         *byteOrder = BIG_ORDER;
05123         *explicitVR = TRUE;
05124         *encapsulatedPixels = FALSE;
05125         break;
05126     case DCM_ENCAPSULATEDPIXELS:
05127         *byteOrder = LITTLE_ORDER;
05128         *explicitVR = TRUE;
05129         *encapsulatedPixels = TRUE;
05130         break;
05131     default:
05132         *byteOrder = LITTLE_ORDER;
05133         *encapsulatedPixels = FALSE;
05134         break;
05135     }
05136 
05137     return DCM_NORMAL;
05138 }

int fileSize int    fd [static]
 

Definition at line 4885 of file l_mri_dicom_hdr.c.

References fd.

Referenced by DCM_OpenFile().

04886 {
04887     int
04888         status;
04889     struct stat
04890         im_stat;
04891 
04892     status = fstat(fd, &im_stat);
04893     if (status < 0) {
04894         return status;
04895     } else
04896         return im_stat.st_size;
04897 }

CONDITION findCreateGroup PRIVATE_OBJECT **    object,
unsigned short    group,
PRV_GROUP_ITEM **    groupPtr
[static]
 

Definition at line 3638 of file l_mri_dicom_hdr.c.

References PRV_GROUP_ITEM::baseLength, COND_PushCondition(), CONDITION, CTN_MALLOC, CTNBOOLEAN, DCM_ELEMENT::d, DCM_ELEMENTCREATEFAILED, DCM_LISTFAILURE, DCM_MAKETAG, DCM_Message(), DCM_NORMAL, DCM_UL, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, PRV_GROUP_ITEM::group, l, DCM_ELEMENT::length, PRV_GROUP_ITEM::longVRAttributes, LST_Create(), LST_Enqueue(), LST_Head(), LST_Insert(), LST_K_AFTER, LST_K_BEFORE, LST_Next(), LST_NORMAL, LST_Position(), newElementItem(), object, DCM_ELEMENT::tag, and U32.

Referenced by DCM_AddElement(), DCM_AddFragment(), DCM_AddSequenceElement(), and insertThisElementItem().

03640 {
03641     PRV_GROUP_ITEM
03642     * item;
03643     CONDITION
03644         cond;
03645     CTNBOOLEAN
03646         tooFar = FALSE;
03647 
03648     item = (void *)LST_Head(&(*object)->groupList);
03649     if (item != NULL)
03650         (void) LST_Position(&(*object)->groupList, (void *)item);
03651 
03652     while (item != NULL && !tooFar) {
03653         if (item->group == group) {
03654             *groupItem = item;
03655             return DCM_NORMAL;
03656         } else if (item->group > group) {
03657             tooFar = TRUE;
03658         } else {
03659             item = (void *)LST_Next(&(*object)->groupList);
03660         }
03661     }
03662 
03663     {
03664         U32 l;
03665         PRV_GROUP_ITEM *newGroupItem;
03666         DCM_ELEMENT groupLength = {0, DCM_UL, "", 1, sizeof(l), NULL};
03667         PRV_ELEMENT_ITEM *groupLengthItem;
03668 
03669         newGroupItem = CTN_MALLOC(sizeof(*newGroupItem));
03670         if (newGroupItem == NULL)
03671             return COND_PushCondition(DCM_ELEMENTCREATEFAILED,
03672                                       DCM_Message(DCM_ELEMENTCREATEFAILED),
03673                                       "findCreateGroup",
03674                                       group, 0xffff, sizeof(*newGroupItem));
03675 
03676 
03677         *groupItem = newGroupItem;
03678         newGroupItem->group = group;
03679         newGroupItem->baseLength = 0;
03680         newGroupItem->longVRAttributes = 0;
03681         newGroupItem->elementList = LST_Create();
03682         if (newGroupItem->elementList == NULL)
03683             return COND_PushCondition(DCM_LISTFAILURE,
03684                                       DCM_Message(DCM_LISTFAILURE),
03685                                       "findCreateGroup");
03686 
03687         if (tooFar)
03688             cond = LST_Insert(&(*object)->groupList, (void *)newGroupItem, LST_K_BEFORE);
03689         else
03690             cond = LST_Enqueue(&(*object)->groupList, (void *)newGroupItem);
03691         if (cond != LST_NORMAL)
03692             return COND_PushCondition(DCM_LISTFAILURE,
03693                                       DCM_Message(DCM_LISTFAILURE),
03694                                       "findCreateGroup");
03695         (void) LST_Position(&(*object)->groupList, (void *)newGroupItem);
03696         if (cond != LST_NORMAL)
03697             return COND_PushCondition(DCM_LISTFAILURE,
03698                                       DCM_Message(DCM_LISTFAILURE),
03699                                       "findCreateGroup");
03700 
03701         groupLength.d.ul = &l;
03702         l = 0;
03703         if ((*object)->groupLengthFlag) {
03704             groupLength.tag = DCM_MAKETAG(group, 0);
03705             cond = newElementItem(&groupLength, TRUE, &groupLengthItem);
03706             (void) memcpy(groupLengthItem->element.d.ot, &l, sizeof(l));
03707 
03708             if (LST_Insert(&newGroupItem->elementList, (void *)groupLengthItem, LST_K_AFTER) !=
03709                 LST_NORMAL)
03710                 return COND_PushCondition(DCM_LISTFAILURE,
03711                                           DCM_Message(DCM_LISTFAILURE),
03712                                           "findCreateGroup");
03713 
03714             (*object)->objectSize += 8 + groupLengthItem->element.length;
03715         }
03716     }
03717     return DCM_NORMAL;
03718 }

CONDITION handleGroupItem PRIVATE_OBJECT **    obj,
PRV_GROUP_ITEM **    groupItem,
unsigned short    group
[static]
 

Definition at line 6889 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), CTN_MALLOC, CTNBOOLEAN, DCM_CloseObject(), DCM_ELEMENTCREATEFAILED, DCM_LISTFAILURE, DCM_Message(), DCM_NORMAL, DCM_OBJECT, LST_Create(), LST_Enqueue(), and LST_NORMAL.

Referenced by readFile1().

06891 {
06892     CTNBOOLEAN createGroupFlag;
06893 
06894     if (*groupItem == NULL)
06895         createGroupFlag = TRUE;
06896     else if ((*groupItem)->group != group)
06897         createGroupFlag = TRUE;
06898     else
06899         createGroupFlag = FALSE;
06900 
06901     if (createGroupFlag == TRUE) {
06902         *groupItem = CTN_MALLOC(sizeof(**groupItem));
06903         if (*groupItem == NULL) {
06904             (void) DCM_CloseObject((DCM_OBJECT **) obj);
06905             return COND_PushCondition(DCM_ELEMENTCREATEFAILED,
06906                                       DCM_Message(DCM_ELEMENTCREATEFAILED),
06907                                       "handleGroupItem",
06908                                       group, 0xffff, sizeof(**groupItem));
06909         }
06910         (*groupItem)->group = group;
06911         (*groupItem)->baseLength = 0;
06912         (*groupItem)->longVRAttributes = 0;
06913         (*groupItem)->elementList = LST_Create();
06914         if ((*groupItem)->elementList == NULL) {
06915             (void) DCM_CloseObject((DCM_OBJECT **) obj);
06916             return COND_PushCondition(DCM_LISTFAILURE,
06917                                       DCM_Message(DCM_LISTFAILURE),
06918                                       "handleGroupItem");
06919         }
06920         if (LST_Enqueue(&(*obj)->groupList, (void *)*groupItem) != LST_NORMAL) {
06921             (void) DCM_CloseObject((DCM_OBJECT **) obj);
06922             return COND_PushCondition(DCM_LISTFAILURE,
06923                                       DCM_Message(DCM_LISTFAILURE),
06924                                       "handleGroupItem");
06925         }
06926     }
06927     return DCM_NORMAL;
06928 }

CONDITION insertNewElement PRIVATE_OBJECT **    object,
DCM_ELEMENT   element
[static]
 

Definition at line 3758 of file l_mri_dicom_hdr.c.

References PRV_GROUP_ITEM::baseLength, PRV_ELEMENT_ITEM::byteOrder, COND_PushCondition(), CONDITION, CTN_FREE, DCM_ELEMENT::d, DCM_AE, DCM_AS, DCM_BADELEMENTINGROUP, DCM_CS, DCM_DA, DCM_DS, DCM_IS, DCM_LISTFAILURE, DCM_LO, DCM_LT, DCM_Message(), DCM_NORMAL, DCM_OB, DCM_ORDERNATIVE, DCM_OW, DCM_PN, DCM_SH, DCM_SQ, DCM_ST, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_TM, DCM_UI, DCM_UNEVENELEMENTLENGTH, DCM_UNSPECIFIEDLENGTH, DCM_UT, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, PRV_GROUP_ITEM::group, DCM_ELEMENT::length, PRV_GROUP_ITEM::longVRAttributes, LST_Current(), LST_Enqueue(), LST_Head(), LST_Insert(), LST_K_BEFORE, LST_Next(), LST_NORMAL, LST_Position(), newElementItem(), object, p, PRV_ELEMENT_ITEM::paddedDataLength, DCM_ELEMENT::representation, DCM_ELEMENT::tag, and updateSpecialElements().

Referenced by DCM_AddElement(), and DCM_AddSequenceElement().

03759 {
03760     PRV_ELEMENT_ITEM
03761     * nextItem,
03762     *newItem;
03763     PRV_GROUP_ITEM
03764         * groupItem;
03765     CONDITION
03766         cond;
03767     char
03768        *p;
03769 
03770     cond = newElementItem(element, TRUE, &newItem);
03771     if (cond != DCM_NORMAL) {
03772         return cond;
03773     }
03774     newItem->byteOrder = DCM_ORDERNATIVE;
03775     if ((newItem->element.length & 1) != 0) {
03776         if (newItem->element.representation == DCM_AE) {
03777             p = newItem->element.d.string;      /* repair, check for 16 */
03778             p[newItem->element.length] = ' ';
03779             newItem->paddedDataLength = element->length + 1;
03780             (void) memcpy(p, element->d.string, element->length);
03781         } else if (newItem->element.representation == DCM_AS) {
03782             p = newItem->element.d.string;
03783             p[newItem->element.length] = ' ';
03784             newItem->paddedDataLength = element->length + 1;
03785             (void) memcpy(p, element->d.string, element->length);
03786         } else if (newItem->element.representation == DCM_CS) {
03787             p = newItem->element.d.string;
03788             p[newItem->element.length] = ' ';
03789             newItem->paddedDataLength = element->length + 1;
03790             (void) memcpy(p, element->d.string, element->length);
03791         } else if (newItem->element.representation == DCM_DA) {
03792             p = newItem->element.d.string;
03793             p[newItem->element.length] = ' ';
03794             newItem->paddedDataLength = element->length + 1;
03795             (void) memcpy(p, element->d.string, element->length);
03796         } else if (newItem->element.representation == DCM_DS) {
03797             p = newItem->element.d.string;
03798             p[newItem->element.length] = ' ';
03799             newItem->paddedDataLength = element->length + 1;
03800             (void) memcpy(p, element->d.string, element->length);
03801         } else if (newItem->element.representation == DCM_IS) {
03802             p = newItem->element.d.string;
03803             p[newItem->element.length] = ' ';
03804             newItem->paddedDataLength = element->length + 1;
03805             (void) memcpy(p, element->d.string, element->length);
03806         } else if (newItem->element.representation == DCM_LT) {
03807             p = newItem->element.d.string;
03808             p[newItem->element.length] = ' ';
03809             newItem->paddedDataLength = element->length + 1;
03810             (void) memcpy(p, element->d.string, element->length);
03811         } else if (newItem->element.representation == DCM_LO) {
03812             p = newItem->element.d.string;
03813             p[newItem->element.length] = ' ';
03814             newItem->paddedDataLength = element->length + 1;
03815             (void) memcpy(p, element->d.string, element->length);
03816         } else if (newItem->element.representation == DCM_PN) {
03817             p = newItem->element.d.string;
03818             p[newItem->element.length] = ' ';
03819             newItem->paddedDataLength = element->length + 1;
03820             (void) memcpy(p, element->d.string, element->length);
03821         } else if (newItem->element.representation == DCM_SH) {
03822             p = newItem->element.d.string;
03823             p[newItem->element.length] = ' ';
03824             newItem->paddedDataLength = element->length + 1;
03825             (void) memcpy(p, element->d.string, element->length);
03826         } else if (newItem->element.representation == DCM_ST) {
03827             p = newItem->element.d.string;
03828             p[newItem->element.length] = ' ';
03829             newItem->paddedDataLength = element->length + 1;
03830             (void) memcpy(p, element->d.string, element->length);
03831         } else if (newItem->element.representation == DCM_TM) {
03832             p = newItem->element.d.string;
03833             p[newItem->element.length] = ' ';
03834             newItem->paddedDataLength = element->length + 1;
03835             (void) memcpy(p, element->d.string, element->length);
03836         } else if (newItem->element.representation == DCM_UI) {
03837             p = newItem->element.d.string;
03838             p[newItem->element.length] = '\0';
03839             newItem->paddedDataLength = element->length + 1;
03840             (void) memcpy(p, element->d.string, element->length);
03841         } else if (newItem->element.representation == DCM_UT) {
03842             p = newItem->element.d.string;
03843             p[newItem->element.length] = ' ';
03844             newItem->paddedDataLength = element->length + 1;
03845             (void) memcpy(p, element->d.string, element->length);
03846         } else if (newItem->element.representation == DCM_SQ) {
03847 /*          newItem->element.length = 0xffffffff; */
03848             newItem->element.d.sq = element->d.sq;
03849         } else {
03850             CTN_FREE(newItem);
03851             return COND_PushCondition(DCM_UNEVENELEMENTLENGTH,
03852                                       DCM_Message(DCM_UNEVENELEMENTLENGTH),
03853                                       DCM_TAG_GROUP(element->tag),
03854                              DCM_TAG_ELEMENT(element->tag), element->length,
03855                                       "insertNewElement");
03856         }
03857     } else if (newItem->element.representation != DCM_SQ) {
03858         (void) memcpy(newItem->element.d.ot, element->d.ot, element->length);
03859     } else {
03860 /*      newItem->element.length = 0xffffffff; */
03861         newItem->element.d.sq = element->d.sq;
03862     }
03863     if ((*object)->objectSize != DCM_UNSPECIFIEDLENGTH)
03864         (*object)->objectSize += 8 + newItem->paddedDataLength;
03865 
03866 /* repair */
03867     cond = updateSpecialElements(object, newItem);
03868     if (cond != DCM_NORMAL)
03869         return cond;
03870 
03871     groupItem = (void *)LST_Current(&(*object)->groupList);
03872     if (groupItem == NULL)
03873         return COND_PushCondition(DCM_LISTFAILURE,
03874                           DCM_Message(DCM_LISTFAILURE), "insertNewElement");
03875 
03876     if (groupItem->baseLength != DCM_UNSPECIFIEDLENGTH)
03877         groupItem->baseLength += 2 + 2 + 4 + newItem->paddedDataLength;
03878 
03879     if (newItem->element.representation == DCM_OW ||
03880         newItem->element.representation == DCM_OB ||
03881         newItem->element.representation == DCM_SQ) {
03882         groupItem->longVRAttributes++;
03883         (*object)->longVRAttributes++;
03884     }
03885     if ((nextItem = (void *)LST_Head(&groupItem->elementList)) == NULL) {
03886         cond = LST_Enqueue(&groupItem->elementList, (void *)newItem);
03887         if (cond != LST_NORMAL)
03888             return COND_PushCondition(DCM_LISTFAILURE,
03889                                       DCM_Message(DCM_LISTFAILURE),
03890                                       "insertNewElement");
03891         else
03892             return DCM_NORMAL;
03893     }
03894     (void) LST_Position(&groupItem->elementList, (void *)nextItem);
03895     if (DCM_TAG_ELEMENT(nextItem->element.tag) == 0x0000)
03896         (void) memcpy(nextItem->element.d.ot, &groupItem->baseLength,
03897                       sizeof(groupItem->baseLength));
03898 
03899 /*  Now, search through the linked list for a place to insert/append
03900 **  this new item.
03901 */
03902 
03903     while (nextItem != NULL) {
03904         if (DCM_TAG_GROUP(element->tag) !=
03905             DCM_TAG_GROUP(nextItem->element.tag)) {
03906             return COND_PushCondition(DCM_BADELEMENTINGROUP,
03907                                       DCM_Message(DCM_BADELEMENTINGROUP),
03908                                       DCM_TAG_GROUP(nextItem->element.tag),
03909                                       DCM_TAG_ELEMENT(nextItem->element.tag),
03910                                       groupItem->group, "insertNewElement");
03911         } else if (DCM_TAG_ELEMENT(element->tag) <
03912                    DCM_TAG_ELEMENT(nextItem->element.tag)) {
03913             cond = LST_Insert(&groupItem->elementList, (void *)newItem, LST_K_BEFORE);
03914             if (cond != LST_NORMAL)
03915                 return COND_PushCondition(DCM_LISTFAILURE,
03916                                           DCM_Message(DCM_LISTFAILURE),
03917                                           "insertNewElement");
03918             else
03919                 return DCM_NORMAL;
03920         }
03921         nextItem = (void *)LST_Next(&groupItem->elementList);
03922     }
03923 
03924 /*  If we fall out of the loop, we must have reached the end of
03925 **  the group.  Add the element to the end of the list of elements
03926 **  in this group.
03927 */
03928 
03929     cond = LST_Enqueue(&groupItem->elementList, (void *)newItem);
03930     if (cond != LST_NORMAL)
03931         return COND_PushCondition(DCM_LISTFAILURE,
03932                                   DCM_Message(DCM_LISTFAILURE),
03933                                   "insertNewElement");
03934     else
03935         return DCM_NORMAL;
03936 }

CONDITION insertThisElementItem PRIVATE_OBJECT **    object,
PRV_ELEMENT_ITEM   newItem
[static]
 

Definition at line 3939 of file l_mri_dicom_hdr.c.

References PRV_GROUP_ITEM::baseLength, COND_PushCondition(), CONDITION, DCM_ELEMENT::d, DCM_BADELEMENTINGROUP, DCM_LISTFAILURE, DCM_Message(), DCM_NORMAL, DCM_OB, DCM_OW, DCM_SQ, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_UNSPECIFIEDLENGTH, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, findCreateGroup(), PRV_GROUP_ITEM::group, PRV_GROUP_ITEM::longVRAttributes, LST_Enqueue(), LST_Head(), LST_Insert(), LST_K_BEFORE, LST_Next(), LST_NORMAL, LST_Position(), object, PRV_ELEMENT_ITEM::paddedDataLength, DCM_ELEMENT::representation, DCM_ELEMENT::tag, and updateSpecialElements().

Referenced by DCM_AddFragment().

03940 {
03941   PRV_ELEMENT_ITEM * nextItem;
03942   PRV_GROUP_ITEM * groupItem = 0;
03943   CONDITION cond;
03944 
03945 /* repair */
03946   cond = updateSpecialElements(object, newItem);
03947   if (cond != DCM_NORMAL)
03948     return cond;
03949 
03950   cond = findCreateGroup(object, DCM_TAG_GROUP(newItem->element.tag),
03951         &groupItem);
03952 
03953   if (groupItem == NULL)
03954     return COND_PushCondition(DCM_LISTFAILURE,
03955                           DCM_Message(DCM_LISTFAILURE), "insertThisElementItem");
03956 
03957   if (groupItem->baseLength != DCM_UNSPECIFIEDLENGTH)
03958     groupItem->baseLength += 2 + 2 + 4 + newItem->paddedDataLength;
03959 
03960   if (newItem->element.representation == DCM_OW ||
03961         newItem->element.representation == DCM_OB ||
03962         newItem->element.representation == DCM_SQ) {
03963         groupItem->longVRAttributes++;
03964         (*object)->longVRAttributes++;
03965   }
03966 
03967   if ((nextItem = (void *)LST_Head(&groupItem->elementList)) == NULL) {
03968     cond = LST_Enqueue(&groupItem->elementList, (void *)newItem);
03969     if (cond != LST_NORMAL)
03970       return COND_PushCondition(DCM_LISTFAILURE,
03971                                       DCM_Message(DCM_LISTFAILURE),
03972                                       "insertThisElementItem");
03973     else
03974       return DCM_NORMAL;
03975   }
03976 
03977   (void) LST_Position(&groupItem->elementList, (void *)nextItem);
03978   if (DCM_TAG_ELEMENT(nextItem->element.tag) == 0x0000)
03979     (void) memcpy(nextItem->element.d.ot, &groupItem->baseLength,
03980                       sizeof(groupItem->baseLength));
03981 
03982 /*  Now, search through the linked list for a place to insert/append
03983 **  this new item.
03984 */
03985 
03986   while (nextItem != NULL) {
03987     if (DCM_TAG_GROUP(newItem->element.tag) !=
03988             DCM_TAG_GROUP(nextItem->element.tag)) {
03989       return COND_PushCondition(DCM_BADELEMENTINGROUP,
03990                                       DCM_Message(DCM_BADELEMENTINGROUP),
03991                                       DCM_TAG_GROUP(nextItem->element.tag),
03992                                       DCM_TAG_ELEMENT(nextItem->element.tag),
03993                                       groupItem->group, "insertThisElementItem");
03994     } else if (DCM_TAG_ELEMENT(newItem->element.tag) <
03995                    DCM_TAG_ELEMENT(nextItem->element.tag)) {
03996       cond = LST_Insert(&groupItem->elementList, (void *)newItem, LST_K_BEFORE);
03997       if (cond != LST_NORMAL)
03998         return COND_PushCondition(DCM_LISTFAILURE,
03999                                           DCM_Message(DCM_LISTFAILURE),
04000                                           "insertThisElementItem");
04001       else
04002         return DCM_NORMAL;
04003       }
04004       nextItem = (void *)LST_Next(&groupItem->elementList);
04005   }
04006 
04007 /*  If we fall out of the loop, we must have reached the end of
04008 **  the group.  Add the element to the end of the list of elements
04009 **  in this group.
04010 */
04011 
04012   cond = LST_Enqueue(&groupItem->elementList, (void *)newItem);
04013   if (cond != LST_NORMAL)
04014     return COND_PushCondition(DCM_LISTFAILURE,
04015                                   DCM_Message(DCM_LISTFAILURE),
04016                                   "insertThisElementItem");
04017   else
04018     return DCM_NORMAL;
04019 }

PRV_ELEMENT_ITEM * locateElement PRIVATE_OBJECT **    obj,
DCM_TAG    tag
[static]
 

Definition at line 7231 of file l_mri_dicom_hdr.c.

References CTNBOOLEAN, DCM_TAG, DCM_TAG_GROUP, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, PRV_GROUP_ITEM::group, LST_Head(), LST_Next(), LST_Position(), and DCM_ELEMENT::tag.

Referenced by DCM_AddFragment(), DCM_GetCompressedValue(), DCM_GetElement(), DCM_GetElementValueOffset(), DCM_GetSequenceByOffset(), DCM_GetSequenceElement(), and DCM_PrintSequenceList().

07232 {
07233     PRV_GROUP_ITEM
07234     * groupItem;
07235     PRV_ELEMENT_ITEM
07236         * elementItem;
07237     CTNBOOLEAN
07238         found = FALSE;
07239 
07240     groupItem = (void *)LST_Head(&(*obj)->groupList);
07241     if (groupItem == NULL)
07242         return NULL;
07243 
07244     (void) LST_Position(&(*obj)->groupList, (void *)groupItem);
07245     while (groupItem != NULL) {
07246         if (groupItem->group == DCM_TAG_GROUP(tag))
07247             break;
07248 
07249         groupItem = (void *)LST_Next(&(*obj)->groupList);
07250     }
07251     if (groupItem == NULL)
07252         return NULL;
07253 
07254     elementItem = (void *)LST_Head(&groupItem->elementList);
07255     if (elementItem == NULL)
07256         return NULL;
07257 
07258     (void) LST_Position(&groupItem->elementList, (void *)elementItem);
07259     while (!found && (elementItem != NULL)) {
07260         if (elementItem->element.tag == tag) {
07261             found = TRUE;
07262         } else
07263             elementItem = (void *)LST_Next(&groupItem->elementList);
07264     }
07265     if (found)
07266         return elementItem;
07267     else
07268         return NULL;
07269 }

VRMAP* lookupVRCode const char *    code [static]
 

Definition at line 4167 of file l_mri_dicom_hdr.c.

References DIM_OF, and i.

Referenced by readVRLength().

04168 {
04169     int i;
04170 
04171     for (i = 0; i < (int) DIM_OF(vrMap); i++) {
04172         if (strcmp(code, vrMap[i].code) == 0)
04173             return &vrMap[i];
04174     }
04175 
04176     return NULL;
04177 }

unsigned long LST_Count LST_HEAD **    list
 

Definition at line 10870 of file l_mri_dicom_hdr.c.

10875 {
10876     return (*list)->count;
10877 }

LST_HEAD* LST_Create void   
 

Definition at line 10728 of file l_mri_dicom_hdr.c.

References lst_head::count, CTN_MALLOC, lst_head::current, lst_head::head, and lst_head::tail.

10733 {
10734     LST_HEAD
10735     * ptr;
10736 
10737     ptr = CTN_MALLOC(sizeof(LST_HEAD));
10738     if (ptr == NULL)
10739         return NULL;
10740 
10741     ptr->head = NULL;
10742     ptr->tail = NULL;
10743     ptr->current = NULL;
10744     ptr->count = 0;
10745     return ptr;
10746 }

LST_NODE* LST_Current LST_HEAD **    list
 

Definition at line 10894 of file l_mri_dicom_hdr.c.

Referenced by insertNewElement().

10900 {
10901     return (*list)->current;
10902 }

LST_NODE* LST_Dequeue LST_HEAD **    list
 

Definition at line 10812 of file l_mri_dicom_hdr.c.

References lst_node::next, and lst_node::previous.

Referenced by LST_Sort().

10818 {
10819     LST_NODE
10820     * ptr;
10821 
10822     if ((*list)->head == NULL) {/* list is empty             */
10823         (*list)->count = 0;
10824         return NULL;
10825     }
10826     ptr = (*list)->head;        /* save the head             */
10827     (*list)->head = ptr->next;  /* set new head of list      */
10828     if ((*list)->head == NULL)  /* if the list is now empty  */
10829         (*list)->tail = NULL;   /* there is no tail anymore  */
10830     else
10831         (*list)->head->previous = NULL; /* new head has no previous  */
10832     ptr->next = NULL;           /* hide data from user       */
10833     (*list)->count--;           /* list has one fewer node   */
10834     /* now                       */
10835     return ptr;
10836 }

CONDITION LST_Destroy LST_HEAD **    list
 

Definition at line 10751 of file l_mri_dicom_hdr.c.

References CTN_FREE, LST_LISTNOTEMPTY, and LST_NORMAL.

Referenced by DCM_CloseObject(), and DCM_RemoveGroup().

10757 {
10758 
10759     if ((*list)->count != 0)
10760         return LST_LISTNOTEMPTY;
10761 
10762     CTN_FREE(*list);
10763     *list = NULL;
10764     return LST_NORMAL;
10765 }

CONDITION LST_Enqueue LST_HEAD **    list,
LST_NODE   node
 

Definition at line 10770 of file l_mri_dicom_hdr.c.

References LST_NORMAL, lst_node::next, and lst_node::previous.

Referenced by copySequence(), DCM_AddFragment(), DCM_GetElementValueList(), findCreateGroup(), handleGroupItem(), insertNewElement(), insertThisElementItem(), LST_Sort(), readFile(), readFile1(), and readSequence().

10776 {
10777     node->next = NULL;          /* no next node              */
10778     node->previous = (*list)->tail;     /* previous is old tail      */
10779     if ((*list)->head == NULL)  /* if list was empty...      */
10780         (*list)->head = node;   /* it has a head now!        */
10781     else
10782         (*list)->tail->next = node;     /* old tail now has a next   */
10783 
10784     (*list)->tail = node;       /* list now has a new tail    */
10785     (*list)->count++;           /* bump the counter           */
10786     return LST_NORMAL;
10787 }

LST_NODE* LST_Head LST_HEAD **    list
 

Definition at line 10882 of file l_mri_dicom_hdr.c.

Referenced by compareGroup(), copySequence(), DCM_CompareAttributes(), DCM_CopyObject(), DCM_DumpElements(), DCM_FormatElements(), DCM_GetElementSize(), DCM_GetElementValue(), DCM_GetElementValueList(), DCM_GetFirstElement(), DCM_GetNextElement(), DCM_GetSequenceByOffset(), DCM_GetSequenceElement(), DCM_GetSequenceList(), DCM_GroupPresent(), DCM_ListToString(), DCM_MergeObject(), DCM_PrintSequenceList(), DCM_RemoveElement(), DCM_RemoveGroup(), DCM_ScanParseObject(), exportEncapsulatedPixels(), exportStream(), findCreateGroup(), insertNewElement(), insertThisElementItem(), locateElement(), LST_Index(), LST_Sort(), readFile(), and readFile1().

10888 {
10889     return (*list)->head;
10890 }

LST_NODE* LST_Index LST_HEAD **    l,
int    index
 

Definition at line 11187 of file l_mri_dicom_hdr.c.

References l, LST_Head(), LST_Next(), and LST_Position().

11188 {
11189     LST_NODE
11190     * n;
11191 
11192     n = LST_Head(l);
11193     if (n == NULL)
11194         return NULL;
11195 
11196     index--;
11197     LST_Position(l, n);
11198     while (index-- > 0 && n != NULL)
11199         n = LST_Next(l);
11200 
11201     return n;
11202 }

CONDITION LST_Insert LST_HEAD **    list,
LST_NODE   node,
LST_END    where
 

Definition at line 10919 of file l_mri_dicom_hdr.c.

References CURRENT, LST_BADEND, LST_END, LST_K_AFTER, LST_K_BEFORE, LST_NOCURRENT, LST_NORMAL, lst_node::next, OLD_NEXT, OLD_PREV, and lst_node::previous.

Referenced by findCreateGroup(), insertNewElement(), insertThisElementItem(), and LST_Sort().

10927 {
10928     if ((where != LST_K_BEFORE) && (where != LST_K_AFTER))
10929         goto badend;
10930 
10931     if ((*list)->head == NULL) {/* if the list was empty     */
10932         (*list)->tail = node;   /* set the tail pointer      */
10933         (*list)->head = node;   /* set the head pointer      */
10934         (*list)->count = 0;     /* will get bumped later...  */
10935         (node)->next = NULL;    /* there is no next          */
10936         (node)->previous = NULL;/* and no previous           */
10937 
10938     } else if (CURRENT == NULL) /* is he mixing semantics?       */
10939         goto nocurrent;
10940 
10941     else if ((CURRENT == (*list)->head) &&      /* if at the head           */
10942              (where == LST_K_BEFORE)) { /* and inserting BEFORE   */
10943         node->next = CURRENT;   /* splice new node in       */
10944         CURRENT->previous = node;       /* before the current     */
10945         node->previous = NULL;  /* new one has no previous  */
10946         (*list)->head = node;   /* new one is first now     */
10947 
10948     } else if ((CURRENT == (*list)->tail) &&    /* if at the tail           */
10949                (where == LST_K_AFTER)) {        /* and inserting AFTER    */
10950         node->next = NULL;      /* new node has no next     */
10951         node->previous = (*list)->tail; /* previous is old tail     */
10952         CURRENT->next = node;   /* splice new node in       */
10953         (*list)->tail = node;   /* new node is now the tail */
10954 
10955     } else if (where == LST_K_AFTER) {  /* not a special case       */
10956         OLD_NEXT->previous = node;      /* we preceed a node        */
10957         node->next = OLD_NEXT;  /* the old next follows us  */
10958         node->previous = CURRENT;       /* the current preceeds us  */
10959         CURRENT->next = node;   /* we follow current        */
10960 
10961     } else {                    /* not a special case       */
10962         OLD_PREV->next = node;  /* we follow the previous   */
10963         node->previous = OLD_PREV;      /* of current            */
10964         node->next = CURRENT;   /* current follows us and   */
10965         CURRENT->previous = node;       /* we preceed current     */
10966     };
10967 
10968     (*list)->count++;           /* bump the counter          */
10969     (*list)->current = node;    /* and set current        */
10970     return LST_NORMAL;
10971 
10972 badend:
10973     return LST_BADEND;
10974 
10975 nocurrent:
10976     return LST_NOCURRENT;
10977 }

LST_NODE* LST_Next LST_HEAD **    list
 

Definition at line 11054 of file l_mri_dicom_hdr.c.

References CURRENT.

Referenced by compareGroup(), copySequence(), DCM_CompareAttributes(), DCM_CopyObject(), DCM_DumpElements(), DCM_FormatElements(), DCM_GetElementSize(), DCM_GetElementValue(), DCM_GetElementValueList(), DCM_GetNextElement(), DCM_GetSequenceByOffset(), DCM_GetSequenceList(), DCM_GroupPresent(), DCM_ListToString(), DCM_MergeObject(), DCM_PrintSequenceList(), DCM_RemoveElement(), DCM_RemoveGroup(), DCM_ScanParseObject(), exportEncapsulatedPixels(), exportStream(), findCreateGroup(), insertNewElement(), insertThisElementItem(), locateElement(), LST_Index(), LST_Sort(), readFile(), and readFile1().

11060 {
11061     if ((*list)->head == NULL) {/* list is empty            */
11062         (*list)->count = 0;
11063         return NULL;
11064     }
11065     if (CURRENT == NULL) {      /* there is no CURRENT      */
11066         return NULL;
11067     }
11068     CURRENT = CURRENT->next;    /* Set current to next and return it */
11069     return CURRENT;
11070 }

LST_NODE* LST_Pop LST_HEAD **    list
 

Definition at line 10841 of file l_mri_dicom_hdr.c.

References lst_node::next, and lst_node::previous.

Referenced by DCM_CloseObject(), and DCM_RemoveGroup().

10847 {
10848     LST_NODE
10849     * ptr;
10850 
10851     if ((*list)->head == NULL) {/* list is empty             */
10852         (*list)->count = 0;
10853         return NULL;
10854     }
10855     ptr = (*list)->head;        /* save the head             */
10856     (*list)->head = ptr->next;  /* set new head of list      */
10857     if ((*list)->head == NULL)  /* if the list is now empty  */
10858         (*list)->tail = NULL;   /* there is no tail anymore  */
10859     else
10860         (*list)->head->previous = NULL; /* new head has no previous  */
10861     ptr->next = NULL;           /* hide data from user       */
10862     (*list)->count--;           /* list has one fewer node   */
10863     /* now                       */
10864     return ptr;
10865 }

LST_NODE* LST_Position LST_HEAD **    list,
LST_NODE   node
 

Definition at line 11099 of file l_mri_dicom_hdr.c.

References CURRENT, lst_node::next, and lst_node::previous.

Referenced by compareGroup(), copySequence(), DCM_CompareAttributes(), DCM_CopyObject(), DCM_DumpElements(), DCM_FormatElements(), DCM_GetElementSize(), DCM_GetElementValue(), DCM_GetElementValueList(), DCM_GetFirstElement(), DCM_GetNextElement(), DCM_GetSequenceByOffset(), DCM_GetSequenceList(), DCM_GroupPresent(), DCM_ListToString(), DCM_MergeObject(), DCM_PrintSequenceList(), DCM_RemoveElement(), DCM_RemoveGroup(), DCM_ScanParseObject(), exportEncapsulatedPixels(), exportStream(), findCreateGroup(), insertNewElement(), insertThisElementItem(), locateElement(), LST_Index(), LST_Sort(), readFile(), and readFile1().

11104          :  node = lst_position(list, lst_head(list));
11105  *          makes the node at the head of the list current
11106  *          and returns a pointer to it.
11107  *
11108  *      The routine tries to verify that "node" is in the list
11109  *      by doing a few consistency checks.  It assumes that if
11110  *      any of three "known" pointers are what they should be
11111  *      that all is well.  Its not damnfoolproof, but...
11112  */
11113 {
11114     if ((*list)->head == NULL) {/* list is empty     */
11115         return NULL;
11116     }
11117     if (node == NULL)
11118         return NULL;
11119     if (((node->previous == NULL) && ((*list)->head == node)) ||
11120         ((node->next == NULL) && ((*list)->tail == node)) ||
11121         (node->previous->next == node)) {       /* its probably OK       */
11122 
11123         CURRENT = node;
11124         return CURRENT;
11125     };
11126 
11127     return NULL;
11128 }

LST_NODE* LST_Previous LST_HEAD **    list
 

Definition at line 11075 of file l_mri_dicom_hdr.c.

References CURRENT.

11081 {
11082     if ((*list)->head == NULL) {/* list is empty     */
11083         (*list)->count = 0;
11084         return NULL;
11085     }
11086     if (CURRENT == NULL) {      /* there is no CURRENT       */
11087         return NULL;
11088     }
11089     if (CURRENT->previous == NULL) {    /* no PREVIOUS               */
11090         return NULL;
11091     }
11092     CURRENT = CURRENT->previous;/* found it                  */
11093     return CURRENT;
11094 }

CONDITION LST_Push LST_HEAD **    list,
LST_NODE   node
 

Definition at line 10790 of file l_mri_dicom_hdr.c.

References LST_NORMAL, lst_node::next, and lst_node::previous.

10797 {
10798     node->next = (*list)->head; /* set the forward link      */
10799     node->previous = NULL;      /* set rearward link         */
10800     if ((*list)->tail == NULL)  /* if the list was empty     */
10801         (*list)->tail = node;   /* set the tail pointer      */
10802     else                        /* otherwise,                */
10803         (*list)->head->previous = node; /* old head now has a previous                  */
10804 
10805     (*list)->head = node;       /* set new first node        */
10806     (*list)->count++;           /* bump the counter          */
10807     return LST_NORMAL;
10808 
10809 }

LST_NODE* LST_Remove LST_HEAD **    list,
LST_END    dir
 

Definition at line 10982 of file l_mri_dicom_hdr.c.

References CURRENT, LST_END, LST_K_AFTER, LST_K_BEFORE, lst_node::next, OLD_NEXT, OLD_PREV, and lst_node::previous.

Referenced by DCM_RemoveElement(), and DCM_RemoveGroup().

10992 {
10993     LST_NODE
10994     * ptr;
10995 
10996     if ((dir != LST_K_BEFORE) && (dir != LST_K_AFTER))
10997         goto baddir;
10998     if (CURRENT == NULL)
10999         goto nocurrent;
11000     if ((*list)->head == NULL)
11001         goto listempty;
11002 
11003     ptr = CURRENT;              /* save node                 */
11004 
11005     if (CURRENT == (*list)->head) {     /* removing the head         */
11006         (*list)->head = OLD_NEXT;       /* set new head of list      */
11007         if ((*list)->head == NULL)      /* if the list is now empty  */
11008             (*list)->tail = NULL;       /* no tail anymore either    */
11009         else
11010             (*list)->head->previous = NULL;     /* new head has no previous  */
11011         if (dir == LST_K_BEFORE)/* there is nothing before   */
11012             (*list)->current = NULL;    /* the head of the list      */
11013         else                    /* otherwise, remain         */
11014             (*list)->current = (*list)->head;   /* at the head...         */
11015 
11016     } else if (CURRENT == (*list)->tail) {      /* removing the tail         */
11017         (*list)->tail = OLD_PREV;       /* set new tail of list      */
11018         (*list)->tail->next = NULL;     /* new tail has no next      */
11019         if (dir == LST_K_AFTER) /* there is nothing after    */
11020             (*list)->current = NULL;    /* the tail of a list        */
11021         else                    /* otherwise, remain         */
11022             (*list)->current = (*list)->tail;   /* at the tail...            */
11023 
11024     } else {                    /* not a special case        */
11025         OLD_PREV->next = CURRENT->next; /* set forward pointer       */
11026         OLD_NEXT->previous = CURRENT->previous; /* set backward pointer      */
11027         if (dir == LST_K_BEFORE)/* depending on direction,   */
11028             (*list)->current = CURRENT->previous;       /* set current             */
11029         else                    /* in the                    */
11030             (*list)->current = CURRENT->next;   /* list head                 */
11031     }
11032 
11033     (*list)->count--;           /* one fewer nodes now       */
11034     ptr->previous = NULL;       /* hide data from user       */
11035     ptr->next = NULL;           /* hide data from user       */
11036     return ptr;
11037 
11038 baddir:
11039     return NULL;
11040 
11041 nocurrent:
11042     return NULL;
11043 
11044 listempty:
11045     (*list)->count = 0;
11046     (*list)->current = NULL;
11047     (*list)->head = (*list)->tail = NULL;
11048     return NULL;
11049 }

CONDITION LST_Sort LST_HEAD **    list,
size_t    nodeSize,
int(*    compare)()
 

Definition at line 11136 of file l_mri_dicom_hdr.c.

References AFNI_CALL_VALU_2ARG, compare(), lst_head::count, CTNBOOLEAN, lst_head::current, lst_head::head, LST_Dequeue(), LST_Enqueue(), LST_Head(), LST_Insert(), LST_K_BEFORE, LST_Next(), LST_NORMAL, LST_Position(), n1, n2, and lst_head::tail.

11137 {
11138     LST_NODE
11139         * n1,
11140         *n2;
11141     LST_HEAD
11142         temp,
11143         *head;
11144     CTNBOOLEAN
11145         inserted;
11146     int ccc ;
11147 
11148     if ((*list)->head == NULL) {/* list is empty     */
11149         return LST_NORMAL;
11150     }
11151     head = &temp;
11152     head->head = NULL;
11153     head->tail = NULL;
11154     head->current = NULL;
11155     head->count = 0;
11156 
11157     while ((n1 = LST_Dequeue(list)) != NULL) {
11158         n2 = LST_Head(&head);
11159         if (n2 != NULL)
11160             (void) LST_Position(&head, n2);
11161         inserted = FALSE;
11162         while (n2 != NULL && !inserted) {
11163 #if 0
11164             if (compare(n1, n2) < 0) {
11165 #else
11166             AFNI_CALL_VALU_2ARG(compare,int,ccc,LST_NODE *,n1,LST_NODE *,n2) ;
11167             if( ccc < 0 ){
11168 #endif
11169                 (void) LST_Insert(&head, n1, LST_K_BEFORE);
11170                 inserted = TRUE;
11171             } else
11172                 n2 = LST_Next(&head);
11173         }
11174         if (n2 == NULL)
11175             (void) LST_Enqueue(&head, n1);
11176     }
11177     **list = *head;
11178     return LST_NORMAL;
11179 }

LST_NODE* LST_Tail LST_HEAD **    list
 

Definition at line 10907 of file l_mri_dicom_hdr.c.

10913 {
10914     return (*list)->tail;
10915 }

void mapVRtoASCII DCM_VALUEREPRESENTATION    vr,
char *    s
[static]
 

Definition at line 4180 of file l_mri_dicom_hdr.c.

References DCM_VALUEREPRESENTATION, DIM_OF, and i.

Referenced by readVRLength().

04181 {
04182     int i;
04183 
04184     for (i = 0; i < (int) DIM_OF(vrMap); i++) {
04185         if (vr == vrMap[i].representation) {
04186             strcpy(s, vrMap[i].code);
04187             return;
04188         }
04189     }
04190 
04191     strcpy(s, "");
04192     return;
04193 }

char* mri_dicom_header char *    fname
 

Definition at line 204 of file l_mri_dicom_hdr.c.

References close(), COND_PopCondition(), CONDITION, CTNBOOLEAN, DCM_CloseObject(), DCM_Debug(), DCM_DumpElements(), DCM_FormatElements(), DCM_NORMAL, DCM_OBJECT, DCM_OpenFile(), DCM_ORDERLITTLEENDIAN, DCM_PART10FILE, ENTRY, getenv(), object, p, pbuf, pxl_len, pxl_off, RETURN, RWC_clear_pbuf(), rwc_fd, RWC_printf(), RWC_set_endianosity(), rwc_vm, and STATUS.

Referenced by main(), mri_imcount_dicom(), mri_read_dicom(), and r_mri_read_dicom().

00205 {
00206     DCM_OBJECT * object;
00207     CONDITION cond;
00208     CTNBOOLEAN verbose = FALSE ,
00209                exitFlag = FALSE,
00210                formatFlag = FALSE;
00211     unsigned long
00212         options = DCM_ORDERLITTLEENDIAN;
00213     long vmLimit = rwc_vm ;             /* 28 Oct 2002 */
00214     LST_HEAD* fileNames = 0;
00215     UTL_FILEITEM* p = NULL;
00216 
00217     char *ppp=NULL ;
00218 
00219 ENTRY("mri_dicom_header") ;
00220 
00221     if( fname == NULL ) RETURN(NULL) ;
00222 
00223     RWC_set_endianosity() ;
00224 
00225     { char *eee = getenv("AFNI_TRACE") ;
00226       if( eee!=NULL && (*eee=='y' || *eee=='Y') ) verbose = TRUE ;
00227     }
00228 
00229     DCM_Debug(verbose);
00230 
00231     RWC_clear_pbuf() ; pxl_len = 0 ; pxl_off = 0 ;
00232 
00233 STATUS(fname) ;
00234     rwc_fd = -1 ;
00235     cond = DCM_OpenFile(fname, options, &object);
00236     if (cond != DCM_NORMAL && ((options & DCM_PART10FILE) == 0)) {
00237 STATUS("DCM_OpenFile open failed; try again as Part 10") ;
00238       (void) DCM_CloseObject(&object);
00239       (void) COND_PopCondition(TRUE);
00240       if( rwc_fd >= 0 ){ close(rwc_fd); rwc_fd = -1; }
00241       cond = DCM_OpenFile(fname, options | DCM_PART10FILE, &object);
00242     }
00243     if (cond == DCM_NORMAL) {
00244 STATUS("DCM_OpenFile is good") ;
00245        RWC_printf("DICOM File: %s\n", fname);
00246        if (formatFlag)
00247          cond = DCM_FormatElements(&object, vmLimit, "");
00248        else
00249          cond = DCM_DumpElements(&object, vmLimit);
00250     } else {
00251 STATUS("DCM_OpenFile failed") ;
00252     }
00253     (void) DCM_CloseObject(&object);
00254     (void) COND_PopCondition(TRUE);
00255 
00256     if( pbuf != NULL ){
00257       ppp = strdup(pbuf) ; RWC_clear_pbuf() ;
00258     }
00259 
00260     if( rwc_fd >= 0 ){ close(rwc_fd); rwc_fd = -1; }
00261 
00262     RETURN(ppp);
00263 }

void mri_dicom_nohex int    ii
 

Definition at line 174 of file l_mri_dicom_hdr.c.

References RWC_NOHEX_MASK, and rwc_opt.

Referenced by main(), mri_imcount_dicom(), mri_read_dicom(), and r_mri_read_dicom().

00175 {
00176    if( ii )
00177      rwc_opt |= RWC_NOHEX_MASK ;
00178    else if( rwc_opt & RWC_NOHEX_MASK )
00179      rwc_opt ^= RWC_NOHEX_MASK ;
00180 }

void mri_dicom_noname int    ii
 

Definition at line 166 of file l_mri_dicom_hdr.c.

References RWC_NONAME_MASK, and rwc_opt.

Referenced by main(), mri_imcount_dicom(), mri_read_dicom(), and r_mri_read_dicom().

00167 {
00168    if( ii )
00169      rwc_opt |= RWC_NONAME_MASK ;
00170    else if( rwc_opt & RWC_NONAME_MASK )
00171      rwc_opt ^= RWC_NONAME_MASK ;
00172 }

void mri_dicom_pxlarr off_t *    poff,
unsigned int *    plen
 

Definition at line 154 of file l_mri_dicom_hdr.c.

References pxl_len, and pxl_off.

Referenced by main(), mri_imcount_dicom(), mri_read_dicom(), and r_mri_read_dicom().

00155 {
00156    *poff = pxl_off ; *plen = pxl_len ;
00157 }

void mri_dicom_seterr int    vv
 

Definition at line 195 of file l_mri_dicom_hdr.c.

References rwc_err.

Referenced by main(), and mri_imcount().

00196 {
00197   rwc_err = vv ;   /* 07 May 2003: an error will subtract 1 from rwc_err */
00198 }

void mri_dicom_setvm int    vv
 

Definition at line 186 of file l_mri_dicom_hdr.c.

References rwc_vm.

Referenced by main().

00187 {
00188   rwc_vm = vv ;
00189 }

CONDITION newElementItem DCM_ELEMENT   src,
CTNBOOLEAN    allocateData,
PRV_ELEMENT_ITEM **    dst
[static]
 

Definition at line 3548 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), CTN_MALLOC, CTNBOOLEAN, DCM_ELEMENTCREATEFAILED, DCM_Message(), DCM_NORMAL, DCM_SQ, DCM_TAG_ELEMENT, DCM_TAG_GROUP, l, DCM_ELEMENT::length, NATIVE_ORDER, DCM_ELEMENT::representation, DCM_ELEMENT::tag, and U32.

Referenced by DCM_AddFragment(), findCreateGroup(), insertNewElement(), readData(), readFile(), and readSequence().

03550 {
03551     U32
03552     l;
03553 
03554     if (allocateData && (src->representation != DCM_SQ)) {
03555         l = src->length;
03556         if (l & 1)
03557             l++;
03558     } else
03559         l = 0;
03560 
03561     if (debug)
03562         fprintf(stderr, "newElementItem: CTN_MALLOC %8d %8d ", l,
03563                 (int)(sizeof(PRV_ELEMENT_ITEM) + l));
03564 
03565     *dst = (PRV_ELEMENT_ITEM *) CTN_MALLOC(sizeof(PRV_ELEMENT_ITEM) + l);
03566     if (debug)
03567         fprintf(stderr, "%8p\n", *dst);
03568 
03569     if (*dst == NULL) {
03570         return COND_PushCondition(DCM_ELEMENTCREATEFAILED,
03571                      DCM_Message(DCM_ELEMENTCREATEFAILED), "newElementItem",
03572                                   DCM_TAG_GROUP(src->tag),
03573                                   DCM_TAG_ELEMENT(src->tag),
03574                                   l);
03575     }
03576     memset(*dst, 0, sizeof(PRV_ELEMENT_ITEM));
03577     (*dst)->element = *src;
03578     (*dst)->byteOrder = NATIVE_ORDER;
03579     (*dst)->allocatedDataLength = (size_t) l;
03580     (*dst)->originalDataLength = src->length;
03581     (*dst)->paddedDataLength = src->length;
03582     if (allocateData)
03583         (*dst)->element.d.ot = ((char *) (*dst)) + sizeof(PRV_ELEMENT_ITEM);
03584     else
03585         (*dst)->element.d.ot = NULL;
03586 
03587     (*dst)->fragmentFlag = 0;
03588     return DCM_NORMAL;
03589 }

CONDITION readData const char *    name,
unsigned char **    ptr,
int    fd,
U32   size,
off_t *    fileOffset,
CTNBOOLEAN    knownLength,
int    byteOrder,
CTNBOOLEAN    explicitVR,
CTNBOOLEAN    acceptVRMismatch,
CTNBOOLEAN    fileFlag,
CTNBOOLEAN   remainOpenFlag,
CTNBOOLEAN    convertFlag,
PRIVATE_OBJECT **    object,
U32   scannedLength,
DCM_ELEMENT   e,
PRV_ELEMENT_ITEM **    elementItem
[static]
 

Definition at line 6739 of file l_mri_dicom_hdr.c.

References BYTEORDER_SAME, COND_PushCondition(), CONDITION, CTNBOOLEAN, DCM_AT, DCM_CloseObject(), DCM_FILEACCESSERROR, DCM_Message(), DCM_NORMAL, DCM_OB, DCM_OBJECT, DCM_OW, DCM_PXLPIXELDATA, DCM_UNSPECIFIEDLENGTH, fd, name, newElementItem(), object, pxl_len, pxl_off, read(), scanCompressedPixels(), swapATGroupElement(), swapInPlace(), DCM_ELEMENT::tag, U32, and verifyFormat().

Referenced by readFile1().

06747 {
06748     CTNBOOLEAN pixelFlag;
06749     CONDITION cond;
06750     int nBytes;
06751 
06752     pixelFlag = (e->tag == DCM_PXLPIXELDATA);
06753     cond = newElementItem(e, (pixelFlag == FALSE), elementItem);
06754     if (cond != DCM_NORMAL) {
06755         (void) DCM_CloseObject((DCM_OBJECT **) object);
06756         return cond;
06757     }
06758     (*elementItem)->element.data_offset = 0 ;      /* RWCox */
06759     if (pixelFlag) {
06760         if (fileFlag)
06761             *remainOpenFlag = TRUE;
06762         (*elementItem)->byteOrder = byteOrder;
06763         (*elementItem)->dataOffset = *fileOffset;
06764         (*elementItem)->currentOffset = 0;
06765         (*elementItem)->element.d.ot = NULL;
06766         if ((*object)->pixelBitsAllocated == 8)
06767             (*elementItem)->element.representation = DCM_OB;
06768         else
06769             (*elementItem)->element.representation = DCM_OW;
06770         if (fileFlag) {
06771             if (fd != -1) {
06772                 if ((*elementItem)->element.length != DCM_UNSPECIFIEDLENGTH){
06773 
06774                     pxl_off = lseek( fd , 0 , SEEK_CUR ) ;
06775                     pxl_len = (*elementItem)->element.length ;
06776 
06777                     (*elementItem)->element.data_offset = pxl_off ;   /* RWCox */
06778 
06779                     (void) lseek(fd,
06780                                  (off_t) (*elementItem)->element.length,
06781                                  SEEK_CUR);
06782                 } else {
06783                     U32 l1 = 0;
06784                     U32 s1;
06785                     off_t f1 = 0;
06786 
06787                     s1 = *size;
06788                     scanCompressedPixels("", ptr, fd,
06789                                          &s1,   /* size */
06790                                          &f1,   /* fileOffset */
06791                                          0, 0,
06792                                          byteOrder, explicitVR,
06793                                          acceptVRMismatch,
06794                                          fileFlag, remainOpenFlag,
06795                                          convertFlag, object,
06796                                          &l1,   /* scannedLength */
06797                                          e, elementItem);
06798                     (*elementItem)->originalDataLength = l1;
06799                     (*elementItem)->paddedDataLength = l1;
06800                 }
06801             } else {
06802                 (*object)->sk((*object)->userCtx,
06803                               (*elementItem)->element.length, SEEK_CUR);
06804             }
06805             (*object)->fd = fd;
06806         }
06807     } else {
06808         if (fileFlag) {
06809             if (fd != -1) {
06810                 (*elementItem)->element.data_offset = lseek(fd,0,SEEK_CUR);  /* RWCox */
06811                 nBytes = read(fd, (*elementItem)->element.d.ot,
06812                               (int) (*elementItem)->element.length);
06813             } else {
06814                 cond = (*object)->rd((*object)->userCtx,
06815                                      (*elementItem)->element.d.ot,
06816                             (long) (*elementItem)->element.length, &nBytes);
06817             }
06818             if (nBytes != (int) (*elementItem)->element.length) {
06819                 (void) DCM_CloseObject((DCM_OBJECT **) object);
06820                 return COND_PushCondition(DCM_FILEACCESSERROR,
06821                         DCM_Message(DCM_FILEACCESSERROR), name, "readFile");
06822             }
06823         } else {
06824             (void) memcpy((*elementItem)->element.d.ot, ptr,
06825                           (*elementItem)->element.length);
06826             ptr += (*elementItem)->originalDataLength;
06827         }
06828         if( LITTLE_ENDIAN_ARCHITECTURE ){
06829           if ((*elementItem)->element.representation == DCM_AT)
06830             swapATGroupElement(&(*elementItem)->element);
06831         }
06832         if (byteOrder != BYTEORDER_SAME)
06833             swapInPlace(object, &(*elementItem)->element);
06834         if (convertFlag) {
06835             cond = verifyFormat(*elementItem);
06836             if (cond != DCM_NORMAL)
06837                 return cond;
06838         }
06839     }
06840     if (*size != (long) DCM_UNSPECIFIEDLENGTH)
06841         *size -= (*elementItem)->originalDataLength;
06842     *fileOffset += (off_t) (*elementItem)->originalDataLength;
06843     if (scannedLength != NULL)
06844         (*scannedLength) += (*elementItem)->originalDataLength;
06845 
06846     if ((*elementItem)->element.length != DCM_UNSPECIFIEDLENGTH) {
06847       (*elementItem)->paddedDataLength = (*elementItem)->element.length;
06848     }
06849     if (((*elementItem)->paddedDataLength != DCM_UNSPECIFIEDLENGTH) &&
06850         ((*elementItem)->paddedDataLength & 1) )
06851         (*elementItem)->paddedDataLength += 1;
06852     (*object)->objectSize += (*elementItem)->paddedDataLength;
06853 
06854     return DCM_NORMAL;
06855 
06856 }

CONDITION readFile char *    name,
unsigned char *    callerBuf,
int    fd,
long    size,
off_t    fileOffset,
int    recursionLevel,
unsigned long    opt,
DCM_OBJECT **    callerObject,
U32   scannedLength,
CTNBOOLEAN   remainOpenFlag,
void *    ctx,
CONDITION(*    rd)(void *ctx, void *buf, int toRead, int *bytesRead),
CONDITION(*    sk)(void *ctx, int offset, int flag)
[static]
 

Definition at line 5729 of file l_mri_dicom_hdr.c.

References PRV_GROUP_ITEM::baseLength, BIG_ORDER, PRV_ELEMENT_ITEM::byteOrder, BYTEORDER_SAME, computeVM(), COND_PopCondition(), COND_PushCondition(), CONDITION, CTN_FREE, CTN_MALLOC, CTNBOOLEAN, ctxSensitiveLookup(), PRV_ELEMENT_ITEM::currentOffset, DCM_ELEMENT::d, PRV_ELEMENT_ITEM::dataOffset, DCM_AT, DCM_CloseObject(), DCM_CONVERTMASK, DCM_CreateObject(), DCM_CTX, DCM_DELETEMASK, DCM_DELETEONCLOSE, DCM_DLMITEM, DCM_DLMITEMDELIMITATIONITEM, DCM_DLMSEQUENCEDELIMITATIONITEM, DCM_DumpElements(), DCM_ELEMENTCREATEFAILED, DCM_ELEMENTLENGTHERROR, DCM_ELEMENTOUTOFORDER, DCM_EXPLICITBIGENDIAN, DCM_EXPLICITLITTLEENDIAN, DCM_FILEACCESSERROR, DCM_FORMATCONVERSION, DCM_ILLEGALSTREAMLENGTH, DCM_LISTFAILURE, DCM_LookupElement(), DCM_MAKETAG, DCM_MALLOCFAILURE, DCM_Message(), DCM_NORMAL, DCM_OB, DCM_OBJECT, DCM_ORDERBIGENDIAN, DCM_ORDERLITTLEENDIAN, DCM_ORDERMASK, DCM_ORDERNATIVE, DCM_OW, DCM_PXLPIXELDATA, DCM_SQ, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_UNEVENELEMENTLENGTH, DCM_UNSPECIFIEDLENGTH, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, fd, GET_LONG_REVERSE_ORDER, GET_LONG_SAME_ORDER, GET_SHORT_REVERSE_ORDER, GET_SHORT_SAME_ORDER, PRV_GROUP_ITEM::group, DCM_ELEMENT::length, LITTLE_ORDER, PRV_GROUP_ITEM::longVRAttributes, LST_Create(), LST_Enqueue(), LST_Head(), LST_Next(), LST_NORMAL, LST_Position(), name, NATIVE_ORDER, newElementItem(), DCM_SEQUENCE_ITEM::object, object, offset, PRV_ELEMENT_ITEM::originalDataLength, PRV_ELEMENT_ITEM::paddedDataLength, read(), DCM_ELEMENT::representation, swapATGroupElement(), swapInPlace(), DCM_ELEMENT::tag, U32, updateObjectType(), updateSpecialElements(), and verifyFormat().

Referenced by DCM_ImportStream(), DCM_OpenFile(), and readFile().

05736 {
05737     CONDITION
05738     cond;
05739     int
05740         byteOrder;
05741     long
05742         lastGroup = -1,
05743         lastElement = -1;
05744     U32
05745         sequenceLength,
05746         localLength;
05747     PRIVATE_OBJECT
05748         ** object;
05749     PRV_GROUP_ITEM
05750         * groupItem = NULL;
05751     unsigned short
05752         group,
05753         element,
05754         tagGroup,
05755         tagElement;
05756     DCM_ELEMENT
05757         e,
05758         tagE;
05759     CTNBOOLEAN
05760         pixelFlag,
05761         convertFlag = FALSE,
05762         done = FALSE,
05763         knownLength = TRUE,
05764         sequenceDone = FALSE,
05765         createGroupFlag,
05766         explicitVR = FALSE;
05767     unsigned char
05768         buf[8],
05769        *ptr;
05770     int
05771         nBytes;
05772     PRV_ELEMENT_ITEM
05773         * elementItem = NULL;
05774     DCM_OBJECT
05775         * sequenceObject;
05776     DCM_SEQUENCE_ITEM
05777         * sequenceItem;
05778     CTNBOOLEAN
05779         fileFlag = TRUE;
05780 
05781     if (callerBuf != NULL) {
05782         ptr = callerBuf;
05783         fileFlag = FALSE;
05784     } else
05785         ptr = buf;
05786 
05787     switch (opt & DCM_ORDERMASK) {
05788     case DCM_ORDERNATIVE:
05789         byteOrder = NATIVE_ORDER;
05790         break;
05791     case DCM_ORDERLITTLEENDIAN:
05792         byteOrder = LITTLE_ORDER;
05793         break;
05794     case DCM_EXPLICITLITTLEENDIAN:
05795         byteOrder = LITTLE_ORDER;
05796         explicitVR = TRUE;
05797         break;
05798     case DCM_ORDERBIGENDIAN:
05799         byteOrder = BIG_ORDER;
05800         break;
05801     case DCM_EXPLICITBIGENDIAN:
05802         byteOrder = BIG_ORDER;
05803         explicitVR = TRUE;
05804         break;
05805     default:
05806         byteOrder = NATIVE_ORDER;
05807         break;
05808     }
05809     if ((opt & DCM_CONVERTMASK) == DCM_FORMATCONVERSION)
05810         convertFlag = TRUE;
05811 
05812     if (scannedLength != NULL)
05813         *scannedLength = 0;
05814 
05815     cond = DCM_CreateObject(callerObject, opt);
05816     if (cond != DCM_NORMAL)
05817         return cond;
05818 
05819     object = (PRIVATE_OBJECT **) callerObject;
05820     if (fileFlag)
05821         strcpy((*object)->fileName, name);
05822 
05823     (*object)->fd = -1;
05824     (*object)->rd = rd;
05825     (*object)->sk = sk;
05826     (*object)->userCtx = ctx;
05827     if (size == (long) DCM_UNSPECIFIEDLENGTH)
05828         knownLength = FALSE;
05829 
05830     if ((fileFlag) && ((opt & DCM_DELETEMASK) == DCM_DELETEONCLOSE) && (recursionLevel == 0))
05831         (*object)->deleteFlag = TRUE;
05832 
05833     if (knownLength && (size == 0))
05834         done = TRUE;
05835 
05836     while (!done) {
05837 
05838         if ((size < 8) && knownLength) {
05839             if (debug)
05840                 (void) DCM_DumpElements(callerObject, 0);
05841             (void) DCM_CloseObject(callerObject);
05842             return COND_PushCondition(DCM_ILLEGALSTREAMLENGTH,
05843                                  DCM_Message(DCM_ILLEGALSTREAMLENGTH), size,
05844                                       "readFile");
05845         }
05846         if (fileFlag) {
05847             if (fd != -1) {
05848                 nBytes = read(fd, buf, 4);
05849             } else {
05850                 cond = (*object)->rd((*object)->userCtx, buf, 4, &nBytes);
05851             }
05852 
05853             if (nBytes != 4)
05854                 return COND_PushCondition(DCM_FILEACCESSERROR,
05855                                      DCM_Message(DCM_FILEACCESSERROR), name,
05856                                           "readFile");
05857             ptr = buf;
05858         }
05859         if (knownLength)
05860             size -= 4;
05861         fileOffset += (off_t) 4;
05862         if (scannedLength != NULL)
05863             (*scannedLength) += 4;
05864         (*object)->objectSize += 4;
05865 
05866         if (byteOrder == BYTEORDER_SAME) {
05867             GET_SHORT_SAME_ORDER(ptr, group);
05868             GET_SHORT_SAME_ORDER(ptr + 2, element);
05869             e.tag = DCM_MAKETAG(group, element);
05870         } else {
05871             GET_SHORT_REVERSE_ORDER(ptr, group);
05872             GET_SHORT_REVERSE_ORDER(ptr + 2, element);
05873             e.tag = DCM_MAKETAG(group, element);
05874         }
05875         ptr += 4;
05876 
05877         if (explicitVR) {
05878             if (fileFlag) {
05879                 if (fd != -1) {
05880                     nBytes = read(fd, buf, 4);
05881                 } else {
05882                     cond = (*object)->rd((*object)->userCtx, buf, 4, &nBytes);
05883                 }
05884 
05885                 if (nBytes != 4)
05886                     return COND_PushCondition(DCM_FILEACCESSERROR,
05887                                      DCM_Message(DCM_FILEACCESSERROR), name,
05888                                               "readFile");
05889                 ptr = buf;
05890             }
05891             if (knownLength)
05892                 size -= 4;
05893             fileOffset += (off_t) 4;
05894             if (scannedLength != NULL)
05895                 (*scannedLength) += 4;
05896             (*object)->objectSize += 4;
05897             if ((strncmp((char *) ptr, "OB", 2) == 0) ||
05898                 (strncmp((char *) ptr, "OW", 2) == 0) ||
05899                 (strncmp((char *) ptr, "SQ", 2) == 0)) {
05900             } else {
05901             }
05902         } else {
05903 
05904             if (fileFlag) {
05905                 if (fd != -1) {
05906                     nBytes = read(fd, buf, 4);
05907                 } else {
05908                     cond = (*object)->rd((*object)->userCtx, buf, 4, &nBytes);
05909                 }
05910 
05911                 if (nBytes != 4)
05912                     return COND_PushCondition(DCM_FILEACCESSERROR,
05913                                      DCM_Message(DCM_FILEACCESSERROR), name,
05914                                               "readFile");
05915                 ptr = buf;
05916             }
05917             if (knownLength)
05918                 size -= 4;
05919             fileOffset += (off_t) 4;
05920             if (scannedLength != NULL)
05921                 (*scannedLength) += 4;
05922             (*object)->objectSize += 4;
05923 
05924 
05925             if (byteOrder == BYTEORDER_SAME) {
05926                 GET_LONG_SAME_ORDER(ptr, e.length);
05927             } else {
05928                 GET_LONG_REVERSE_ORDER(ptr, e.length);
05929             }
05930             ptr += 4;
05931         }
05932 
05933         if (((e.length & 1) != 0) && (e.length != DCM_UNSPECIFIEDLENGTH)) {
05934             if (debug)
05935                 (void) DCM_DumpElements(callerObject, 0);
05936             (void) DCM_CloseObject(callerObject);
05937             return COND_PushCondition(DCM_UNEVENELEMENTLENGTH,
05938                                       DCM_Message(DCM_UNEVENELEMENTLENGTH),
05939                                       group, element, e.length,
05940                                       "readFile");
05941         }
05942         if ((e.length != (U32) DCM_UNSPECIFIEDLENGTH) && (e.length > (U32) size)) {
05943             if (debug)
05944                 (void) DCM_DumpElements(callerObject, 0);
05945             (void) DCM_CloseObject(callerObject);
05946             return COND_PushCondition(DCM_ELEMENTLENGTHERROR,
05947                                       DCM_Message(DCM_ELEMENTLENGTHERROR),
05948                                 group, element, e.length, size, "readFile");
05949         }
05950         if ((e.tag == DCM_DLMITEMDELIMITATIONITEM) ||
05951             (e.tag == DCM_DLMSEQUENCEDELIMITATIONITEM)) {
05952             return DCM_NORMAL;
05953         }
05954         cond = DCM_LookupElement(&e);
05955         if (cond != DCM_NORMAL)
05956             (void) COND_PopCondition(0);
05957         if (e.representation == DCM_CTX)
05958             ctxSensitiveLookup(object, &e);
05959 
05960         if (e.representation == DCM_SQ) {
05961             cond = newElementItem(&e, FALSE, &elementItem);
05962             if (cond != DCM_NORMAL)
05963                 return cond;
05964             elementItem->element.d.sq = LST_Create();
05965             if (elementItem->element.d.sq == NULL)
05966                 return COND_PushCondition(DCM_LISTFAILURE,
05967                                   DCM_Message(DCM_LISTFAILURE), "readFile");
05968 
05969             localLength = elementItem->element.length;
05970             sequenceDone = (localLength == 0);
05971 
05972             while (!sequenceDone) {
05973                 if (debug)
05974                     fprintf(stderr, "Sequence Length: %d %x\n", localLength,
05975                             localLength);
05976                 if (fileFlag) {
05977                     if (fd != -1) {
05978                         nBytes = read(fd, buf, 8);
05979                     } else {
05980                         cond = (*object)->rd((*object)->userCtx, buf, 8, &nBytes);
05981                     }
05982                     if (nBytes != 8)
05983                         return COND_PushCondition(DCM_FILEACCESSERROR,
05984                                      DCM_Message(DCM_FILEACCESSERROR), name,
05985                                                   "readFile");
05986                     ptr = buf;
05987                 }
05988                 if (size != (long) DCM_UNSPECIFIEDLENGTH)
05989                     size -= 8;
05990                 fileOffset += (off_t) 8;
05991                 if (scannedLength != NULL)
05992                     (*scannedLength) += 8;
05993                 (*object)->objectSize += 8;
05994                 if (localLength != DCM_UNSPECIFIEDLENGTH)
05995                     localLength -= 8;
05996 
05997                 if (byteOrder == BYTEORDER_SAME) {
05998                     GET_SHORT_SAME_ORDER(ptr, tagGroup);
05999                     GET_SHORT_SAME_ORDER(ptr + 2, tagElement);
06000                     tagE.tag = DCM_MAKETAG(tagGroup, tagElement);
06001                     GET_LONG_SAME_ORDER(ptr + 4, tagE.length);
06002                 } else {
06003                     GET_SHORT_REVERSE_ORDER(ptr, tagGroup);
06004                     GET_SHORT_REVERSE_ORDER(ptr + 2, tagElement);
06005                     tagE.tag = DCM_MAKETAG(tagGroup, tagElement);
06006                     GET_LONG_REVERSE_ORDER(ptr + 4, tagE.length);
06007                 }
06008                 ptr += 8;
06009                 if (debug)
06010                     fprintf(stderr, "Sequence item: %4x %4x %d (%x)\n",
06011                             tagGroup, tagElement, tagE.length, tagE.length);
06012                 if (tagE.tag == DCM_DLMITEM) {
06013 /*                  if (size != DCM_UNSPECIFIEDLENGTH)
06014                         size -= 8;
06015 */
06016 /*                  fileOffset += 8;
06017 */
06018                     cond = readFile(name,
06019                                     (fileFlag) ? NULL : ptr,
06020                                     fd, tagE.length,
06021                                     fileOffset, recursionLevel + 1, opt,
06022                                     &sequenceObject, &sequenceLength,
06023                                     remainOpenFlag, ctx, rd, sk);
06024                     if (cond == DCM_NORMAL) {
06025                         sequenceItem = CTN_MALLOC(sizeof(*sequenceItem));
06026                         if (sequenceItem == NULL)
06027                             return COND_PushCondition(DCM_MALLOCFAILURE,
06028                                              DCM_Message(DCM_MALLOCFAILURE),
06029                                          sizeof(*sequenceItem), "readFile");
06030 
06031                         sequenceItem->object = sequenceObject;
06032                         cond = LST_Enqueue(&elementItem->element.d.sq,
06033                                            (void *)sequenceItem);
06034                         if (cond != LST_NORMAL)
06035                             return COND_PushCondition(DCM_LISTFAILURE,
06036                                   DCM_Message(DCM_LISTFAILURE), "readFile");
06037                         if (size != (long) DCM_UNSPECIFIEDLENGTH)
06038                             size -= sequenceLength;
06039                         fileOffset += (off_t) sequenceLength;
06040                         if (scannedLength != NULL)
06041                             *scannedLength += sequenceLength;
06042                         (*object)->objectSize += sequenceLength;
06043                         if (localLength != DCM_UNSPECIFIEDLENGTH)
06044                             localLength -= sequenceLength;
06045                         ptr += sequenceLength;
06046                     } else
06047                         return cond;
06048                 } else {
06049                     sequenceDone = TRUE;
06050                 }
06051                 if (localLength == 0)
06052                     sequenceDone = TRUE;
06053             }
06054         } else {
06055             pixelFlag = (e.tag == DCM_PXLPIXELDATA);
06056             cond = newElementItem(&e, (pixelFlag == FALSE), &elementItem);
06057             if (cond != DCM_NORMAL) {
06058                 (void) DCM_CloseObject(callerObject);
06059                 return cond;
06060             }
06061             if (pixelFlag) {
06062                 if (fileFlag)
06063                     *remainOpenFlag = TRUE;
06064                 elementItem->byteOrder = byteOrder;
06065                 elementItem->dataOffset = fileOffset;
06066                 elementItem->currentOffset = 0;
06067                 if (fileFlag)
06068                     elementItem->element.d.ot = NULL;
06069                 else
06070                     elementItem->element.d.ot = (void *) ptr;
06071                 if ((*object)->pixelBitsAllocated == 8)
06072                     elementItem->element.representation = DCM_OB;
06073                 else
06074                     elementItem->element.representation = DCM_OW;
06075                 if (fileFlag) {
06076                     if (fd != -1) {
06077                         (void) lseek(fd, (off_t) elementItem->element.length, SEEK_CUR);
06078                     } else {
06079                         (*object)->sk((*object)->userCtx,
06080                                       elementItem->element.length, SEEK_CUR);
06081                     }
06082                     (*object)->fd = fd;
06083                 }
06084             } else {
06085                 if (fileFlag) {
06086                     if (fd != -1) {
06087                         nBytes = read(fd, elementItem->element.d.ot,
06088                                       (int) elementItem->element.length);
06089                     } else {
06090                         cond = (*object)->rd((*object)->userCtx,
06091                                              elementItem->element.d.ot,
06092                                (long) elementItem->element.length, &nBytes);
06093                     }
06094                     if (nBytes != (int) elementItem->element.length) {
06095                         (void) DCM_CloseObject(callerObject);
06096                         return COND_PushCondition(DCM_FILEACCESSERROR,
06097                         DCM_Message(DCM_FILEACCESSERROR), name, "readFile");
06098                     }
06099                 } else {
06100                     (void) memcpy(elementItem->element.d.ot, ptr,
06101                                   elementItem->element.length);
06102                     ptr += elementItem->originalDataLength;
06103                 }
06104 
06105                 if( LITTLE_ENDIAN_ARCHITECTURE ){
06106                   if (elementItem->element.representation == DCM_AT)
06107                     swapATGroupElement(&elementItem->element);
06108                 }
06109                 if (byteOrder != BYTEORDER_SAME)
06110                     swapInPlace(object, &elementItem->element);
06111                 if (convertFlag) {
06112                     cond = verifyFormat(elementItem);
06113                     if (cond != DCM_NORMAL)
06114                         return cond;
06115                 }
06116             }
06117             if (size != (long) DCM_UNSPECIFIEDLENGTH)
06118                 size -= elementItem->originalDataLength;
06119             fileOffset += (off_t) elementItem->originalDataLength;
06120             if (scannedLength != NULL)
06121                 (*scannedLength) += elementItem->originalDataLength;
06122 
06123             elementItem->paddedDataLength = elementItem->element.length;
06124             if (elementItem->paddedDataLength & 1)
06125                 elementItem->paddedDataLength += 1;
06126             (*object)->objectSize += elementItem->paddedDataLength;
06127         }
06128 
06129         computeVM(object, &elementItem->element);
06130 
06131         if ((long) DCM_TAG_GROUP(e.tag) == lastGroup) {
06132             if ((long) DCM_TAG_ELEMENT(e.tag) <= lastElement)
06133                 return COND_PushCondition(DCM_ELEMENTOUTOFORDER,
06134                                           DCM_Message(DCM_ELEMENTOUTOFORDER),
06135                                           group, element, "readFile");
06136         } else if ((long) DCM_TAG_GROUP(e.tag) > lastGroup) {
06137         } else {
06138             return COND_PushCondition(DCM_ELEMENTOUTOFORDER,
06139                          DCM_Message(DCM_ELEMENTOUTOFORDER), group, element,
06140                                       "readFile");
06141         }
06142         lastGroup = (long) group;
06143         lastElement = (long) element;
06144 
06145         if (groupItem == NULL)
06146             createGroupFlag = TRUE;
06147         else if (groupItem->group != group)
06148             createGroupFlag = TRUE;
06149         else
06150             createGroupFlag = FALSE;
06151 
06152         if (createGroupFlag == TRUE) {
06153             groupItem = CTN_MALLOC(sizeof(*groupItem));
06154             if (groupItem == NULL) {
06155                 (void) DCM_CloseObject(callerObject);
06156                 return COND_PushCondition(DCM_ELEMENTCREATEFAILED,
06157                                        DCM_Message(DCM_ELEMENTCREATEFAILED),
06158                                           "readFile",
06159                                           group, 0xffff, sizeof(*groupItem));
06160             }
06161             groupItem->group = group;
06162             groupItem->baseLength = 0;
06163             groupItem->longVRAttributes = 0;
06164             groupItem->elementList = LST_Create();
06165             if (groupItem->elementList == NULL) {
06166                 (void) DCM_CloseObject(callerObject);
06167                 return COND_PushCondition(DCM_LISTFAILURE,
06168                                           DCM_Message(DCM_LISTFAILURE),
06169                                           "readFile");
06170             }
06171             if (LST_Enqueue(&(*object)->groupList, (void *)groupItem) != LST_NORMAL) {
06172                 (void) DCM_CloseObject(callerObject);
06173                 return COND_PushCondition(DCM_LISTFAILURE,
06174                                           DCM_Message(DCM_LISTFAILURE),
06175                                           "readFile");
06176             }
06177         }
06178         if (element != 0x0000)
06179             groupItem->baseLength += 8 + elementItem->paddedDataLength;
06180         if ((element == 0x0000) && ((*object)->groupLengthFlag == FALSE)) {
06181             CTN_FREE(elementItem);
06182         } else {
06183             cond = LST_Enqueue(&groupItem->elementList, (void *)elementItem);
06184             if (cond != LST_NORMAL) {
06185                 (void) DCM_CloseObject(callerObject);
06186                 return COND_PushCondition(DCM_LISTFAILURE,
06187                                           DCM_Message(DCM_LISTFAILURE),
06188                                           "readFile");
06189             }
06190             cond = updateObjectType(object, &elementItem->element);     /* repair */
06191 
06192             cond = updateSpecialElements(object, elementItem);  /* repair */
06193         }
06194 
06195         if (size == 0)
06196             done = TRUE;
06197 
06198 #ifdef DEBUG
06199         if (debug) {
06200 /*lint -e644 */
06201             (void) fprintf(stderr, "Address: %px Group %2x, element %2x, length %ld ",
06202                            elementItem,
06203                            DCM_TAG_GROUP(elementItem->element.tag),
06204                            DCM_TAG_ELEMENT(elementItem->element.tag),
06205                            elementItem->element.length);
06206 /*lint +e644 */
06207             (void) fprintf(stderr, "Object size: %d\n", (*object)->objectSize);
06208         }
06209 #endif
06210     }
06211 
06212     groupItem = (void *)LST_Head(&(*object)->groupList);
06213     if (groupItem != NULL) {
06214         (void) LST_Position(&(*object)->groupList, (void *)groupItem);
06215         while (groupItem != NULL) {
06216             elementItem = (void *)LST_Head(&groupItem->elementList);
06217             if (elementItem != NULL) {
06218                 if (DCM_TAG_ELEMENT(elementItem->element.tag) == 0x0000) {
06219                     *elementItem->element.d.ul = groupItem->baseLength;
06220                 }
06221             }
06222             groupItem = (void *)LST_Next(&(*object)->groupList);
06223         }
06224     }
06225     return DCM_NORMAL;
06226 }

CONDITION readFile1 const char *    name,
unsigned char *    callerBuf,
int    fd,
U32    size,
off_t *    fileOffset,
int    recursionLevel,
unsigned long    opt,
PRIVATE_OBJECT **    parentObject,
DCM_OBJECT **    callerObject,
U32   scannedLength,
CTNBOOLEAN   remainOpenFlag,
void *    ctx,
CONDITION(*    rd)(void *ctx, void *buf, int toRead, int *bytesRead),
CONDITION(*    sk)(void *ctx, int offset, int flag)
[static]
 

Definition at line 6931 of file l_mri_dicom_hdr.c.

References PRV_GROUP_ITEM::baseLength, BIG_ORDER, checkAttributeOrder(), computeVM(), COND_PushCondition(), CONDITION, CTN_FREE, CTNBOOLEAN, DCM_ELEMENT::d, DCM_ACCEPTVRMISMATCH, DCM_ALLOWREPEATELEMENTS, DCM_CloseObject(), DCM_CONVERTMASK, DCM_CreateObject(), DCM_DELETEMASK, DCM_DELETEONCLOSE, DCM_DLMITEMDELIMITATIONITEM, DCM_DLMSEQUENCEDELIMITATIONITEM, DCM_EFILM, DCM_EXPLICITBIGENDIAN, DCM_EXPLICITLITTLEENDIAN, DCM_FILEFORMATMASK, DCM_FORMATCONVERSION, DCM_LISTFAILURE, DCM_MAKETAG, DCM_Message(), DCM_NORMAL, DCM_OB, DCM_OBJECT, DCM_ORDERBIGENDIAN, DCM_ORDERLITTLEENDIAN, DCM_ORDERMASK, DCM_ORDERNATIVE, DCM_OW, DCM_PART10FILE, DCM_PREAMBLELENGTH, DCM_REPEATEDELEMENT, DCM_REPEATELEMENTSMASK, DCM_SPECIALFORMATMASK, DCM_SQ, DCM_STREAMCOMPLETE, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_UN, DCM_UNSPECIFIEDLENGTH, DCM_VRMASK, PRV_ELEMENT_ITEM::element, PRV_GROUP_ITEM::elementList, ENTRY, fd, handleGroupItem(), DCM_ELEMENT::length, LITTLE_ORDER, PRV_GROUP_ITEM::longVRAttributes, LST_Enqueue(), LST_Head(), LST_Next(), LST_NORMAL, LST_Position(), name, NATIVE_ORDER, object, offset, PRV_ELEMENT_ITEM::paddedDataLength, readData(), readGroupElement(), readPreamble(), readSequence(), readVRLength(), DCM_ELEMENT::representation, RETURN, STATUS, DCM_ELEMENT::tag, U32, updateObjectType(), and updateSpecialElements().

Referenced by DCM_OpenFile(), DCM_ReadStream(), and readSequence().

06939 {
06940     CONDITION
06941     cond;
06942     int
06943         byteOrder;
06944     long
06945         lastGroup = -1,
06946         lastElement = -1;
06947     U32
06948         sequenceLength,
06949         scannedSequenceLength;
06950     PRIVATE_OBJECT
06951         ** object;
06952     PRV_GROUP_ITEM
06953         * groupItem = NULL;
06954     DCM_ELEMENT
06955         e;
06956     CTNBOOLEAN
06957         convertFlag = FALSE,
06958         done = FALSE,
06959         knownLength = TRUE,
06960         explicitVR = FALSE,
06961         acceptVRMismatch = FALSE,
06962         part10Flag = FALSE;
06963     unsigned char
06964        *ptr = NULL;
06965     PRV_ELEMENT_ITEM
06966         * elementItem = NULL;
06967     CTNBOOLEAN
06968         fileFlag = TRUE;
06969     CONDITION flag;
06970     CTNBOOLEAN allowRepeatElements = FALSE;
06971 
06972 ENTRY("readFile1") ;
06973 
06974     ptr = callerBuf;
06975     if (ptr != NULL)
06976         fileFlag = FALSE;
06977 
06978     if ((opt & DCM_FILEFORMATMASK) == DCM_PART10FILE) {
06979         part10Flag = TRUE;
06980         opt &= ~DCM_ORDERMASK;
06981         opt &= ~DCM_FILEFORMATMASK;
06982         opt |= DCM_EXPLICITLITTLEENDIAN;
06983     }
06984     if ((opt & DCM_SPECIALFORMATMASK) == DCM_EFILM) {
06985         part10Flag = TRUE;
06986         opt &= ~DCM_ORDERMASK;
06987         opt &= ~DCM_FILEFORMATMASK;
06988         opt |= DCM_ORDERLITTLEENDIAN;
06989     }
06990     if ((opt & DCM_REPEATELEMENTSMASK) == DCM_ALLOWREPEATELEMENTS) {
06991       allowRepeatElements = TRUE;
06992     }
06993 
06994     switch (opt & DCM_ORDERMASK) {
06995     case DCM_ORDERNATIVE:
06996         byteOrder = NATIVE_ORDER;
06997         break;
06998     case DCM_ORDERLITTLEENDIAN:
06999         byteOrder = LITTLE_ORDER;
07000         break;
07001     case DCM_EXPLICITLITTLEENDIAN:
07002         byteOrder = LITTLE_ORDER;
07003         explicitVR = TRUE;
07004         break;
07005     case DCM_ORDERBIGENDIAN:
07006         byteOrder = BIG_ORDER;
07007         break;
07008     case DCM_EXPLICITBIGENDIAN:
07009         byteOrder = BIG_ORDER;
07010         explicitVR = TRUE;
07011         break;
07012     default:
07013         byteOrder = NATIVE_ORDER;
07014         break;
07015     }
07016     if ((opt & DCM_CONVERTMASK) == DCM_FORMATCONVERSION)
07017         convertFlag = TRUE;
07018     if ((opt & DCM_VRMASK) == DCM_ACCEPTVRMISMATCH)
07019         acceptVRMismatch = TRUE;
07020 
07021     if (scannedLength != NULL)
07022         *scannedLength = 0;
07023 
07024     cond = DCM_CreateObject(callerObject, opt);
07025     if (cond != DCM_NORMAL)
07026         RETURN( cond ) ;
07027 
07028     object = (PRIVATE_OBJECT **) callerObject;
07029     if (fileFlag)
07030         strcpy((*object)->fileName, name);
07031 
07032     (*object)->fd = -1;
07033     (*object)->rd = rd;
07034     (*object)->sk = sk;
07035     (*object)->userCtx = ctx;
07036     (*object)->dataOptions = 0;
07037     if (size == (long) DCM_UNSPECIFIEDLENGTH)
07038         knownLength = FALSE;
07039 
07040     if ((fileFlag) && ((opt & DCM_DELETEMASK) == DCM_DELETEONCLOSE) && (recursionLevel == 0))
07041         (*object)->deleteFlag = TRUE;
07042 
07043     if (parentObject != NULL)
07044         (*object)->pixelRepresentation = (*parentObject)->pixelRepresentation;
07045 
07046     if (recursionLevel == 0 && part10Flag) {
07047         flag = readPreamble(name, &ptr, fd, &size, fileOffset, knownLength,
07048                             object, scannedLength);
07049         if (flag != DCM_NORMAL)
07050             { STATUS("readPreamble fails"); goto abort; }
07051     }
07052     while (!done) {
07053         flag = readGroupElement(name, &ptr, fd, &size, fileOffset, knownLength,
07054                             byteOrder, explicitVR, acceptVRMismatch, object,
07055                                 scannedLength, &e);
07056         if (flag == DCM_STREAMCOMPLETE)
07057             break;
07058         else if (flag != DCM_NORMAL)
07059             { STATUS("readGroupElement fails"); goto abort; }
07060 #if 0
07061         if (e.tag == DCM_MAKETAG(0x003a, 0x1000)) {
07062             fprintf(stderr, "Found waveform\n");
07063         }
07064 #endif
07065         flag = readVRLength(name, &ptr, fd, &size, fileOffset, knownLength,
07066                             byteOrder, explicitVR, acceptVRMismatch, object,
07067                             scannedLength, &e);
07068         if (flag != DCM_NORMAL)
07069             { STATUS("readVRLength fails"); goto abort; }
07070 
07071         if ((e.representation == DCM_UN) &&
07072             (e.length == DCM_UNSPECIFIEDLENGTH)) {
07073             e.representation = DCM_SQ;
07074         }
07075 #ifndef SMM
07076         if ((e.tag == DCM_DLMITEMDELIMITATIONITEM) ||
07077             (e.tag == DCM_DLMSEQUENCEDELIMITATIONITEM)) {
07078             RETURN( DCM_NORMAL) ;
07079         }
07080 #else
07081         if (e.tag == DCM_DLMITEMDELIMITATIONITEM) {
07082             (*object)->objectSize -= 8;
07083             RETURN( DCM_NORMAL );
07084         }
07085         if (e.tag == DCM_DLMSEQUENCEDELIMITATIONITEM)
07086             RETURN( DCM_NORMAL );
07087 #endif
07088 
07089         if (e.representation == DCM_SQ) {
07090             sequenceLength = e.length;
07091             scannedSequenceLength = 0;
07092             flag = readSequence(name, &ptr, fd, &sequenceLength,
07093                                 fileOffset, recursionLevel, opt,
07094                                 byteOrder, explicitVR, acceptVRMismatch,
07095                                 fileFlag, remainOpenFlag,
07096                                 convertFlag, object, &scannedSequenceLength,
07097                                 &e, &elementItem);
07098             if (flag != DCM_NORMAL)
07099                 { STATUS("readSequence fails"); goto abort; }
07100             if (size != (long) DCM_UNSPECIFIEDLENGTH)
07101                 size -= scannedSequenceLength;
07102             if (scannedLength != NULL)
07103                 *scannedLength += scannedSequenceLength;
07104 
07105         } else {
07106 
07107             flag = readData(name, &ptr, fd, &size, fileOffset, knownLength,
07108                           byteOrder, explicitVR, acceptVRMismatch, fileFlag,
07109                             remainOpenFlag, convertFlag,
07110                             object, scannedLength, &e, &elementItem);
07111             if (flag != DCM_NORMAL)
07112                 { STATUS("readData fails"); goto abort; }
07113         }
07114         computeVM(object, &elementItem->element);
07115 
07116         cond = checkAttributeOrder(&e, &lastGroup, &lastElement, allowRepeatElements);
07117         if (cond != DCM_NORMAL) {
07118             if (cond == DCM_REPEATEDELEMENT) {
07119                 CTN_FREE(elementItem);
07120                 continue;
07121             } else {
07122                 CTN_FREE(elementItem);     /* 14 June 2005 [rickr] */
07123                 RETURN( cond ) ;
07124             }
07125         }
07126 
07127         cond = handleGroupItem(object, &groupItem, DCM_TAG_GROUP(e.tag));
07128         if (cond != DCM_NORMAL)
07129              /* goto abort; ASG */ RETURN( cond );
07130 
07131         if (DCM_TAG_ELEMENT(e.tag) != 0x0000) {
07132             groupItem->baseLength += 8 + elementItem->paddedDataLength;
07133             if (elementItem->element.representation == DCM_OB ||
07134                 elementItem->element.representation == DCM_OW ||
07135                 elementItem->element.representation == DCM_SQ) {
07136                 groupItem->longVRAttributes++;
07137                 (*object)->longVRAttributes++;
07138             }
07139         }
07140         if ((DCM_TAG_ELEMENT(e.tag) == 0x0000) && ((*object)->groupLengthFlag == FALSE)) {
07141             CTN_FREE(elementItem);
07142         } else {
07143             cond = LST_Enqueue(&groupItem->elementList, (void *)elementItem);
07144             if (cond != LST_NORMAL) {
07145                 (void) DCM_CloseObject(callerObject);
07146                 RETURN( COND_PushCondition(DCM_LISTFAILURE,
07147                                           DCM_Message(DCM_LISTFAILURE),
07148                                           "readFile") );
07149             }
07150             cond = updateObjectType(object, &elementItem->element);     /* repair */
07151 
07152             cond = updateSpecialElements(object, elementItem);  /* repair */
07153         }
07154 
07155         if (size == 0)
07156             done = TRUE;
07157 
07158         if (part10Flag) {
07159             if ((*object)->objectSize == (DCM_PREAMBLELENGTH + 4 + 12 + (*object)->metaHeaderLength)) {
07160                 opt &= ~DCM_ORDERMASK;
07161                 opt |= (*object)->dataOptions & DCM_ORDERMASK;
07162                 explicitVR = FALSE;
07163                 switch (opt & DCM_ORDERMASK) {
07164                 case DCM_ORDERNATIVE:
07165                     byteOrder = NATIVE_ORDER;
07166                     break;
07167                 case DCM_ORDERLITTLEENDIAN:
07168                     byteOrder = LITTLE_ORDER;
07169                     break;
07170                 case DCM_EXPLICITLITTLEENDIAN:
07171                     byteOrder = LITTLE_ORDER;
07172                     explicitVR = TRUE;
07173                     break;
07174                 case DCM_ORDERBIGENDIAN:
07175                     byteOrder = BIG_ORDER;
07176                     break;
07177                 case DCM_EXPLICITBIGENDIAN:
07178                     byteOrder = BIG_ORDER;
07179                     explicitVR = TRUE;
07180                     break;
07181                 default:
07182                     byteOrder = LITTLE_ORDER;
07183                     explicitVR = TRUE;
07184                     break;
07185                 }
07186             }
07187         }
07188     }
07189 
07190 #ifdef SMM
07191 #endif
07192 
07193     groupItem = (void *)LST_Head(&(*object)->groupList);
07194     if (groupItem != NULL) {
07195         (void) LST_Position(&(*object)->groupList, (void *)groupItem);
07196         while (groupItem != NULL) {
07197             elementItem = (void *)LST_Head(&groupItem->elementList);
07198             if (elementItem != NULL) {
07199                 if (DCM_TAG_ELEMENT(elementItem->element.tag) == 0x0000) {
07200                     *elementItem->element.d.ul = groupItem->baseLength;
07201                 }
07202             }
07203             groupItem = (void *)LST_Next(&(*object)->groupList);
07204         }
07205     }
07206     RETURN( DCM_NORMAL );
07207 
07208 abort:
07209     RETURN (flag);
07210 }

CONDITION readGroupElement const char *    name,
unsigned char **    ptr,
int    fd,
U32   size,
off_t *    fileOffset,
CTNBOOLEAN    knownLength,
int    byteOrder,
CTNBOOLEAN    explicitVR,
CTNBOOLEAN    acceptVRMismatch,
PRIVATE_OBJECT **    object,
U32   scannedLength,
DCM_ELEMENT   e
[static]
 

Definition at line 6286 of file l_mri_dicom_hdr.c.

References BYTEORDER_SAME, COND_PopCondition(), COND_PushCondition(), CONDITION, CTNBOOLEAN, ctxSensitiveLookup(), DCM_CloseObject(), DCM_CTX, DCM_DumpElements(), DCM_FILEACCESSERROR, DCM_ILLEGALSTREAMLENGTH, DCM_LookupElement(), DCM_MAKETAG, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_STREAMCOMPLETE, fd, GET_SHORT_REVERSE_ORDER, GET_SHORT_SAME_ORDER, name, object, read(), DCM_ELEMENT::representation, DCM_ELEMENT::tag, and U32.

Referenced by DCM_GetCompressedValue(), readFile1(), readSequence(), and scanCompressedPixels().

06291 {
06292     unsigned char *localPtr;
06293     unsigned char buf[4];
06294     int nBytes;
06295     CONDITION cond;
06296     unsigned short group,
06297         element;
06298 
06299     if (*size == 0)
06300         return DCM_STREAMCOMPLETE;
06301 
06302     if ((*size < 4) && knownLength) {
06303         if (debug)
06304             (void) DCM_DumpElements((DCM_OBJECT **) object, 0);
06305         (void) DCM_CloseObject((DCM_OBJECT **) object);
06306         return COND_PushCondition(DCM_ILLEGALSTREAMLENGTH,
06307                                 DCM_Message(DCM_ILLEGALSTREAMLENGTH), *size,
06308                                   "readFile");
06309     }
06310     if (*ptr == NULL) {
06311         if (fd != -1) {
06312             nBytes = read(fd, buf, 4);
06313         } else {
06314             cond = (*object)->rd((*object)->userCtx, buf, 4, &nBytes);
06315         }
06316 
06317         if (nBytes != 4)
06318             return COND_PushCondition(DCM_FILEACCESSERROR,
06319                                       DCM_Message(DCM_FILEACCESSERROR), name,
06320                                       "readGroupElement");
06321         localPtr = buf;
06322     } else {
06323         localPtr = *ptr;
06324     }
06325 
06326     if (knownLength)
06327         *size -= 4;
06328     *fileOffset += (off_t) 4;
06329     if (scannedLength != NULL)
06330         (*scannedLength) += 4;
06331     (*object)->objectSize += 4;
06332 
06333     if (byteOrder == BYTEORDER_SAME) {
06334         GET_SHORT_SAME_ORDER(localPtr, group);
06335         GET_SHORT_SAME_ORDER(localPtr + 2, element);
06336         e->tag = DCM_MAKETAG(group, element);
06337     } else {
06338         GET_SHORT_REVERSE_ORDER(localPtr, group);
06339         GET_SHORT_REVERSE_ORDER(localPtr + 2, element);
06340         e->tag = DCM_MAKETAG(group, element);
06341     }
06342     if (*ptr != NULL)
06343         *ptr += 4;
06344 
06345     if (debug)
06346         fprintf(stderr, "%04x %04x ", group, element);
06347 
06348     cond = DCM_LookupElement(e);
06349     if (cond != DCM_NORMAL)
06350         (void) COND_PopCondition(0);
06351     if (e->representation == DCM_CTX)
06352         ctxSensitiveLookup(object, e);
06353 
06354     return DCM_NORMAL;
06355 }

CONDITION readLengthToEnd int    fd,
const char *    fileName,
unsigned long    opt,
U32   lengthToEnd
[static]
 

Definition at line 7456 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), CONDITION, DCM_ELEMENT::d, DCM_CloseObject(), DCM_FILEACCESSERROR, DCM_GetElementValue(), DCM_ImportStream(), DCM_MAKETAG, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_UL, fd, fileName, read(), and U32.

Referenced by DCM_OpenFile().

07458 {
07459     unsigned char buf[24];
07460     DCM_OBJECT *obj;
07461     CONDITION cond;
07462     DCM_ELEMENT e = {DCM_MAKETAG(0x0008, 0x0001), DCM_UL, "", 1, 4, NULL};
07463     void *ctx = NULL;
07464     U32 rtnLength = 0;
07465 
07466     if (read(fd, buf, 24) != 24)
07467         return COND_PushCondition(DCM_FILEACCESSERROR,
07468                                   DCM_Message(DCM_FILEACCESSERROR), fileName,
07469                                   "(DCM)readLengthToEnd");
07470 
07471     cond = DCM_ImportStream(buf, 24, opt, &obj);
07472     if (cond != DCM_NORMAL)
07473         return cond;
07474 
07475     e.d.ul = lengthToEnd;
07476     cond = DCM_GetElementValue(&obj, &e, &rtnLength, &ctx);
07477 
07478     (void) DCM_CloseObject(&obj);
07479 
07480     return cond;
07481 }

CONDITION readPreamble const char *    name,
unsigned char **    ptr,
int    fd,
U32   size,
off_t *    fileOffset,
CTNBOOLEAN    knownLength,
PRIVATE_OBJECT **    object,
U32   scannedLength
[static]
 

Definition at line 6229 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), CONDITION, CTNBOOLEAN, DCM_CloseObject(), DCM_DumpElements(), DCM_FILEACCESSERROR, DCM_ILLEGALSTREAMLENGTH, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_PREAMBLELENGTH, DCM_STREAMCOMPLETE, fd, name, object, read(), and U32.

Referenced by readFile1().

06232 {
06233     int nBytes,
06234         tmp;
06235     CONDITION cond;
06236     char label[4];
06237 
06238     if (*size == 0)
06239         return DCM_STREAMCOMPLETE;
06240 
06241     if ((*size < DCM_PREAMBLELENGTH + 4) && knownLength) {
06242         if (debug)
06243             (void) DCM_DumpElements((DCM_OBJECT **) object, 0);
06244         (void) DCM_CloseObject((DCM_OBJECT **) object);
06245         return COND_PushCondition(DCM_ILLEGALSTREAMLENGTH,
06246                                 DCM_Message(DCM_ILLEGALSTREAMLENGTH), *size,
06247                                   "readPreamble");
06248     }
06249     if (*ptr == NULL) {
06250         if (fd != -1) {
06251             nBytes = read(fd, (*object)->preamble, DCM_PREAMBLELENGTH);
06252             nBytes += read(fd, label, sizeof(label));
06253         } else {
06254             cond = (*object)->rd((*object)->userCtx, (*object)->preamble,
06255                                  DCM_PREAMBLELENGTH, &nBytes);
06256             cond = (*object)->rd((*object)->userCtx, label,
06257                                  sizeof(label), &tmp);
06258             nBytes += tmp;
06259         }
06260 
06261         if (nBytes != DCM_PREAMBLELENGTH + sizeof(label))
06262             return COND_PushCondition(DCM_FILEACCESSERROR,
06263                                       DCM_Message(DCM_FILEACCESSERROR), name,
06264                                       "readPreamble");
06265     } else {
06266         (void) memcpy((*object)->preamble, *ptr, DCM_PREAMBLELENGTH);
06267         (void) memcpy(label, (*ptr) + DCM_PREAMBLELENGTH, sizeof(label));
06268     }
06269 
06270     if (knownLength)
06271         *size -= DCM_PREAMBLELENGTH + sizeof(label);
06272     *fileOffset += (off_t) DCM_PREAMBLELENGTH + sizeof(label);
06273     if (*ptr != NULL)
06274         *ptr += DCM_PREAMBLELENGTH + sizeof(label);
06275     (*object)->objectSize += DCM_PREAMBLELENGTH + sizeof(label);
06276 
06277     if (strncmp(label, "DICM", 4) != 0)
06278         return 0;
06279 
06280     (*object)->preambleFlag = TRUE;
06281     return DCM_NORMAL;
06282 }

CONDITION readSequence const char *    name,
unsigned char **    ptr,
int    fd,
U32   size,
off_t *    fileOffset,
int    recursionLevel,
unsigned long    opt,
int    byteOrder,
CTNBOOLEAN    explicitVR,
CTNBOOLEAN    acceptVRMismatch,
CTNBOOLEAN    fileFlag,
CTNBOOLEAN   remainOpenFlag,
CTNBOOLEAN    convertFlag,
PRIVATE_OBJECT **    object,
U32   scannedLength,
DCM_ELEMENT   e,
PRV_ELEMENT_ITEM **    elementItem
[static]
 

Definition at line 6547 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), CONDITION, CTN_MALLOC, CTNBOOLEAN, DCM_DLMITEM, DCM_LISTFAILURE, DCM_MALLOCFAILURE, DCM_Message(), DCM_NORMAL, DCM_OBJECT, DCM_STREAMCOMPLETE, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_UNSPECIFIEDLENGTH, fd, DCM_ELEMENT::length, LST_Create(), LST_Enqueue(), LST_NORMAL, name, newElementItem(), DCM_SEQUENCE_ITEM::object, object, readFile1(), readGroupElement(), readVRLength(), DCM_ELEMENT::tag, U32, and PRIVATE_OBJECT::userCtx.

Referenced by readFile1().

06554 {
06555     CTNBOOLEAN knownLength = TRUE;
06556     CONDITION cond;
06557     U32 sequenceLength;
06558 
06559     U32 localLength;
06560     CTNBOOLEAN sequenceDone;
06561     DCM_ELEMENT tagE;
06562     DCM_OBJECT
06563         * sequenceObject;
06564     DCM_SEQUENCE_ITEM *sequenceItem;
06565     CONDITION flag;
06566     unsigned char *localPtr;
06567     off_t itemTagOffset;
06568 
06569     if (*size == (long) DCM_UNSPECIFIEDLENGTH)
06570         knownLength = FALSE;
06571 
06572     cond = newElementItem(e, FALSE, elementItem);
06573     if (cond != DCM_NORMAL)
06574         return cond;
06575     (*elementItem)->element.d.sq = LST_Create();
06576     if ((*elementItem)->element.d.sq == NULL)
06577         return COND_PushCondition(DCM_LISTFAILURE,
06578                               DCM_Message(DCM_LISTFAILURE), "readSequence");
06579 
06580     localLength = (*elementItem)->element.length;
06581     sequenceDone = (localLength == 0);
06582 
06583     while (!sequenceDone) {
06584         if (debug)
06585             fprintf(stderr, "Sequence Length: %d %x\n", localLength,
06586                     localLength);
06587 
06588         sequenceLength = 0;
06589         itemTagOffset = *fileOffset;
06590 
06591         flag = readGroupElement(name, ptr, fd, &localLength, fileOffset, knownLength,
06592                                 byteOrder, explicitVR, acceptVRMismatch, object, &sequenceLength, &tagE);
06593         if (flag == DCM_STREAMCOMPLETE)
06594             break;
06595         else if (flag != DCM_NORMAL)
06596             return flag;
06597 
06598         flag = readVRLength(name, ptr, fd, &localLength, fileOffset, knownLength,
06599                             byteOrder, explicitVR, acceptVRMismatch, object,
06600                             &sequenceLength, &tagE);
06601         if (flag != DCM_NORMAL)
06602             return flag;
06603 
06604         if (*size != (long) DCM_UNSPECIFIEDLENGTH)
06605             *size -= sequenceLength;
06606         if (scannedLength != NULL)
06607             *scannedLength += sequenceLength;
06608 
06609         sequenceLength = 0;
06610 
06611 
06612         if (debug)
06613             fprintf(stderr, "Sequence item: %4x %4x %d (%x)\n",
06614                     DCM_TAG_GROUP(tagE.tag),
06615                     DCM_TAG_ELEMENT(tagE.tag), tagE.length, tagE.length);
06616         if (tagE.tag == DCM_DLMITEM) {
06617             localPtr = *ptr;
06618             cond = readFile1(name,
06619                              localPtr,
06620                              fd, tagE.length,
06621                              fileOffset, recursionLevel + 1, opt,
06622                              object, &sequenceObject, &sequenceLength,
06623                           remainOpenFlag, (*object)->userCtx, (*object)->rd,
06624                              (*object)->sk);
06625             *ptr = localPtr;
06626             if (cond == DCM_NORMAL) {
06627                 sequenceItem = CTN_MALLOC(sizeof(*sequenceItem));
06628                 if (sequenceItem == NULL)
06629                     return COND_PushCondition(DCM_MALLOCFAILURE,
06630                                               DCM_Message(DCM_MALLOCFAILURE),
06631                                          sizeof(*sequenceItem), "readFile");
06632 
06633                 ((PRIVATE_OBJECT *) sequenceObject)->offset = itemTagOffset;
06634                 sequenceItem->object = sequenceObject;
06635                 cond = LST_Enqueue(&(*elementItem)->element.d.sq,
06636                                    (void *)sequenceItem);
06637                 if (cond != LST_NORMAL)
06638                     return COND_PushCondition(DCM_LISTFAILURE,
06639                                   DCM_Message(DCM_LISTFAILURE), "readFile");
06640                 if (*size != (long) DCM_UNSPECIFIEDLENGTH)
06641                     *size -= sequenceLength;
06642                 if (scannedLength != NULL)
06643                     *scannedLength += sequenceLength;
06644                 (*object)->objectSize += sequenceLength;
06645                 if (localLength != DCM_UNSPECIFIEDLENGTH)
06646                     localLength -= sequenceLength;
06647             } else
06648                 return cond;
06649         } else {
06650             sequenceDone = TRUE;
06651         }
06652         if (localLength == 0)
06653             sequenceDone = TRUE;
06654     }
06655     return DCM_NORMAL;
06656 }

CONDITION readVRLength const char *    name,
unsigned char **    ptr,
int    fd,
U32   size,
off_t *    fileOffset,
CTNBOOLEAN    knownLength,
int    byteOrder,
CTNBOOLEAN    explicitVR,
CTNBOOLEAN    acceptVRMismatch,
PRIVATE_OBJECT **    object,
U32   scannedLength,
DCM_ELEMENT   e
[static]
 

Definition at line 6358 of file l_mri_dicom_hdr.c.

References BYTEORDER_SAME, COND_PushCondition(), CONDITION, CTNBOOLEAN, DCM_CloseObject(), DCM_CTX, DCM_DLM, DCM_DumpElements(), DCM_ELEMENTLENGTHERROR, DCM_FILEACCESSERROR, DCM_ILLEGALSTREAMLENGTH, DCM_Message(), DCM_NORMAL, DCM_OB, DCM_OBJECT, DCM_OW, DCM_PXLPIXELDATA, DCM_RET, DCM_SQ, DCM_STREAMCOMPLETE, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_UN, DCM_UNEVENELEMENTLENGTH, DCM_UNRECOGNIZEDVRCODE, DCM_UNSPECIFIEDLENGTH, DCM_UT, DCM_VRMISMATCH, DCM_ELEMENT::description, ENTRY, fd, GET_LONG_REVERSE_ORDER, GET_LONG_SAME_ORDER, GET_SHORT_REVERSE_ORDER, GET_SHORT_SAME_ORDER, DCM_ELEMENT::length, lookupVRCode(), mapVRtoASCII(), name, object, read(), VRMAP::representation, DCM_ELEMENT::representation, RETURN, rwc_err, STATUS, DCM_ELEMENT::tag, and U32.

Referenced by DCM_GetCompressedValue(), readFile1(), readSequence(), and scanCompressedPixels().

06363 {
06364     unsigned char *localPtr;
06365     unsigned char buf[4];
06366     char vrCode[3];
06367     VRMAP *vrPtr;
06368     int nBytes;
06369     CONDITION cond;
06370     CTNBOOLEAN calculatedLength = FALSE;
06371 
06372 ENTRY("readVRLength") ;
06373 
06374     if (*size == 0)
06375         RETURN( DCM_STREAMCOMPLETE );
06376 
06377     if ((*size < 4) && knownLength) {
06378         if (debug)
06379             (void) DCM_DumpElements((DCM_OBJECT **) object, 0);
06380         (void) DCM_CloseObject((DCM_OBJECT **) object);
06381         RETURN( COND_PushCondition(DCM_ILLEGALSTREAMLENGTH,
06382                                 DCM_Message(DCM_ILLEGALSTREAMLENGTH), *size,
06383                                   "readVRLength") );
06384     }
06385     if (*ptr == NULL) {
06386         if (fd != -1) {
06387             nBytes = read(fd, buf, 4);
06388         } else {
06389             cond = (*object)->rd((*object)->userCtx, buf, 4, &nBytes);
06390         }
06391 
06392         if (nBytes != 4)
06393             RETURN( COND_PushCondition(DCM_FILEACCESSERROR,
06394                                       DCM_Message(DCM_FILEACCESSERROR), name,
06395                                       "readVRLength") ) ;
06396         localPtr = buf;
06397     } else
06398         localPtr = *ptr;
06399 
06400     if (knownLength)
06401         *size -= 4;
06402     *fileOffset += (off_t) 4;
06403     if (scannedLength != NULL)
06404         (*scannedLength) += 4;
06405     (*object)->objectSize += 4;
06406 
06407     e->length = 0;
06408     if (e->representation == DCM_DLM) {
06409         explicitVR = FALSE;     /* Special rule for delimitors */
06410     }
06411     if (explicitVR) {
06412         vrCode[0] = buf[0];
06413         vrCode[1] = buf[1];
06414         vrCode[2] = '\0';
06415         vrPtr = lookupVRCode(vrCode);
06416         if (vrPtr == NULL){
06417             if( rwc_err ){
06418              fprintf(stderr,"** DICOM ERROR: unknown VR code %s in element (%04x,%04x)\n",  /* RWC */
06419                      vrCode,DCM_TAG_GROUP(e->tag), DCM_TAG_ELEMENT(e->tag) ) ; rwc_err-- ;
06420             }
06421             RETURN( COND_PushCondition(DCM_UNRECOGNIZEDVRCODE,
06422                                 DCM_Message(DCM_UNRECOGNIZEDVRCODE), vrCode,
06423                                       "readVRLength") );
06424         }
06425 
06426         if (vrPtr->representation != e->representation) {
06427             if (vrPtr->representation == DCM_OB) {
06428                 /* This is probably from the waveform supplement where they */
06429                 /* transmit as OB and expect us to pull it out later */
06430                 /* We will just keep our VR which was based on context in */
06431                 /* the object */
06432                 e->representation = vrPtr->representation;
06433             } else if (e->representation == DCM_UN ||
06434                        e->representation == DCM_CTX ||
06435                        e->representation == DCM_RET ||
06436                        vrPtr->representation == DCM_OW ||
06437                        acceptVRMismatch) {      /* Believe input */
06438                 e->representation = vrPtr->representation;
06439             } else {
06440 #if 0
06441                 if (e->tag != DCM_PXLPIXELDATA){
06442                     STATUS("VR mismatch") ;
06443                     RETURN( COND_PushCondition(DCM_VRMISMATCH,
06444                                DCM_Message(DCM_VRMISMATCH), vrCode, e->tag));
06445                 }
06446 #else
06447                if( rwc_err ){
06448                 fprintf(stderr,"++ DICOM WARNING: VR mismatch in element (%04x,%04x)\n",  /* RWC */
06449                         DCM_TAG_GROUP(e->tag), DCM_TAG_ELEMENT(e->tag) ) ; rwc_err-- ;
06450                }
06451                e->representation = vrPtr->representation;
06452 #endif
06453             }
06454         }
06455         if (vrPtr->representation != DCM_OW &&
06456             vrPtr->representation != DCM_OB &&
06457             vrPtr->representation != DCM_UN &&
06458             vrPtr->representation != DCM_UT &&
06459             vrPtr->representation != DCM_SQ) {
06460             unsigned short shortLength;
06461             if (byteOrder == BYTEORDER_SAME) {
06462                 GET_SHORT_SAME_ORDER(localPtr + 2, shortLength);
06463             } else {
06464                 GET_SHORT_REVERSE_ORDER(localPtr + 2, shortLength);
06465             }
06466             e->length = shortLength;
06467             if (*ptr != NULL)
06468                 *ptr += 4;
06469             calculatedLength = TRUE;
06470         } else {
06471             if ((*size < 4) && knownLength) {
06472                 if (debug)
06473                     (void) DCM_DumpElements((DCM_OBJECT **) object, 0);
06474                 (void) DCM_CloseObject((DCM_OBJECT **) object);
06475                 RETURN( COND_PushCondition(DCM_ILLEGALSTREAMLENGTH,
06476                                 DCM_Message(DCM_ILLEGALSTREAMLENGTH), *size,
06477                                           "readVRLength"));
06478             }
06479             if (*ptr == NULL) {
06480                 if (fd != -1) {
06481                     nBytes = read(fd, buf, 4);
06482                 } else {
06483                     cond = (*object)->rd((*object)->userCtx, buf, 4, &nBytes);
06484                 }
06485 
06486                 if (nBytes != 4)
06487                     RETURN( COND_PushCondition(DCM_FILEACCESSERROR,
06488                                      DCM_Message(DCM_FILEACCESSERROR), name,
06489                                               "readVRLength"));
06490                 localPtr = buf;
06491             } else
06492                 localPtr = *ptr;
06493 
06494             if (knownLength)
06495                 *size -= 4;
06496             *fileOffset += (off_t) 4;
06497             if (scannedLength != NULL)
06498                 (*scannedLength) += 4;
06499             (*object)->objectSize += 4;
06500         }
06501     }
06502     if (!calculatedLength) {
06503         if (byteOrder == BYTEORDER_SAME) {
06504             GET_LONG_SAME_ORDER(localPtr, e->length);
06505         } else {
06506             GET_LONG_REVERSE_ORDER(localPtr, e->length);
06507         }
06508         if (*ptr != NULL)
06509             *ptr += 4;
06510     }
06511     if (debug) {
06512         char localVR[10];
06513         mapVRtoASCII(e->representation, localVR);
06514         fprintf(stderr, "%2s %6d %06x %s\n", localVR, e->length,
06515                 (unsigned int)*fileOffset, e->description);
06516     }
06517     if (((e->length & 1) != 0) && (e->length != DCM_UNSPECIFIEDLENGTH)) {
06518         if (debug)
06519             (void) DCM_DumpElements((DCM_OBJECT **) object, 0);
06520         (void) DCM_CloseObject((DCM_OBJECT **) object);
06521         if( rwc_err ){
06522          fprintf(stderr,"** DICOM ERROR: illegal odd length=%d in element (%04x,%04x)\n",  /* RWC */
06523                  e->length,DCM_TAG_GROUP(e->tag), DCM_TAG_ELEMENT(e->tag) ) ; rwc_err-- ;
06524         }
06525         RETURN( COND_PushCondition(DCM_UNEVENELEMENTLENGTH,
06526                                   DCM_Message(DCM_UNEVENELEMENTLENGTH),
06527                              DCM_TAG_GROUP(e->tag), DCM_TAG_ELEMENT(e->tag),
06528                                   e->length, "readFile"));
06529     }
06530     if ((e->length != (U32) DCM_UNSPECIFIEDLENGTH) && (e->length > (U32) (*size))) {
06531         if (debug)
06532             (void) DCM_DumpElements((DCM_OBJECT **) object, 0);
06533         (void) DCM_CloseObject((DCM_OBJECT **) object);
06534         if( rwc_err ){
06535          fprintf(stderr,"** DICOM ERROR: oversize length=%d in element (%04x,%04x)\n",  /* RWC */
06536                  e->length,DCM_TAG_GROUP(e->tag), DCM_TAG_ELEMENT(e->tag) ) ; rwc_err-- ;
06537         }
06538         RETURN( COND_PushCondition(DCM_ELEMENTLENGTHERROR,
06539                                   DCM_Message(DCM_ELEMENTLENGTHERROR),
06540                              DCM_TAG_GROUP(e->tag), DCM_TAG_ELEMENT(e->tag),
06541                                   e->length, *size, "readFile"));
06542     }
06543     RETURN( DCM_NORMAL);
06544 }

void remapFileName const char *    name,
char *    mapName
[static]
 

Definition at line 7641 of file l_mri_dicom_hdr.c.

References c, and name.

Referenced by DCM_OpenFile().

07642 {
07643     char c;
07644 
07645     while ((c = *name++) != '\0') {
07646         if (c == '\\')
07647             *mapName++ = '/';
07648         else if (isupper(c))
07649             *mapName++ = tolower(c);
07650         else
07651             *mapName++ = c;
07652     }
07653     *mapName = '\0';
07654 }

void RWC_clear_pbuf void    [static]
 

Definition at line 115 of file l_mri_dicom_hdr.c.

References free, npbuf, and pbuf.

00116 {
00117    if( pbuf != NULL ){ free(pbuf); pbuf = NULL; npbuf = 0; }
00118 }

int RWC_printf char *    fmt,
...   
[static]
 

Definition at line 120 of file l_mri_dicom_hdr.c.

References AFMALL, AFREALL, npbuf, NPBUF, and pbuf.

Referenced by DCM_DumpElements(), DCM_DumpVector(), DCM_FormatElements(), DCM_PrintSequenceList(), dumpOB(), dumpSL(), dumpSS(), dumpUL(), dumpUS(), exportEncapsulatedPixels(), and mri_dicom_header().

00121 {
00122    static char *sbuf = NULL ;
00123    int nsbuf , nn , lpbuf ;
00124    va_list vararg_ptr ;
00125 
00126    va_start( vararg_ptr , fmt ) ;
00127 
00128    if( sbuf == NULL ) sbuf = AFMALL( char, NPBUF) ;  /* 1st time in */
00129 
00130    sbuf[0] = '\0' ;
00131    nn = vsprintf( sbuf , fmt , vararg_ptr ) ;
00132    va_end( vararg_ptr ) ;
00133    nsbuf = strlen(sbuf) ;
00134    if( nsbuf == 0 ) return(0);
00135 
00136    if( npbuf == 0 ){
00137      pbuf = AFMALL(char,NPBUF) ; npbuf = NPBUF ; pbuf[0] = '\0' ;
00138    }
00139 
00140    lpbuf = strlen(pbuf) ;
00141    if( lpbuf+nsbuf+8 > npbuf ){
00142      npbuf += NPBUF; pbuf = AFREALL( pbuf, char, npbuf);
00143    }
00144 
00145    strcat(pbuf,sbuf) ;
00146    return(nn);
00147 }

void RWC_set_endianosity void    [static]
 

Definition at line 87 of file l_mri_dicom_hdr.c.

References BIG_ORDER, BYTEORDER_REVERSE, BYTEORDER_SAME, LITTLE_ENDIAN_ARCHITECTURE, and LITTLE_ORDER.

00088 {
00089    union { unsigned char bb[2] ;
00090            short         ss    ; } fred ;
00091 
00092    if( LITTLE_ENDIAN_ARCHITECTURE < 0 ){
00093      fred.bb[0] = 1 ; fred.bb[1] = 0 ;
00094 
00095      LITTLE_ENDIAN_ARCHITECTURE = (fred.ss == 1) ;
00096 
00097      if( LITTLE_ENDIAN_ARCHITECTURE ){
00098        LITTLE_ORDER = BYTEORDER_SAME ;
00099        BIG_ORDER    = BYTEORDER_REVERSE ;
00100      } else {
00101        BIG_ORDER    = BYTEORDER_SAME ;
00102        LITTLE_ORDER = BYTEORDER_REVERSE ;
00103      }
00104    }
00105 }

CONDITION scanCompressedPixels char *    name,
unsigned char **    ptr,
int    fd,
U32   size,
off_t *    fileOffset,
int    recursionLevel,
unsigned long    opt,
int    byteOrder,
CTNBOOLEAN    explicitVR,
CTNBOOLEAN    acceptVRMismatch,
CTNBOOLEAN    fileFlag,
CTNBOOLEAN   remainOpenFlag,
CTNBOOLEAN    convertFlag,
PRIVATE_OBJECT **    object,
U32   scannedLength,
DCM_ELEMENT   e,
PRV_ELEMENT_ITEM **    elementItem
[static]
 

Definition at line 6659 of file l_mri_dicom_hdr.c.

References CONDITION, CTNBOOLEAN, DCM_DLMITEM, DCM_NORMAL, DCM_STREAMCOMPLETE, DCM_TAG_ELEMENT, DCM_TAG_GROUP, DCM_UNSPECIFIEDLENGTH, fd, DCM_ELEMENT::length, name, object, readGroupElement(), readVRLength(), DCM_ELEMENT::tag, and U32.

Referenced by readData().

06667 {
06668     CTNBOOLEAN knownLength = TRUE;
06669     U32 sequenceLength;
06670     U32 scannedBytes = 0;
06671 
06672     U32 localLength;
06673     CTNBOOLEAN sequenceDone;
06674     DCM_ELEMENT tagE;
06675     CONDITION flag;
06676     unsigned char *localPtr;
06677 
06678     if (*size == (long) DCM_UNSPECIFIEDLENGTH)
06679         knownLength = FALSE;
06680 
06681     localLength = (*elementItem)->element.length;
06682     sequenceDone = (localLength == 0);
06683 
06684     while (!sequenceDone) {
06685         sequenceLength = 0;
06686         flag = readGroupElement(name, ptr, fd, &localLength, fileOffset,
06687                              FALSE, byteOrder, explicitVR, acceptVRMismatch,
06688                                 object, &sequenceLength, &tagE);
06689         if (flag == DCM_STREAMCOMPLETE)
06690             break;
06691         else if (flag != DCM_NORMAL)
06692             return flag;
06693 
06694         flag = readVRLength(name, ptr, fd, &localLength, fileOffset, knownLength,
06695                             byteOrder, explicitVR, acceptVRMismatch, object,
06696                             &sequenceLength, &tagE);
06697         if (flag != DCM_NORMAL)
06698             return flag;
06699 
06700         if (*size != (long) DCM_UNSPECIFIEDLENGTH)
06701             *size -= sequenceLength;
06702         if (scannedLength != NULL)
06703             *scannedLength += sequenceLength;
06704         scannedBytes += sequenceLength;
06705 
06706         if (debug)
06707             fprintf(stderr, "Sequence item: %4x %4x %d (%x)\n",
06708                     DCM_TAG_GROUP(tagE.tag),
06709                     DCM_TAG_ELEMENT(tagE.tag), tagE.length, tagE.length);
06710         if (tagE.tag == DCM_DLMITEM) {
06711             localPtr = *ptr;
06712             if (tagE.length != 0) {
06713                 lseek(fd, tagE.length, SEEK_CUR);
06714                 *fileOffset += tagE.length;
06715                 if (*size != (long) DCM_UNSPECIFIEDLENGTH)
06716                     *size -= tagE.length;
06717                 if (scannedLength != NULL)
06718                     *scannedLength += tagE.length;
06719             }
06720         } else {
06721             sequenceDone = TRUE;
06722         }
06723         if (localLength == 0)
06724             sequenceDone = TRUE;
06725 
06726         if (debug)
06727             fprintf(stderr, "Scanned Bytes: %d\n", scannedBytes);
06728     }
06729     if ((scannedBytes & 1) != 0) {
06730         lseek(fd, 1, SEEK_CUR);
06731         *fileOffset += 1;
06732         if (*size != (long) DCM_UNSPECIFIEDLENGTH)
06733             *size -= 1;
06734     }
06735     return DCM_NORMAL;
06736 }

CONDITION setFileOptions DCM_OBJECT **    obj,
unsigned long *    opt
[static]
 

Definition at line 5060 of file l_mri_dicom_hdr.c.

References CONDITION, DCM_ELEMENT::d, DCM_ENCAPSULATEDPIXELS, DCM_EXPLICITBIGENDIAN, DCM_EXPLICITLITTLEENDIAN, DCM_METATRANSFERSYNTAX, DCM_NORMAL, DCM_OBJECT, DCM_ORDERLITTLEENDIAN, DCM_ParseObject(), DCM_UI, DICOM_TRANSFERBIGENDIANEXPLICIT, DICOM_TRANSFERLITTLEENDIAN, DICOM_TRANSFERLITTLEENDIANEXPLICIT, and DICOM_UI_LENGTH.

Referenced by exportStream().

05061 {
05062     CONDITION cond;
05063     char xferSyntax[DICOM_UI_LENGTH + 1];
05064     DCM_ELEMENT e = {DCM_METATRANSFERSYNTAX, DCM_UI, "", 1, sizeof(xferSyntax),
05065     NULL};
05066 
05067     e.d.string = xferSyntax;
05068     cond = DCM_ParseObject(obj, &e, 1, NULL, 0, NULL);
05069     if (cond != DCM_NORMAL)
05070         return cond;
05071 
05072     *opt = 0;
05073     if (strcmp(xferSyntax, DICOM_TRANSFERLITTLEENDIAN) == 0) {
05074         *opt = DCM_ORDERLITTLEENDIAN;
05075     } else if (strcmp(xferSyntax, DICOM_TRANSFERLITTLEENDIANEXPLICIT) == 0) {
05076         *opt = DCM_EXPLICITLITTLEENDIAN;
05077     } else if (strcmp(xferSyntax, DICOM_TRANSFERBIGENDIANEXPLICIT) == 0) {
05078         *opt = DCM_EXPLICITBIGENDIAN;
05079     } else {    /* Must be an encapsulated xfer syntax */
05080         *opt = DCM_ENCAPSULATEDPIXELS;
05081     }
05082 
05083     return DCM_NORMAL;
05084 }

void swapATGroupElement DCM_ELEMENT   e [static]
 

Definition at line 7484 of file l_mri_dicom_hdr.c.

References DCM_ELEMENT::d, DCM_ELEMENT::length, and U32.

Referenced by copyData(), DCM_GetElementValue(), DCM_GetElementValueOffset(), exportData(), readData(), and readFile().

07485 {
07486     U32
07487     length;
07488     unsigned short
07489         tmp,
07490        *us;
07491 
07492     length = e->length;
07493     us = e->d.us;
07494     while (length >= 4) {
07495         tmp = us[0];
07496         us[0] = us[1];
07497         us[1] = tmp;
07498         us += 2;
07499         length -= 4;
07500     }
07501 }

void swapInPlace PRIVATE_OBJECT **    object,
DCM_ELEMENT   e
[static]
 

Definition at line 4925 of file l_mri_dicom_hdr.c.

References DCM_ELEMENT::d, DCM_AT, DCM_OW, DCM_PXLPIXELDATA, DCM_SL, DCM_SS, DCM_UL, DCM_US, DCM_ELEMENT::length, object, DCM_ELEMENT::representation, DCM_ELEMENT::tag, and U32.

Referenced by copyData(), DCM_GetCompressedValue(), DCM_GetElementValue(), DCM_GetElementValueOffset(), exportData(), readData(), and readFile().

04926 {
04927     U32
04928     length;
04929     unsigned char
04930         tmp,
04931        *p1;
04932 
04933     length = e->length;
04934     p1 = e->d.ot;
04935     if (e->representation == DCM_US || e->representation == DCM_SS ||
04936         e->representation == DCM_OW || e->representation == DCM_AT) {
04937         if (e->tag == DCM_PXLPIXELDATA &&
04938             (*object)->pixelBitsAllocated != 16)
04939             return;
04940 
04941         while (length > 0) {
04942             tmp = p1[0];
04943             p1[0] = p1[1];
04944             p1[1] = tmp;
04945             p1 += 2;
04946             length -= 2;
04947         }
04948     } else if (e->representation == DCM_UL || e->representation == DCM_SL) {
04949         while (length > 0) {
04950             tmp = p1[0];
04951             p1[0] = p1[3];
04952             p1[3] = tmp;
04953             tmp = p1[1];
04954             p1[1] = p1[2];
04955             p1[2] = tmp;
04956             length -= 4;
04957             p1 += 4;
04958         }
04959     }
04960 }

CONDITION updateObjectType PRIVATE_OBJECT **    object,
DCM_ELEMENT   element
[static]
 

Definition at line 4041 of file l_mri_dicom_hdr.c.

References DCM_GROUPCOMMAND, DCM_NORMAL, DCM_OBJECTCOMMAND, DCM_OBJECTELEMENTLIST, DCM_OBJECTIMAGE, DCM_OBJECTUNKNOWN, DCM_TAG_GROUP, object, and DCM_ELEMENT::tag.

Referenced by DCM_AddElement(), DCM_AddSequenceElement(), readFile(), and readFile1().

04042 {
04043     switch ((*object)->objectType) {
04044         case DCM_OBJECTUNKNOWN:
04045         if (DCM_TAG_GROUP(element->tag) == DCM_GROUPCOMMAND)
04046             (*object)->objectType = DCM_OBJECTCOMMAND;
04047         else
04048             (*object)->objectType = DCM_OBJECTELEMENTLIST;
04049         break;
04050     case DCM_OBJECTCOMMAND:
04051         if (DCM_TAG_GROUP(element->tag) != DCM_GROUPCOMMAND)
04052             (*object)->objectType = DCM_OBJECTELEMENTLIST;
04053         break;
04054     case DCM_OBJECTELEMENTLIST:
04055     case DCM_OBJECTIMAGE:
04056         break;
04057     default:
04058         break;
04059     }
04060     return DCM_NORMAL;
04061 }

CONDITION updateSpecialElements PRIVATE_OBJECT **    object,
PRV_ELEMENT_ITEM   item
[static]
 

Definition at line 4084 of file l_mri_dicom_hdr.c.

References DCM_ELEMENT::d, DCM_EXPLICITBIGENDIAN, DCM_EXPLICITLITTLEENDIAN, DCM_IMGBITSALLOCATED, DCM_IMGPIXELREPRESENTATION, DCM_MAKETAG, DCM_METAGROUPLENGTH, DCM_METATRANSFERSYNTAX, DCM_NORMAL, DCM_ORDERLITTLEENDIAN, DICOM_TRANSFERBIGENDIANEXPLICIT, DICOM_TRANSFERLITTLEENDIAN, DICOM_TRANSFERLITTLEENDIANEXPLICIT, PRV_ELEMENT_ITEM::element, idx, DCM_ELEMENT::length, object, and DCM_ELEMENT::tag.

Referenced by insertNewElement(), insertThisElementItem(), readFile(), and readFile1().

04086 {
04087     int idx;
04088 
04089     switch (item->element.tag) {
04090     case DCM_IMGBITSALLOCATED:
04091         (*object)->pixelBitsAllocated = *item->element.d.us;
04092         break;
04093     case DCM_IMGPIXELREPRESENTATION:
04094         (*object)->pixelRepresentation = *item->element.d.us;
04095         break;
04096     case DCM_METAGROUPLENGTH:
04097         (*object)->metaHeaderLength = *item->element.d.ul;
04098         break;
04099     case DCM_METATRANSFERSYNTAX:
04100         if (strcmp(item->element.d.string, DICOM_TRANSFERLITTLEENDIAN) == 0) {
04101             (*object)->dataOptions = DCM_ORDERLITTLEENDIAN;
04102         } else if (strcmp(item->element.d.string, DICOM_TRANSFERLITTLEENDIANEXPLICIT) == 0) {
04103             (*object)->dataOptions = DCM_EXPLICITLITTLEENDIAN;
04104         } else if (strcmp(item->element.d.string, DICOM_TRANSFERBIGENDIANEXPLICIT) == 0) {
04105             (*object)->dataOptions = DCM_EXPLICITBIGENDIAN;
04106         } else {        /* Must be an encapsulated transfer syntax */
04107             (*object)->dataOptions = DCM_EXPLICITLITTLEENDIAN;
04108         }
04109         break;
04110     case DCM_MAKETAG(0x003a, 0x0103):
04111         strncpy((*object)->waveformDataVR, item->element.d.string,
04112                 item->element.length);
04113         (*object)->waveformDataVR[item->element.length] = '\0';
04114         idx = item->element.length - 1;
04115         while (idx >= 0 && (*object)->waveformDataVR[idx] == ' ') {
04116             (*object)->waveformDataVR[idx] = '\0';
04117             idx--;
04118         }
04119         break;
04120     default:
04121         break;
04122     }
04123     return DCM_NORMAL;
04124 }

long UTL_ConvertDatetoLong const char *    date
 

Definition at line 11483 of file l_mri_dicom_hdr.c.

Referenced by UTL_DateMatch().

11484 {
11485 
11486     char
11487         year[5],
11488         month[3],
11489         day[3];
11490 
11491     strncpy(year, date, 4);
11492     year[4] = '\000';
11493     strncpy(month, date + 4, 2);
11494     month[2] = '\000';
11495     strncpy(day, date + 6, 2);
11496     day[2] = '\000';
11497 
11498     return ((atol(year) * 10000) + (atol(month) * 100) + atol(day));
11499 }

void UTL_ConvertFloattoTime double    dt,
char *    time
 

Definition at line 11608 of file l_mri_dicom_hdr.c.

References dt.

11609 {
11610     int
11611         hour,
11612         minute,
11613         second,
11614         fracsec;
11615 
11616     hour = (int) (dt / 3600.0);
11617     dt -= (hour * 3600);
11618 
11619     minute = (int) (dt / 60.);
11620     dt -= (minute * 60);
11621 
11622     second = (int) dt;
11623     dt -= second;
11624 
11625     fracsec = (int) ((dt * 1000000) + 0.5);
11626 
11627     sprintf(time, "%02d%02d%02d.%06d", hour, minute, second, fracsec);
11628 
11629     return;
11630 }

void UTL_ConvertLongtoDate long    ld,
char *    date
 

Definition at line 11505 of file l_mri_dicom_hdr.c.

11506 {
11507 
11508     int
11509         year,
11510         month,
11511         day;
11512 
11513     year = ld / 10000;
11514     ld -= (year * 10000);
11515     month = ld / 100;
11516     ld -= (month * 100);
11517     day = ld;
11518 
11519     sprintf(date, "%04d%02d%02d", year, month, day);
11520 
11521     return;
11522 }

double UTL_ConvertTimetoFloat const char *    time
 

Definition at line 11528 of file l_mri_dicom_hdr.c.

References i, and p.

Referenced by UTL_TimeMatch().

11529 {
11530 
11531     size_t
11532     i;
11533     char
11534         hour[3],
11535         minute[3],
11536         second[3],
11537         fracsec[7];
11538     const char *p;
11539     double
11540         divisor,
11541         hh,
11542         mm,
11543         ss,
11544         fs;
11545 
11546     hh = mm = ss = fs = 0.0;
11547     hour[0] = minute[0] = second[0] = fracsec[0] = '\000';
11548 
11549     p = time;
11550     /*
11551      * Just a brute force way to tear down a Dicom time...not very pretty,
11552      * but it works... We are not guaranteed to have every field present as
11553      * we are in the date...
11554      */
11555     hour[0] = *p++;
11556     hour[1] = *p++;
11557     hour[2] = '\000';
11558     if (isdigit(*p)) {
11559         minute[0] = *p++;
11560         minute[1] = *p++;
11561         minute[2] = '\000';
11562         if (isdigit(*p)) {
11563             second[0] = *p++;
11564             second[1] = *p++;
11565             second[2] = '\000';
11566             if (*p == '.') {
11567                 p++;
11568                 fracsec[0] = *p++;
11569                 if ((*p != '\000') && (isdigit(*p))) {
11570                     fracsec[1] = *p++;
11571                     if ((*p != '\000') && (isdigit(*p))) {
11572                         fracsec[2] = *p++;
11573                         if ((*p != '\000') && (isdigit(*p))) {
11574                             fracsec[3] = *p++;
11575                             if ((*p != '\000') && (isdigit(*p))) {
11576                                 fracsec[4] = *p++;
11577                                 if ((*p != '\000') && (isdigit(*p))) {
11578                                     fracsec[5] = *p++;
11579                                     fracsec[6] = '\000';
11580                                 } else
11581                                     fracsec[5] = '\000';
11582                             } else
11583                                 fracsec[4] = '\000';
11584                         } else
11585                             fracsec[3] = '\000';
11586                     } else
11587                         fracsec[2] = '\000';
11588                 } else
11589                     fracsec[1] = '\000';
11590             }
11591         }
11592     }
11593     hh = atof(hour);
11594     mm = atof(minute);
11595     ss = atof(second);
11596     divisor = 1;
11597     for (i = 0; i < strlen(fracsec); i++)
11598         divisor *= 10;
11599     fs = atof(fracsec) / divisor;
11600 
11601     return ((hh * 3600.0) + (mm * 60.0) + ss + fs);
11602 }

CONDITION UTL_DateMatch char *    datestring,
char *    stm
 

Definition at line 11660 of file l_mri_dicom_hdr.c.

References free, malloc, UTL_ConvertDatetoLong(), and UTL_SqueezeBlanks().

11661 {
11662 
11663     int
11664         match;
11665     char
11666        *ndate;
11667     long
11668         start_date,
11669         end_date,
11670         date_in_question;
11671 
11672     if ((ndate = (char *) malloc(strlen(datestring) + 1)) == (char *) NULL)
11673         return (UTL_NOMATCH);
11674 
11675     strcpy(ndate, datestring);
11676     UTL_SqueezeBlanks(ndate);
11677     UTL_SqueezeBlanks(stm);
11678 
11679     match = 0;
11680     if (strchr(ndate, (int) '-') == (char *) NULL) {
11681         if (strcmp(ndate, stm) == 0)
11682             match = 1;
11683     } else {
11684         date_in_question = UTL_ConvertDatetoLong(stm);
11685         if (ndate[0] == '-') {
11686             end_date = UTL_ConvertDatetoLong(ndate + 1);
11687             if (date_in_question <= end_date)
11688                 match = 1;
11689         } else if (ndate[strlen(ndate) - 1] == '-') {
11690             start_date = UTL_ConvertDatetoLong(ndate);
11691             if (date_in_question >= start_date)
11692                 match = 1;
11693         } else {
11694             start_date = UTL_ConvertDatetoLong(ndate);
11695             end_date = UTL_ConvertDatetoLong(strchr(ndate, (int) '-') + 1);
11696             if ((date_in_question >= start_date) &&
11697                 (date_in_question <= end_date))
11698                 match = 1;
11699         }
11700     }
11701     free(ndate);
11702     if (match)
11703         return (UTL_MATCH);
11704     else
11705         return (UTL_NOMATCH);
11706 }

double UTL_DeltaTime void *    timeStamp
 

Definition at line 11827 of file l_mri_dicom_hdr.c.

11828 {
11829     struct timeval timeNow;
11830     UTL_TIMESTRUCTURE *t;
11831     double delta = 0.;
11832 
11833     gettimeofday(&timeNow, NULL);
11834 
11835     t = (UTL_TIMESTRUCTURE *) timeStamp;
11836     if (t == NULL)
11837         return -1.0;
11838 
11839     if (strcmp(t->key, "UTL STAMP") != 0)
11840         return -1.0;
11841 
11842     delta = timeNow.tv_sec - t->t.tv_sec;
11843     delta += (timeNow.tv_usec - t->t.tv_usec) / 1000000.;
11844 
11845     return delta;
11846 }

void UTL_GetDicomDate char *    datestr
 

Definition at line 11763 of file l_mri_dicom_hdr.c.

11764 {
11765 
11766     struct tm
11767        *tf;
11768     time_t
11769         loctime;
11770 
11771     loctime = time((time_t *) NULL);
11772     tf = localtime(&loctime);
11773 
11774     sprintf(datestr, "%04d%02d%02d", (tf->tm_year) + 1900, (tf->tm_mon) + 1, tf->tm_mday);
11775     return;
11776 
11777 }

void UTL_GetDicomTime char *    timestr
 

Definition at line 11783 of file l_mri_dicom_hdr.c.

11784 {
11785 
11786     struct tm
11787        *tf;
11788     time_t
11789         loctime;
11790 
11791     loctime = time((time_t *) NULL);
11792     tf = localtime(&loctime);
11793 
11794     sprintf(timestr, "%02d%02d%02d.%06d", (tf->tm_hour), (tf->tm_min), (tf->tm_sec), 0);
11795     return;
11796 }

void* UTL_GetTimeStamp  
 

Definition at line 11811 of file l_mri_dicom_hdr.c.

References AFMALL, UTL_TIMESTRUCTURE::key, and UTL_TIMESTRUCTURE::t.

11812 {
11813     UTL_TIMESTRUCTURE *t;
11814 
11815     t = AFMALL( UTL_TIMESTRUCTURE, sizeof(*t));
11816     if (t == NULL)
11817         return NULL;
11818 
11819     strcpy(t->key, "UTL STAMP");
11820 
11821     gettimeofday(&t->t, NULL);
11822 
11823     return t;
11824 }

CTNBOOLEAN UTL_IsDirectory const char *    path
 

Definition at line 11954 of file l_mri_dicom_hdr.c.

References CTNBOOLEAN, i, and S_ISDIR.

11955 {
11956     int i;
11957 #ifdef _MSC_VER
11958     struct _stat buf;
11959 #else
11960     struct stat buf;
11961 #endif
11962 
11963     int flag = 0;
11964 
11965 #ifdef _MSC_VER
11966     i = _stat(path, &buf);
11967 #else
11968     i = stat(path, &buf);
11969 #endif
11970 
11971 
11972     if (i == 0) {
11973 #ifdef _MSC_VER
11974         flag = ((buf.st_mode & _S_IFDIR) != 0);
11975 #else
11976         flag = (S_ISDIR(buf.st_mode));
11977 #endif
11978         if (flag)
11979             return TRUE;
11980     }
11981     return FALSE;
11982 }

void UTL_ReleaseTimeStamp void *    timeStamp
 

Definition at line 11849 of file l_mri_dicom_hdr.c.

References free, and UTL_TIMESTRUCTURE::key.

11850 {
11851     UTL_TIMESTRUCTURE *t;
11852 
11853     t = (UTL_TIMESTRUCTURE *) timeStamp;
11854     if (t == NULL)
11855         return;
11856 
11857     if (strcmp(t->key, "UTL STAMP") != 0)
11858         return;
11859 
11860     free(timeStamp);
11861 }

void UTL_SqueezeBlanks char *    s
 

Definition at line 11637 of file l_mri_dicom_hdr.c.

Referenced by UTL_DateMatch(), and UTL_TimeMatch().

11638 {
11639 
11640     char
11641        *t1,
11642        *t2;
11643 
11644     t1 = t2 = s;
11645     while (*t2 != '\000') {
11646         if (*t2 != ' ') {
11647             *t1 = *t2;
11648             t1++;
11649         }
11650         t2++;
11651     }
11652     *t1 = '\000';
11653 
11654     return;
11655 }

CONDITION UTL_TimeMatch char *    timestring,
char *    stm
 

Definition at line 11711 of file l_mri_dicom_hdr.c.

References free, malloc, UTL_ConvertTimetoFloat(), and UTL_SqueezeBlanks().

11712 {
11713 
11714     int
11715         match;
11716     char
11717        *ntime;
11718     double
11719         start_time,
11720         end_time,
11721         time_in_question;
11722 
11723     if ((ntime = (char *) malloc(strlen(timestring) + 2)) == (char *) NULL)
11724         return (UTL_NOMATCH);
11725 
11726     strcpy(ntime, timestring);
11727     UTL_SqueezeBlanks(ntime);
11728     UTL_SqueezeBlanks(stm);
11729 
11730     match = 0;
11731     if (strchr(ntime, (int) '-') == (char *) NULL) {
11732         if (strcmp(ntime, stm) == 0)
11733             match = 1;
11734     } else {
11735         time_in_question = UTL_ConvertTimetoFloat(stm);
11736         if (ntime[0] == '-') {
11737             end_time = UTL_ConvertTimetoFloat(ntime + 1);
11738             if (time_in_question <= end_time)
11739                 match = 1;
11740         } else if (ntime[strlen(ntime) - 1] == '-') {
11741             start_time = UTL_ConvertTimetoFloat(ntime);
11742             if (time_in_question >= start_time)
11743                 match = 1;
11744         } else {
11745             start_time = UTL_ConvertTimetoFloat(ntime);
11746             end_time = UTL_ConvertTimetoFloat(strchr(ntime, (int) '-') + 1);
11747             if ((time_in_question >= start_time) &&
11748                 (time_in_question <= end_time))
11749                 match = 1;
11750         }
11751     }
11752     free(ntime);
11753     if (match)
11754         return (UTL_MATCH);
11755     else
11756         return (UTL_NOMATCH);
11757 }

CONDITION UTL_VerifyCreatePath const char *    path
 

Definition at line 11864 of file l_mri_dicom_hdr.c.

References i, p, S_ISDIR, UTL_FILECREATEFAILED, UTL_NORMAL, and UTL_PATHNOTDIR.

11865 {
11866     int i;
11867 #ifdef _MSC_VER
11868     struct _stat buf;
11869 #else
11870     struct stat buf;
11871 #endif
11872     char
11873        *p,
11874         temp[1024];
11875     int flag = 0;
11876     static int statCount = 0;
11877 
11878 #ifdef _MSC_VER
11879     statCount++;
11880     i = _stat(path, &buf);
11881 #else
11882     i = stat(path, &buf);
11883 #endif
11884 
11885 
11886     if (i == 0) {
11887 #ifdef _MSC_VER
11888         flag = ((buf.st_mode & _S_IFDIR) != 0);
11889 #else
11890         flag = (S_ISDIR(buf.st_mode));
11891 #endif
11892         if (flag)
11893             return UTL_NORMAL;
11894         else
11895             return UTL_PATHNOTDIR;
11896     }
11897     p = temp;
11898 
11899     while (*path != '\0') {
11900         *p++ = *path++;
11901         while (*path != '/' && *path != '\\' && *path != '\0') {
11902 #ifdef _MSC_VER
11903             if (*path == ':') {
11904                 *p++ = *path++;
11905                 if (*path == '\0')      /* We should not get C:\0, but test
11906                                          * it */
11907                     break;
11908             }
11909 #endif
11910             *p++ = *path++;
11911         }
11912 
11913         *p = '\0';
11914 #ifdef _MSC_VER
11915         statCount++;
11916         i = _stat(temp, &buf);
11917 #else
11918         i = stat(temp, &buf);
11919 #endif
11920 
11921         if (i == 0) {
11922 #ifdef _MSC_VER
11923             flag = ((buf.st_mode & _S_IFDIR) != 0);
11924 #else
11925             flag = (S_ISDIR(buf.st_mode));
11926 #endif
11927             if (!flag)
11928                 return UTL_PATHNOTDIR;
11929         } else {
11930 #ifdef _MSC_VER
11931             int e1;
11932             e1 = errno;
11933             memset(&buf, 0, sizeof(buf));
11934             /*fprintf(stderr, "Stat Count = %d\n", statCount);*/
11935             statCount++;
11936             i = _stat(temp, &buf);
11937             e1 = errno;
11938             i = _mkdir(temp);
11939 #else
11940             i = mkdir(temp, 0777);
11941 #endif
11942             if (i != 0) {
11943                 int e1;
11944                 e1 = errno;
11945                 fprintf(stderr, "Stat Count = %d\n", statCount);
11946                 perror(temp);
11947                 return UTL_FILECREATEFAILED;
11948             }
11949         }
11950     }
11951     return UTL_NORMAL;
11952 }

CONDITION verifyFormat PRV_ELEMENT_ITEM   item [static]
 

Definition at line 5529 of file l_mri_dicom_hdr.c.

References CTNBOOLEAN, DCM_ELEMENT::d, DCM_AS, DCM_CS, DCM_DA, DCM_DS, DCM_IS, DCM_LO, DCM_LT, DCM_NORMAL, DCM_PN, DCM_SH, DCM_ST, DCM_TM, DCM_UI, DCM_UT, PRV_ELEMENT_ITEM::element, i, l, DCM_ELEMENT::length, p, PRV_ELEMENT_ITEM::paddedDataLength, and DCM_ELEMENT::representation.

Referenced by readData(), and readFile().

05530 {
05531     int
05532         i,
05533         l;
05534     char
05535        *src,
05536        *dst,
05537        *p;
05538     DCM_ELEMENT
05539         * element;
05540     CTNBOOLEAN
05541         stopFlag = FALSE;
05542 
05543     element = &item->element;
05544     if (element->length > 0) {
05545         switch (element->representation) {
05546         case DCM_DA:
05547             src = dst = element->d.string;
05548             l = (int) element->length;
05549             for (i = 0; i < l; i++) {
05550                 if (isdigit(*src) || (*src == '-') || (*src == '\\')) {
05551                     *dst++ = *src++;
05552                 } else {
05553                     src++;
05554                     element->length--;
05555                 }
05556             }
05557             item->paddedDataLength = element->length;
05558             if (element->length & 1) {
05559                 *dst = ' ';
05560                 item->paddedDataLength++;
05561             }
05562             break;
05563         case DCM_TM:
05564             l = (int) element->length;
05565             src = dst = element->d.string;
05566             for (i = 0; i < l; i++) {
05567                 if (isdigit(*src) || (*src == '.') || (*src == '-') || (*src == '\\')) {
05568                     *dst++ = *src++;
05569                 } else {
05570                     src++;
05571                     element->length--;
05572                 }
05573             }
05574             item->paddedDataLength = element->length;
05575             if (element->length & 1) {
05576                 *dst = ' ';
05577                 item->paddedDataLength++;
05578             }
05579             break;
05580             /*
05581              * Both the leading and trailing spaces are non-significant.
05582              */
05583         case DCM_CS:
05584         case DCM_AS:
05585         case DCM_DS:
05586         case DCM_IS:
05587         case DCM_LO:
05588         case DCM_SH:
05589         case DCM_UT:
05590             l = (int) element->length;
05591             src = dst = element->d.string;
05592             for (i = 0; i < l; i++) {
05593                 if ((*src == ' ') && !stopFlag) {
05594                     src++;
05595                     element->length--;
05596                 } else {
05597                     stopFlag = TRUE;
05598                     *dst++ = *src++;
05599                 }
05600             }
05601             /*
05602              * Right now, dst points to the char follows the last char in the
05603              * string.
05604              */
05605             stopFlag = FALSE;
05606             l = (int) element->length;
05607             p = dst - 1;
05608             for (i = l; (i > 0) && !stopFlag; i--) {
05609                 if ((*p == ' ') && !stopFlag) {
05610                     p--;
05611                     dst--;
05612                     element->length--;
05613                 } else
05614                     stopFlag = TRUE;
05615             }
05616             item->paddedDataLength = element->length;
05617             if (element->length & 1) {
05618                 *dst = ' ';
05619                 item->paddedDataLength++;
05620             }
05621             break;
05622             /*
05623              * The trailing spaces are non-significant.
05624              */
05625         case DCM_LT:
05626         case DCM_ST:
05627             l = (int) element->length;
05628             src = element->d.string + l - 1;
05629             for (i = l; (i > 0) && !stopFlag; i--) {
05630                 if ((*src == ' ') && !stopFlag) {
05631                     src--;
05632                     element->length--;
05633                 } else
05634                     stopFlag = TRUE;
05635             }
05636             item->paddedDataLength = element->length;
05637             if (element->length & 1) {
05638                 *++src = ' ';
05639                 item->paddedDataLength++;
05640             }
05641             break;
05642         case DCM_PN:
05643             /*
05644              * Strip off the trailing spaces.
05645              */
05646             l = (int) element->length;
05647             src = element->d.string + l - 1;
05648             for (i = l; (i > 0) && !stopFlag; i--) {
05649                 if ((*src == ' ') && !stopFlag) {
05650                     src--;
05651                     element->length--;
05652                 } else
05653                     stopFlag = TRUE;
05654             }
05655             /*
05656              * Convert the name to the standard V3 format.
05657              */
05658             src = dst = element->d.string;
05659             l = element->length;
05660             for (i = 0; i < l;) {
05661                 if ((src[i] == ',') || (src[i] == '^')) {
05662                     *dst++ = '^';
05663                     i++;
05664                     while ((i < l) && (src[i] == ' ')) {
05665                         element->length--;
05666                         i++;
05667                     }
05668                 } else {
05669                     *dst++ = src[i++];
05670                 }
05671             }
05672 
05673             item->paddedDataLength = element->length;
05674             if (element->length & 1) {
05675                 *dst = ' ';
05676                 item->paddedDataLength++;
05677             }
05678             break;
05679         case DCM_UI:
05680             if (element->d.string[element->length - 1] == '\0')
05681                 element->length--;
05682             if (element->d.string[element->length - 1] == ' ') {
05683                 element->d.string[element->length - 1] = '\0';
05684                 element->length--;
05685             }
05686             break;
05687         default:
05688             break;
05689         }
05690     }
05691     return DCM_NORMAL;
05692 }

CONDITION writeFile void *    buffer,
U32    length,
int    flag,
void *    fd
[static]
 

Definition at line 5028 of file l_mri_dicom_hdr.c.

References COND_PushCondition(), DCM_FILEIOERROR, DCM_Message(), DCM_NORMAL, fd, strerror(), U32, and write().

Referenced by DCM_WriteFile().

05030 {
05031     int
05032         bytesWritten;
05033     int *fd;
05034 
05035     fd = (int *) fdPtr;
05036 
05037     bytesWritten = write(*fd, buffer, (int) length);
05038     if (bytesWritten != (int) length)
05039         return COND_PushCondition(DCM_FILEIOERROR,
05040                           DCM_Message(DCM_FILEIOERROR), "", strerror(errno),
05041                                   "writeFile");
05042     else
05043         return DCM_NORMAL;
05044 }

Variable Documentation

DCMDICT ACQ_dictionary[] [static]
 

Definition at line 8659 of file l_mri_dicom_hdr.c.

DCMDICT BAB_dictionary[] [static]
 

Initial value:

 {
    {DCM_BABGROUPLENGTH, DCM_UL, "BAB Group Length"},
    {DCM_BABANNOTATIONPOSITION, DCM_US, "BAB posn of the annot. box in parent film box"},
    {DCM_BABTEXTSTRING, DCM_LO, "BAB text string"}
}

Definition at line 9686 of file l_mri_dicom_hdr.c.

DCMDICT BASICDIR_dictionary[] [static]
 

Initial value:

 {
    {DCM_DIRFILESETID, DCM_CS, "DIR File-set ID"},
    {DCM_DIRFILESETDESCRFILEID, DCM_CS, "DIR File-set descriptor ID"},
    {DCM_DIRSPECIFICCHARACTER, DCM_CS, "DIR Specific character set"},
    {DCM_DIRFIRSTOFFSET, DCM_UL, "DIR Offset of the first dir of root dir entity"},
    {DCM_DIRLASTOFFSET, DCM_UL, "DIR Offset of the last dir of root dir entity"},
    {DCM_DIRFILESETCONSISTENCY, DCM_US, "DIR File-set consistency flag"},
    {DCM_DIRRECORDSEQUENCE, DCM_SQ, "DIR Directory record sequence"},
    {DCM_DIRNEXTRECORDOFFSET, DCM_UL, "DIR Offset of next directory record"},
    {DCM_DIRRECORDINUSE, DCM_US, "DIR Record in use flag"},
    {DCM_DIRLOWERLEVELOFFSET, DCM_UL, "DIR Offset of referenced lower-level dir entity"},
    {DCM_DIRRECORDTYPE, DCM_CS, "DIR Directory Record Type"},
    {DCM_DIRPRIVATERECORDUID, DCM_UI, "DIR Private Record UID"},
    {DCM_DIRREFERENCEDFILEID, DCM_CS, "DIR Referenced File ID"},
    {DCM_DIRMRDRRECORDOFFSET, DCM_UL, "DIR Directory Record Offset"},
    {DCM_DIRREFSOPCLASSUID, DCM_UI, "DIR Referenced SOP Class UID in File"},
    {DCM_DIRREFSOPINSTANCEUID, DCM_UI, "DIR Referenced SOP Instance UID in File"},
    {DCM_DIRREFTRANSFERSYNTAXUID, DCM_UI, "DIR Referenced Transfer Syntax in File"},
    {DCM_DIRNUMREFERENCES, DCM_UL, "DIR Number of References"}
}

Definition at line 8471 of file l_mri_dicom_hdr.c.

DCMDICT BFB_dictionary[] [static]
 

Initial value:

 {
    {DCM_BFBGROUPLENGTH, DCM_UL, "BFB Group Length"},
    {DCM_BFBIMAGEDISPLAYFORMAT, DCM_ST, "BFB Type of image display format"},
    {DCM_BFBANNOTATIONDISPLAYFORMAT, DCM_CS, "BFB Id of annotation display format"},
    {DCM_BFBFILMORIENTATION, DCM_CS, "BFB Film orientation"},
    {DCM_BFBFILMSIZEID, DCM_CS, "BFB Film size identification"},
    {DCM_BFBMAGNIFICATIONTYPE, DCM_CS, "BFB Interpol. type by which printer mag image"},
    {DCM_BFBSMOOTHINGTYPE, DCM_CS, "BFB Specifies type of interpolation function"},
    {DCM_BFBBORDERDENSITY, DCM_CS, "BFB density of film areas around/between images"},
    {DCM_BFBEMPTYIMAGEDENSITY, DCM_CS, "BFB density of image box area having no image"},
    {DCM_BFBMINDENSITY, DCM_US, "BFB Minimum density of images on the film"},
    {DCM_BFBMAXDENSITY, DCM_US, "BFB Maximum density of images on the film"},
    {DCM_BFBTRIM, DCM_CS, "BFB specifies whether to trim or not"},
    {DCM_BFBCONFIGURATIONINFO, DCM_ST, "BFB ID of configuration table"},
    {DCM_BFBREFBASICFILMSESSIONSEQ, DCM_SQ, "BFB seq. of film session instance"},
    {DCM_BFBREFBASICIMAGEBOXSEQ, DCM_SQ, "BFB seq. of basic image box SOP instance"},
    {DCM_BFBREFBASICANNOTBOXSEQ, DCM_SQ, "BFB seq. of basic annotation box SOP instance"},
}

Definition at line 9652 of file l_mri_dicom_hdr.c.

DCMDICT BFS_dictionary[] [static]
 

Initial value:

 {
    {DCM_BFSGROUPLENGTH, DCM_UL, "BFS Group Length"},
    {DCM_BFSCOPIES, DCM_IS, "BFS Number of copies printed for each film"},
    {DCM_BFSPRINTPRIORITY, DCM_CS, "BFS Specifies priority of print job"},
    {DCM_BFSMEDIUMTYPE, DCM_CS, "BFS Medium on which page will be printed"},
    {DCM_BFSFILMDESTINATION, DCM_CS, "BFS Film destination"},
    {DCM_BFSFILMSESSIONLABEL, DCM_LO, "BFS Human readable label to identify film"},
    {DCM_BFSMEMORYALLOCATION, DCM_IS, "BFS Amount of mem allocated for film session"},
    {DCM_BFSREFERENCEDFILMBOXSEQ, DCM_SQ, "BFS seq of UIDs of diff FILMBOX instances"}
}

Definition at line 9639 of file l_mri_dicom_hdr.c.

DCMDICT BIB_dictionary[] [static]
 

Initial value:

 {
    {DCM_BIBGROUPLENGTH, DCM_UL, "BIB Group Length"},
    {DCM_BIBIMAGEPOSITION, DCM_US, "BIB Specifies position of the image in the film"},
    {DCM_BIBPOLARITY, DCM_CS, "BIB Specifies image polarity"},
    {DCM_BIBREQUESTEDIMAGESIZE, DCM_DS, "BIB Requested image size"},
    {DCM_BIBPREFORMATGREYSCALEIMAGESEQ, DCM_SQ, "BIB Preformatted Greyscale image"},
    {DCM_BIBPREFORMATCOLORIMAGESEQ, DCM_SQ, "BIB Preformatted Color image"},
    {DCM_BIBREFIMAGEOVERLAYBOXSEQ, DCM_SQ, "BIB Referenced Image Overlay Box seq"},
    {DCM_BIBREFVOILUTSEQ, DCM_SQ, "BIB Referenced VOI LUT seq."}
}

Definition at line 9673 of file l_mri_dicom_hdr.c.

int BIG_ORDER [static]
 

Definition at line 84 of file l_mri_dicom_hdr.c.

Referenced by DCM_GetCompressedValue(), exportStream(), extractFileOptions(), readFile(), readFile1(), and RWC_set_endianosity().

unsigned char ch[4]
 

Definition at line 4437 of file l_mri_dicom_hdr.c.

DCMDICT CMD_dictionary[] [static]
 

Initial value:

 {
    {DCM_CMDGROUPLENGTH, DCM_UL, "CMD Group Length"},
    {DCM_CMDAFFECTEDCLASSUID, DCM_UI, "CMD Affected SOP Class UID"},
    {DCM_CMDREQUESTEDCLASSUID, DCM_UI, "CMD Requested SOP Class UID"},
    {DCM_CMDCOMMANDFIELD, DCM_US, "CMD Command Field"},
    {DCM_CMDMSGID, DCM_US, "CMD Message ID"},
    {DCM_CMDMSGIDRESPOND, DCM_US, "CMD Message ID Responded to"},
    {DCM_CMDMOVEDESTINATION, DCM_AE, "CMD Move Destination"},
    {DCM_CMDPRIORITY, DCM_US, "CMD Priority"},
    {DCM_CMDDATASETTYPE, DCM_US, "CMD Data Set Type"},
    {DCM_CMDSTATUS, DCM_US, "CMD Status"},
    {DCM_CMDOFFENDINGELEMENT, DCM_AT, "CMD Offending Element"},
    {DCM_CMDERRORCOMMENT, DCM_LO, "CMD Error Comment"},
    {DCM_CMDERRORID, DCM_US, "CMD Error ID"},
    {DCM_CMDREQUESTEDINSTANCEUID, DCM_UI, "CMD SOP Requested Instance UID"},
    {DCM_CMDAFFECTEDINSTANCEUID, DCM_UI, "CMD SOP Affected Instance UID"},
    {DCM_CMDEVENTTYPEID, DCM_US, "CMD Event Type ID"},
    {DCM_CMDACTIONTYPEID, DCM_US, "CMD Action Type ID"},
    {DCM_CMDREMAININGSUBOPERATIONS, DCM_US, "CMD Remaining Suboperations"},
    {DCM_CMDCOMPLETEDSUBOPERATIONS, DCM_US, "CMD Completed Suboperations"},
    {DCM_CMDFAILEDSUBOPERATIONS, DCM_US, "CMD Failed Suboperations"},
    {DCM_CMDWARNINGSUBOPERATIONS, DCM_US, "CMD Warning Suboperations"},
    {DCM_CMDMOVEAETITLE, DCM_AE, "CMD AE Title"},
    {DCM_CMDMOVEMESSAGEID, DCM_US, "CMD Message ID"},
    {DCM_CMDATTRIBUTEIDLIST, DCM_AT, "CMD Attribute Identifier List"},

}

Definition at line 8425 of file l_mri_dicom_hdr.c.

DCMDICT CRV_dictionary[] [static]
 

Initial value:

 {
    {DCM_CURVEGROUPLENGTH, DCM_UL, "CRV Group Length"},
    {DCM_CURVEDIMENSIONS, DCM_US, "CRV Curve Dimensions"},
    {DCM_CURVENUMBEROFPOINTS, DCM_US, "CRV Number of points"},
    {DCM_CURVETYPEOFDATA, DCM_CS, "CRV Type of Data"},
    {DCM_CURVEDESCRIPTION, DCM_LO, "CRV Curve Description"},
    {DCM_CURVEAXISUNITS, DCM_SH, "CRV Axis Units"},
    {DCM_CURVEAXISLABELS, DCM_SH, "CRV Axis Labels"},
    {DCM_CURVEDATAVALUEREPRESENTATION, DCM_US, "CRV Data Value Representation"},
    {DCM_CURVEMINCOORDINATEVALUE, DCM_US, "CRV Minimum Coordinate Value"},
    {DCM_CURVEMAXCOORDINATEVALUE, DCM_US, "CRV Maximum Coordinate Value"},
    {DCM_CURVERANGE, DCM_SH, "CRV Curve Range"},
    {DCM_CURVEDATADESCRIPTOR, DCM_US, "CRV Data Descriptor"},
    {DCM_CURVECOORDINATESTARTVALUE, DCM_US, "CRV Coordinate Start Value"},
    {DCM_CURVECOORDINATESTEPVALUE, DCM_US, "CRV Coordinate Step Value"},
    {DCM_CURVEAUDIOTYPE, DCM_US, "CRV Audio Type"},
    {DCM_CURVEAUDIOSAMPLEFORMAT, DCM_US, "CRV Audio Sample Format"},
    {DCM_CURVENUMBEROFCHANNELS, DCM_US, "CRV Number of Channels"},
    {DCM_CURVENUMBEROFSAMPLES, DCM_UL, "CRV Number of Samples"},
    {DCM_CURVESAMPLERATE, DCM_UL, "CRV Sample Rate"},
    {DCM_CURVETOTALTIME, DCM_UL, "CRV Total Time"},
    {DCM_CURVEAUDIOSAMPLEDATA, DCM_OW, "CRV Audio Sample Data"},
    {DCM_CURVEAUDIOCOMMENTS, DCM_LT, "CRV Audio Comments"},
    {DCM_CURVELABEL, DCM_LO, "CRV Curve Label"},
    {DCM_CURVEREFOVERLAYSEQUENCE, DCM_SQ, "CRV Referenced Overlay Sequence"},
    {DCM_CURVEREFOVERLAYGROUP, DCM_US, "CRV Referenced Overlay Group"},
    {DCM_CURVEDATA, DCM_OW, "CRV Curve Data"}
}

Definition at line 9439 of file l_mri_dicom_hdr.c.

CTNBOOLEAN debug = FALSE [static]
 

Definition at line 865 of file l_mri_dicom_hdr.c.

Referenced by DCM_Debug().

DCMDICT DEV_dictionary[] [static]
 

Initial value:

 {
    {DCM_DEVCALIBRATIONOBJECT, DCM_CS, "DEV Calibration Object"},
    {DCM_DEVDEVICESEQUENCE, DCM_SQ, "DEV Device Sequence"},
    {DCM_DEVDEVICELENGTH, DCM_DS, "DEV Device Length"},
    {DCM_DEVDEVICEDIAMETER, DCM_DS, "DEV Device Diameter"},
    {DCM_DEVDEVICEDIAMETERUNITS, DCM_CS, "DEV Device Diameter Units"},
    {DCM_DEVDEVICEVOLUME, DCM_DS, "DEV Device Volume"},
    {DCM_DEVINTERMARKERDISTANCE, DCM_DS, "DEV Inter-Marker Distance"},
    {DCM_DEVDEVICEDESCRIPTION, DCM_LO, "DEV Device Description"},
}

Definition at line 9394 of file l_mri_dicom_hdr.c.

DCMDICT DLM_dictionary[] [static]
 

Initial value:

 {
    {DCM_DLMITEM, DCM_DLM, "DELIMITER Item"},
    {DCM_DLMITEMDELIMITATIONITEM, DCM_DLM, "DELIMITER Item Delimitation Item"},
    {DCM_DLMSEQUENCEDELIMITATIONITEM, DCM_DLM, "DELIMITER Sequence Delimitation Item"}
}

Definition at line 10129 of file l_mri_dicom_hdr.c.

DCMDICT DVH_dictionary[] [static]
 

Initial value:

 {
    {DCM_MAKETAG(0x3004, 0x0000), DCM_UL, "DVH Group Length"},
    {DCM_MAKETAG(0x3004, 0x0001), DCM_CS, "DVH Type"},
    {DCM_MAKETAG(0x3004, 0x0002), DCM_CS, "DVH Dose Units"},
    {DCM_MAKETAG(0x3004, 0x0004), DCM_CS, "DVH Dose Type"},
    {DCM_MAKETAG(0x3004, 0x0006), DCM_LO, "DVH Dose Comment"},
    {DCM_MAKETAG(0x3004, 0x0008), DCM_DS, "DVH Normalization Point"},
    {DCM_MAKETAG(0x3004, 0x000a), DCM_CS, "DVH Dose Summation Type"},
    {DCM_MAKETAG(0x3004, 0x000c), DCM_DS, "DVH Grid Frame Offset Vector"},
    {DCM_MAKETAG(0x3004, 0x000e), DCM_DS, "DVH Dose Grid Scaling"},
    {DCM_MAKETAG(0x3004, 0x0010), DCM_SQ, "DVH RT Dose ROI Sequence"},
    {DCM_MAKETAG(0x3004, 0x0012), DCM_DS, "DVH Dose Value"},
    {DCM_MAKETAG(0x3004, 0x0040), DCM_DS, "DVH Normalization Point"},
    {DCM_MAKETAG(0x3004, 0x0042), DCM_DS, "DVH Normalization Dose Value"},
    {DCM_MAKETAG(0x3004, 0x0050), DCM_SQ, "DVH Sequence"},
    {DCM_MAKETAG(0x3004, 0x0052), DCM_DS, "DVH Dose Scaling"},
    {DCM_MAKETAG(0x3004, 0x0054), DCM_CS, "DVH Volume Units"},
    {DCM_MAKETAG(0x3004, 0x0056), DCM_IS, "DVH Number of Bins"},
    {DCM_MAKETAG(0x3004, 0x0058), DCM_DS, "DVH Data"},
    {DCM_MAKETAG(0x3004, 0x0060), DCM_SQ, "DVH Referenced ROI Sequence"},
    {DCM_MAKETAG(0x3004, 0x0062), DCM_CS, "DVH ROI Contribution Type"},
    {DCM_MAKETAG(0x3004, 0x0070), DCM_DS, "DVH Minimum Dose"},
    {DCM_MAKETAG(0x3004, 0x0072), DCM_DS, "DVH Maximum Dose"},
    {DCM_MAKETAG(0x3004, 0x0074), DCM_DS, "DVH Mean Dose"}
}

Definition at line 9763 of file l_mri_dicom_hdr.c.

EDB EDBStack[MAXEDB] [static]
 

Definition at line 356 of file l_mri_dicom_hdr.c.

void(* ErrorCallback)() = NULL [static]
 

Definition at line 357 of file l_mri_dicom_hdr.c.

Referenced by COND_EstablishCallback(), and COND_PushCondition().

DCMDICT G3002_dictionary[] [static]
 

Initial value:

 {
    {DCM_MAKETAG(0x3002, 0x0000), DCM_UL, "RT Group Length"},
    {DCM_MAKETAG(0x3002, 0x0002), DCM_SH, "RT Image Label"},
    {DCM_MAKETAG(0x3002, 0x0003), DCM_LO, "RT Image Name"},
    {DCM_MAKETAG(0x3002, 0x0004), DCM_ST, "RT Image Description"},
    {DCM_MAKETAG(0x3002, 0x000a), DCM_CS, "RT Reported Values Origin"},
    {DCM_MAKETAG(0x3002, 0x000c), DCM_CS, "RT Image Plane"},
    {DCM_MAKETAG(0x3002, 0x000e), DCM_DS, "RT X-Ray Image Receptor Angle"},
    {DCM_MAKETAG(0x3002, 0x0010), DCM_DS, "RT Image Orientation"},
    {DCM_MAKETAG(0x3002, 0x0011), DCM_DS, "RT Image Plane Pixel Spacing"},
    {DCM_MAKETAG(0x3002, 0x0012), DCM_DS, "RT Image Position"},
    {DCM_MAKETAG(0x3002, 0x0020), DCM_SH, "RT Radiation Machine Name"},
    {DCM_MAKETAG(0x3002, 0x0022), DCM_DS, "RT Radiation Machine SAD"},
    {DCM_MAKETAG(0x3002, 0x0024), DCM_DS, "RT Radiation Machine SSD"},
    {DCM_MAKETAG(0x3002, 0x0026), DCM_DS, "RT Image SID"},
    {DCM_MAKETAG(0x3002, 0x0028), DCM_DS, "RT Source to Reference Object Distance"},
    {DCM_MAKETAG(0x3002, 0x0029), DCM_IS, "RT Fraction Number"},
    {DCM_MAKETAG(0x3002, 0x0030), DCM_SQ, "RT Exposure Sequence"},
    {DCM_MAKETAG(0x3002, 0x0032), DCM_DS, "RT Meterset Exposure"}
}

Definition at line 9739 of file l_mri_dicom_hdr.c.

DCMDICT G300A_dictionary[] [static]
 

Definition at line 9842 of file l_mri_dicom_hdr.c.

DCMDICT G300C_dictionary[] [static]
 

Initial value:

 {
    {DCM_MAKETAG(0x300c, 0x0000), DCM_UL, "     Group Length"},
    {DCM_MAKETAG(0x300c, 0x0002), DCM_SQ, "     Referenced RT Plan Sequence"},
    {DCM_MAKETAG(0x300c, 0x0004), DCM_SQ, "     Referenced Beam Sequence"},
    {DCM_MAKETAG(0x300c, 0x0006), DCM_IS, "     Referenced Beam Number"},
    {DCM_MAKETAG(0x300c, 0x0007), DCM_IS, "     Referenced Reference Image Number"},
    {DCM_MAKETAG(0x300c, 0x0008), DCM_DS, "     Start Cumulative Meterset Weight"},
    {DCM_MAKETAG(0x300c, 0x0009), DCM_DS, "     End Cumulative Meterset Weight"},
    {DCM_MAKETAG(0x300c, 0x000a), DCM_SQ, "     Referenced Brachy Application Setup Seq"},
    {DCM_MAKETAG(0x300c, 0x000c), DCM_IS, "     Referenced Brachy Application Setup Number"},
    {DCM_MAKETAG(0x300c, 0x000e), DCM_IS, "     Referenced Source Number"},
    {DCM_MAKETAG(0x300c, 0x0020), DCM_SQ, "     Referenced Fraction Group Sequence"},
    {DCM_MAKETAG(0x300c, 0x0022), DCM_IS, "     Referenced Fraction Group Number"},
    {DCM_MAKETAG(0x300c, 0x0040), DCM_SQ, "     Referenced Verification Image Sequence"},
    {DCM_MAKETAG(0x300c, 0x0042), DCM_SQ, "     Referenced Reference Image Sequence"},
    {DCM_MAKETAG(0x300c, 0x0050), DCM_SQ, "     Referenced Dose Reference Sequence"},
    {DCM_MAKETAG(0x300c, 0x0051), DCM_IS, "     Referenced Dose Reference Numer"},
    {DCM_MAKETAG(0x300c, 0x0055), DCM_SQ, "     Brachy Referenced Dose Reference Sequence"},
    {DCM_MAKETAG(0x300c, 0x0060), DCM_SQ, "     Referenced Structure Set Sequence"},
    {DCM_MAKETAG(0x300c, 0x006a), DCM_IS, "     Referenced Patient Setup Number"},
    {DCM_MAKETAG(0x300c, 0x0080), DCM_SQ, "     Referenced Dose Sequence"},
    {DCM_MAKETAG(0x300c, 0x00a0), DCM_IS, "     Referenced Tolerance Table Number"},
    {DCM_MAKETAG(0x300c, 0x00b0), DCM_SQ, "     Referenced Bolus Sequence"},
    {DCM_MAKETAG(0x300c, 0x00c0), DCM_IS, "     Referenced Wedge Number"},
    {DCM_MAKETAG(0x300c, 0x00d0), DCM_IS, "     Referenced Compensator Number"},
    {DCM_MAKETAG(0x300c, 0x00e0), DCM_IS, "     Referenced Block Number"},
    {DCM_MAKETAG(0x300c, 0x00f0), DCM_IS, "     Referenced Control Point Index"}
}

Definition at line 10072 of file l_mri_dicom_hdr.c.

DCMDICT G300E_dictionary[] [static]
 

Initial value:

 {
    {DCM_MAKETAG(0x300e, 0x0000), DCM_UL, "     Group Length"},
    {DCM_MAKETAG(0x300e, 0x0002), DCM_CS, "     Approval Status"},
    {DCM_MAKETAG(0x300e, 0x0004), DCM_DA, "     Review Date"},
    {DCM_MAKETAG(0x300e, 0x0005), DCM_TM, "     Review Time"},
    {DCM_MAKETAG(0x300e, 0x0008), DCM_PN, "     Reviewer Name"}
}

Definition at line 10104 of file l_mri_dicom_hdr.c.

GROUPPTR group_dictionary[] [static]
 

Definition at line 10139 of file l_mri_dicom_hdr.c.

union { ... } groupElement
 

Referenced by exportData().

GROUP_DESCRIPTION groupTable[] [static]
 

Definition at line 10316 of file l_mri_dicom_hdr.c.

DCMDICT GRP_dictionary[] [static]
 

Initial value:

 {
    {DCM_MAKETAG(0x0070, 0x0000), DCM_UL, "GRP Group Length"},
    {DCM_MAKETAG(0x0070, 0x0022), DCM_FL, "GRP Graphic Data"}, 
    {DCM_MAKETAG(0x0070, 0x0023), DCM_CS, "GRP Graphic Type"}, 
    {DCM_MAKETAG(0x0070, 0x0024), DCM_CS, "GRP Graphic Filled"}, 
    {DCM_MAKETAG(0x0070, 0x0041), DCM_CS, "GRP Image Horizontal Flip"}, 
    {DCM_MAKETAG(0x0070, 0x0042), DCM_US, "GRP Image Rotation"}, 
    {DCM_MAKETAG(0x0070, 0x0052), DCM_SL, "GRP Displayed Area Top LH Corner"},
    {DCM_MAKETAG(0x0070, 0x0053), DCM_SL, "GRP Displayed Area Bottom RH Corner"},
    {DCM_MAKETAG(0x0070, 0x005a), DCM_SQ, "GRP Display Area Selection Seq"},
    {DCM_MAKETAG(0x0070, 0x0060), DCM_SQ, "GRP Graphic Layer Sequence"},
    {DCM_MAKETAG(0x0070, 0x0062), DCM_IS, "GRP Graphic Layer Order"},
    {DCM_MAKETAG(0x0070, 0x0066), DCM_US, "GRP Graphic Layer Rec Disp GS Val"},
    {DCM_MAKETAG(0x0070, 0x0067), DCM_US, "GRP Graphic Layer Rec Disp RGB Val"},
    {DCM_MAKETAG(0x0070, 0x0068), DCM_LO, "GRP Graphic Layer Description"},

    {DCM_MAKETAG(0x0070, 0x0080), DCM_CS, "GRP Presentation Label"}, 
    {DCM_MAKETAG(0x0070, 0x0081), DCM_LO, "GRP Presentation Description"}, 
    {DCM_MAKETAG(0x0070, 0x0082), DCM_DA, "GRP Presentation Creation Date"}, 
    {DCM_MAKETAG(0x0070, 0x0083), DCM_TM, "GRP Presentation Creation Time"}, 
    {DCM_MAKETAG(0x0070, 0x0084), DCM_PN, "GRP Presentation Creators Name"}, 
    {DCM_MAKETAG(0x0070, 0x0100), DCM_CS, "GRP Presentation Size Mode"}, 
    {DCM_MAKETAG(0x0070, 0x0101), DCM_DS, "GRP Presentation Pixel Spacing"}, 
    {DCM_MAKETAG(0x0070, 0x0102), DCM_IS, "GRP Presentation Pixel Aspect Ratio"}, 
    {DCM_MAKETAG(0x0070, 0x0103), DCM_FL, "GRP Presentation Pixel Magnification Ratio"}, 
}

Definition at line 9557 of file l_mri_dicom_hdr.c.

DCMDICT ID_dictionary[] [static]
 

Definition at line 8494 of file l_mri_dicom_hdr.c.

DCMDICT IMG_dictionary[] [static]
 

Definition at line 9016 of file l_mri_dicom_hdr.c.

DCMDICT IOB_dictionary[] [static]
 

Initial value:

 {
    {DCM_IOBGROUPLENGTH, DCM_UL, "IOB Group Length"},
    {DCM_IOBREFOVERLAYPLANESEQ, DCM_SQ, "IOB Ref Overlay Plane Sequence"},
    {DCM_IOBREFOVERLAYPLANEGROUPS, DCM_US, "IOB Ref Overlay Plane Groups"},
    {DCM_IOBOVERLAYMAGNIFICATIONTYPE, DCM_CS, "IOB Overlay Magnification Type"},
    {DCM_IOBOVERLAYSMOOTHINGTYPE, DCM_CS, "IOB Overlay Smoothing Type"},
    {DCM_IOBOVERLAYFOREGROUNDDENSITY, DCM_CS, "IOB Overlay Foreground Density"},
    {DCM_IOBOVERLAYMODE, DCM_CS, "IOB Overlay Mode"},
    {DCM_IOBTHRESHOLDDENSITY, DCM_CS, "IOB Threshold Density"},
    {DCM_IOBREFIMAGEBOXSEQUENCE, DCM_SQ, "IOB Ref Image Box Sequence (RET)"}
}

Definition at line 9694 of file l_mri_dicom_hdr.c.

int LITTLE_ENDIAN_ARCHITECTURE = -1 [static]
 

Definition at line 85 of file l_mri_dicom_hdr.c.

Referenced by RWC_set_endianosity().

int LITTLE_ORDER [static]
 

Definition at line 83 of file l_mri_dicom_hdr.c.

Referenced by DCM_GetCompressedValue(), exportEncapsulatedPixels(), exportStream(), extractFileOptions(), readFile(), readFile1(), and RWC_set_endianosity().

DCMDICT MED_dictionary[] [static]
 

Initial value:

 {
    {DCM_MEDIAGROUPLENGTH, DCM_UL, "MED Media Group Length "},
    {DCM_MEDIASTORAGEFILESETID, DCM_SH, "MED Storage Media File-set ID"},
    {DCM_MEDIASTORAGEFILESETUID, DCM_UI, "MED Storage Media File-setUID"},
    {DCM_MEDIAICONIMAGE, DCM_SQ, "MED Icon Image Sequence"},
    {DCM_MEDIATOPICTITLE, DCM_LO, "MED Topic Title"},
    {DCM_MEDIATOPICSUBJECT, DCM_ST, "MED Topic Subject"},
    {DCM_MEDIATOPICAUTHOR, DCM_LO, "MED Topic Author"},
    {DCM_MEDIATOPICKEYWORD, DCM_LO, "MED Topic Keywords"}
}

Definition at line 9626 of file l_mri_dicom_hdr.c.

VECTOR messageVector[] [static]
 

Definition at line 8244 of file l_mri_dicom_hdr.c.

DCMDICT META_dictionary[] [static]
 

Initial value:

 {
    {DCM_METAGROUPLENGTH, DCM_UL, "META Group Length"},
    {DCM_METAINFORMATIONVERSION, DCM_OB, "META File Meta Information Version"},
    {DCM_METAMEDIASTORAGESOPCLASS, DCM_UI, "META Media Stored SOP Class UID"},
    {DCM_METAMEDIASTORAGESOPINSTANCE, DCM_UI, "META Media Stored SOP Instance UID"},
    {DCM_METATRANSFERSYNTAX, DCM_UI, "META Transfer Syntax UID"},
    {DCM_METAIMPLEMENTATIONCLASS, DCM_UI, "META Implementation Class UID"},
    {DCM_METAIMPLEMENTATIONVERSION, DCM_SH, "META Implementation Version Name"},
    {DCM_METASOURCEAETITLE, DCM_AE, "META Source Application Entity Title"},
    {DCM_METAPRIVATEINFORMATIONCREATOR, DCM_UI, "META Private Information Creator"},
    {DCM_METAPRIVATEINFORMATION, DCM_OB, "META Private Information"}
}

Definition at line 8456 of file l_mri_dicom_hdr.c.

DCMDICT NMI_dictionary[] [static]
 

Definition at line 9469 of file l_mri_dicom_hdr.c.

int npbuf = 0 [static]
 

Definition at line 111 of file l_mri_dicom_hdr.c.

Referenced by RWC_clear_pbuf(), and RWC_printf().

DCMDICT OLY_dictionary[] [static]
 

Definition at line 9585 of file l_mri_dicom_hdr.c.

DCMDICT PAD_dictionary[] [static]
 

Initial value:

 {
    {DCM_PADITEM, DCM_OB, "Pad item"}
}

Definition at line 10122 of file l_mri_dicom_hdr.c.

DCMDICT PAT_dictionary[] [static]
 

Definition at line 8620 of file l_mri_dicom_hdr.c.

char* pbuf = NULL [static]
 

Definition at line 110 of file l_mri_dicom_hdr.c.

Referenced by mri_dicom_header(), RWC_clear_pbuf(), and RWC_printf().

DCMDICT PJ_dictionary[] [static]
 

Initial value:

 {
    {DCM_PJGROUPLENGTH, DCM_UL, "PJ Group Length"},
    {DCM_PJEXECUTIONSTATUS, DCM_CS, "PJ execution status of print job"},
    {DCM_PJEXECUTIONSTATUSINFO, DCM_CS, "PJ additional information"},
    {DCM_PJCREATIONDATE, DCM_DA, "PJ date of print job creation"},
    {DCM_PJCREATIONTIME, DCM_TM, "PJ time of print job creation"},
    {DCM_PJORIGINATOR, DCM_AE, "PJ Appln entity title that issued the print opn"},
    {DCM_PJREFPRINTJOBSEQ, DCM_SQ, "PJ Referenced print job seq."}
}

Definition at line 9717 of file l_mri_dicom_hdr.c.

DCMDICT PLUT_dictionary[] [static]
 

Initial value:

 {
    {DCM_MAKETAG(0x2050, 0x0000), DCM_UL, "PLUT Group Length"},
    {DCM_MAKETAG(0x2050, 0x0010), DCM_SQ, "PLUT Presentation LUT Sequence"},
    {DCM_MAKETAG(0x2050, 0x0020), DCM_CS, "PLUT Presentation LUT Shape"},
    {DCM_MAKETAG(0x2050, 0x0500), DCM_SQ, "PLUT Referenced Presentation LUT Sequence"}
}

Definition at line 9708 of file l_mri_dicom_hdr.c.

DCMDICT PRC_dictionary[] [static]
 

Definition at line 9206 of file l_mri_dicom_hdr.c.

DCMDICT PRN_dictionary[] [static]
 

Initial value:

 {
    {DCM_PRINTERGROUPLENGTH, DCM_UL, "PRINTER Group Length"},
    {DCM_PRINTERSTATUS, DCM_CS, "PRINTER printer device status"},
    {DCM_PRINTERSTATUSINFO, DCM_CS, "PRINTER additional information"},
    {DCM_PRINTERNAME, DCM_LO, "PRINTER printer name"},
    {DCM_PRINTERQUEUEID, DCM_SH, "Printer Queue ID"}
}

Definition at line 9729 of file l_mri_dicom_hdr.c.

DCMDICT PXL_dictionary[] [static]
 

Initial value:

 {
    {DCM_PXLGROUPLENGTH, DCM_UL, "PXL Group Length"},
    {DCM_PXLPIXELDATA, DCM_OT, "PXL Pixel Data"}
}

Definition at line 9620 of file l_mri_dicom_hdr.c.

unsigned int pxl_len = 0 [static]
 

Definition at line 152 of file l_mri_dicom_hdr.c.

Referenced by mri_dicom_header(), mri_dicom_pxlarr(), and readData().

off_t pxl_off = 0 [static]
 

Definition at line 151 of file l_mri_dicom_hdr.c.

Referenced by mri_dicom_header(), mri_dicom_pxlarr(), and readData().

DCMDICT REL_dictionary[] [static]
 

Definition at line 8953 of file l_mri_dicom_hdr.c.

DCMDICT RES_dictionary[] [static]
 

Initial value:

 {
    {DCM_RESGROUPLENGTH, DCM_UL, "RES Group Length"},
    {DCM_RESID, DCM_SH, "RES Results ID"},
    {DCM_RESIDISSUER, DCM_LO, "RES Results ID Issuer"},
    {DCM_RESREFERENCEDINTERPSEQ, DCM_SQ, "RES Referenced Interpretation Sequence"},
    {DCM_RESINTERPRECORDEDDATE, DCM_DA, "RES Interpretation Recorded Date"},
    {DCM_RESINTERPRECORDEDTIME, DCM_TM, "RES Interpretation Recorded Time"},
    {DCM_RESINTERPRECORDER, DCM_PN, "RES Interpretation Recorder"},
    {DCM_RESREFERENCETORECORDEDSOUND, DCM_LO, "RES Reference to Recorded Sound"},
    {DCM_RESINTERPTRANSCRIPTIONDATE, DCM_DA, "RES Interpretation Transcription Date"},
    {DCM_RESINTERPTRANSCRIPTIONTIME, DCM_TM, "RES Interpretation Transcription Time"},
    {DCM_RESINTERPTRANSCRIBER, DCM_PN, "RES Interpretation Transcriber"},
    {DCM_RESINTERPTEXT, DCM_ST, "RES Interpretation Text"},
    {DCM_RESINTERPAUTHOR, DCM_PN, "RES Interpretation Author"},
    {DCM_RESINTERPAPPROVERSEQUENCE, DCM_SQ, "RES Interpretation Approver Sequence"},
    {DCM_RESINTERPAPPROVALDATE, DCM_DA, "RES Interpretation Approval Date"},
    {DCM_RESINTERPAPPROVALTIME, DCM_TM, "RES Interpretation Approval Time"},
    {DCM_RESPHYSICIANAPPROVINGINTERP, DCM_PN, "RES Physician Approving Interpretation"},
    {DCM_RESDIAGNOSIS, DCM_LT, "RES Diagnosis"},
    {DCM_RESDIAGNOSISCODESEQ, DCM_SQ, "RES Diagnosis Code Sequence"},
    {DCM_RESDISTRIBUTIIONLISTSEQUENCE, DCM_SQ, "RES Results Distribution List Sequence"},
    {DCM_RESDISTRIBUTIONNAME, DCM_PN, "RES Distribution Name"},
    {DCM_RESDISTRIBUTIONADDRESS, DCM_LO, "RES Distribution Address"},
    {DCM_RESINTERPID, DCM_SH, "RES Interpretation ID"},
    {DCM_RESINTERPIDISSUER, DCM_LO, "RES Interpretation ID Issuer"},
    {DCM_RESINTERPTYPEID, DCM_CS, "RES Interpretation Type ID"},
    {DCM_RESINTERPSTATUSID, DCM_CS, "RES Interpretation Status ID"},
    {DCM_RESIMPRESSIONS, DCM_ST, "RES Impressions"},
    {DCM_RESCOMMENTS, DCM_ST, "RES Comments"}
}

Definition at line 9407 of file l_mri_dicom_hdr.c.

int rwc_err = 1 [static]
 

Definition at line 193 of file l_mri_dicom_hdr.c.

Referenced by mri_dicom_seterr(), and readVRLength().

int rwc_fd [static]
 

Definition at line 202 of file l_mri_dicom_hdr.c.

Referenced by DCM_OpenFile(), and mri_dicom_header().

int rwc_opt = 0 [static]
 

Definition at line 161 of file l_mri_dicom_hdr.c.

Referenced by DCM_DumpElements(), mri_dicom_nohex(), and mri_dicom_noname().

int rwc_vm = 0 [static]
 

Definition at line 184 of file l_mri_dicom_hdr.c.

Referenced by DCM_DumpElements(), mri_dicom_header(), and mri_dicom_setvm().

DCMDICT SDY_dictionary[] [static]
 

Initial value:

 {
    {DCM_SDYGROUPLENGTH, DCM_UL, "SDY Study Group length"},
    {DCM_SDYSTATUSID, DCM_CS, "SDY Study Status ID"},
    {DCM_SDYPRIORITYID, DCM_CS, "SDY Study Priority ID"},
    {DCM_SDYIDISSUER, DCM_LO, "SDY Study ID Issuer"},
    {DCM_SDYVERIFIEDDATE, DCM_DA, "SDY Study Verified Date"},
    {DCM_SDYVERIFIEDTIME, DCM_TM, "SDY Study Verified Time"},
    {DCM_SDYREADDATE, DCM_DA, "SDY Study Read Date"},
    {DCM_SDYREADTIME, DCM_TM, "SDY Study Read Time"},
    {DCM_SDYSCHEDULEDSTARTDATE, DCM_DA, "SDY Scheduled Study Start Date"},
    {DCM_SDYSCHEDULEDSTARTTIME, DCM_TM, "SDY Scheduled Study Start Time"},
    {DCM_SDYSCHEDULEDSTOPDATE, DCM_DA, "SDY Scheduled Study Stop Date"},
    {DCM_SDYSCHEDULEDSTOPTIME, DCM_TM, "SDY Scheduled Study Stop Time"},
    {DCM_SDYSCHEDULEDLOCATION, DCM_LO, "SDY Scheduled Study Location"},
    {DCM_SDYSCHEDULEDLOCATIONAETITLE, DCM_AE,
    "SDY Scheduled Study Location AE Title(s)"},
    {DCM_SDYREASON, DCM_LO, "SDY Study Reason"},
    {DCM_SDYREQUESTINGPHYSICIAN, DCM_PN, "SDY Requesting Physician "},
    {DCM_SDYREQUESTINGSERVICE, DCM_LO, "SDY Requesting Service"},
    {DCM_SDYARRIVALDATE, DCM_DA, "SDY Study Arrival Date"},
    {DCM_SDYARRIVALTIME, DCM_TM, "SDY Study Arrival Time"},
    {DCM_SDYCOMPLETIONDATE, DCM_DA, "SDY Study Completion Date"},
    {DCM_SDYCOMPLETIONTIME, DCM_TM, "SDY Study Completion Time"},
    {DCM_SDYSTUDYCOMPONENTSTATUSID, DCM_CS, "SDY Study Component Status ID"},
    {DCM_SDYREQUESTEDPRODESCRIPTION, DCM_LO, "SDY Requested Procedure Description"},
    {DCM_SDYREQUESTEDPROCODESEQ, DCM_SQ, "SDY Requested Procedure Code Seq"},
    {DCM_SDYREQUESTEDCONTRASTAGENT, DCM_LO, "SDY Requested Contrast Agent"},
    {DCM_SDYCOMMENTS, DCM_LT, "SDY Comments"}
}

Definition at line 9111 of file l_mri_dicom_hdr.c.

unsigned short sh[2]
 

Definition at line 4436 of file l_mri_dicom_hdr.c.

DCMDICT SSET_dictionary[] [static]
 

Definition at line 9792 of file l_mri_dicom_hdr.c.

int stackPtr = -1 [static]
 

Definition at line 355 of file l_mri_dicom_hdr.c.

Referenced by COND_CopyText(), COND_DumpConditions(), COND_ExtractConditions(), COND_PopCondition(), COND_PushCondition(), COND_TopCondition(), COND_WriteConditions(), and dumpstack().

DCMDICT VIS_dictionary[] [static]
 

Initial value:

 {
    {DCM_VISGROUPLENGTH, DCM_UL, "VIS Group Length"},
    {DCM_VISREFERENCEDPATALIASSEQ, DCM_SQ, "VIS Referenced Patient Alias Sequence"},
    {DCM_VISSTATUSID, DCM_CS, "VIS Visit Status ID"},
    {DCM_VISADMISSIONID, DCM_LO, "VIS Admission ID"},
    {DCM_VISISSUEROFADMISSIONID, DCM_LO, "VIS Issuer of Admission ID"},
    {DCM_VISROUTEOFADMISSION, DCM_LO, "VIS Route of Admission"},
    {DCM_VISSCHEDULEDADMISSIONDATE, DCM_DA, "VIS Scheduled Admission Date"},
    {DCM_VISSCHEDULEDADMISSIONTIME, DCM_TM, "VIS Scheduled Admission Time"},
    {DCM_VISSCHEDULEDDISCHARGEDATE, DCM_DA, "VIS Scheduled Discharge Date"},
    {DCM_VISSCHEDULEDDISCHARGETIME, DCM_TM, "VIS Scheduled Discharge Time"},
    {DCM_VISSCHEDULEDPATINSTRESIDENCE, DCM_LO, "VIS Scheduled Patient Institution Residence"},
    {DCM_VISADMITTINGDATE, DCM_DA, "VIS Admitting Date"},
    {DCM_VISADMITTINGTIME, DCM_TM, "VIS Admitting Time"},
    {DCM_VISDISCHARGEDATE, DCM_DA, "VIS Discharge Date"},
    {DCM_VISDISCHARGETIME, DCM_TM, "VIS Discharge Time"},
    {DCM_VISDISCHARGEDIAGDESCRIPTION, DCM_LO, "VIS Discharge Diagnosis Description"},
    {DCM_VISDISCHARGEDIAGNOSISCODESEQ, DCM_SQ, "VIS Discharge Diagnosis Code Sequence"},
    {DCM_VISSPECIALNEEDS, DCM_LO, "VIS Special Needs"},
    {DCM_VISCURRENTPATIENTLOCATION, DCM_LO, "VIS Current Patient Location"},
    {DCM_VISPATIENTSINSTRESIDENCE, DCM_LO, "VIS Patient's Institution Residence"},
    {DCM_VISPATIENTSTATE, DCM_LO, "VIS Patient State"},
    {DCM_VISCOMMENTS, DCM_LT, "VIS Comments"}
}

Definition at line 9143 of file l_mri_dicom_hdr.c.

VRMAP vrMap[] [static]
 

Definition at line 4131 of file l_mri_dicom_hdr.c.

DCMDICT WAV_dictionary[] [static]
 

Definition at line 9170 of file l_mri_dicom_hdr.c.

 

Powered by Plone

This site conforms to the following standards: