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  

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 "mcw_malloc.h"
#include "Amalloc.h"
#include "debugtrace.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 79 of file mri_dicom_hdr.c.

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

#define BYTEORDER_SAME   1
 

Definition at line 78 of file mri_dicom_hdr.c.

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

#define CURRENT   (*list)->current
 

Definition at line 10720 of file mri_dicom_hdr.c.

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

#define MAXEDB   100
 

Definition at line 352 of file mri_dicom_hdr.c.

Referenced by COND_PushCondition().

#define NATIVE_ORDER   BYTEORDER_SAME
 

Definition at line 80 of file mri_dicom_hdr.c.

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

#define NPBUF   1024
 

Definition at line 112 of file mri_dicom_hdr.c.

Referenced by RWC_printf().

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

Definition at line 10721 of file mri_dicom_hdr.c.

Referenced by LST_Insert(), and LST_Remove().

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

Definition at line 10722 of file mri_dicom_hdr.c.

Referenced by LST_Insert(), and LST_Remove().

#define RWC_NOHEX_MASK   2
 

Definition at line 163 of file mri_dicom_hdr.c.

Referenced by DCM_DumpElements(), and mri_dicom_nohex().

#define RWC_NONAME_MASK   1
 

Definition at line 162 of file 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 6858 of file 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.

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

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

Definition at line 4987 of file mri_dicom_hdr.c.

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

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

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 7597 of file mri_dicom_hdr.c.

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

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

U32 computeGroupLength PRV_GROUP_ITEM   groupItem,
CTNBOOLEAN    explicitVR
[static]
 

Definition at line 5140 of file mri_dicom_hdr.c.

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

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

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

Definition at line 7289 of file 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.

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

void COND_CopyText char *    txt,
size_t    length
 

Definition at line 679 of file mri_dicom_hdr.c.

References i, and stackPtr.

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

void COND_DumpConditions void   
 

Definition at line 636 of file mri_dicom_hdr.c.

References dumpstack(), and stackPtr.

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

CONDITION COND_EstablishCallback void(*    callback)()
 

Definition at line 612 of file mri_dicom_hdr.c.

References COND_NORMAL, and ErrorCallback.

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

CONDITION COND_ExtractConditions CTNBOOLEAN(*    callback)()
 

Definition at line 466 of file mri_dicom_hdr.c.

References AFNI_CALL_VALU_2ARG, COND_NORMAL, CONDITION, and stackPtr.

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

CONDITION COND_PopCondition CTNBOOLEAN    clearstack
 

Definition at line 565 of file mri_dicom_hdr.c.

References COND_NORMAL, CONDITION, CTNBOOLEAN, and stackPtr.

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

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

Definition at line 394 of file mri_dicom_hdr.c.

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

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

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

Definition at line 519 of file mri_dicom_hdr.c.

References COND_NORMAL, CONDITION, and stackPtr.

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

void COND_WriteConditions FILE *    lfp
 

Definition at line 715 of file mri_dicom_hdr.c.

References dumpstack(), and stackPtr.

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

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

Definition at line 7392 of file 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.

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

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

Definition at line 7656 of file 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.

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

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

Definition at line 5046 of file mri_dicom_hdr.c.

References DCM_NORMAL, and U32.

Referenced by DCM_ComputeExportLength().

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

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

Definition at line 7360 of file 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.

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

CONDITION DCM_AddElement DCM_OBJECT **    callerObject,
DCM_ELEMENT   element
 

Definition at line 1334 of file 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().

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

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

Definition at line 3334 of file mri_dicom_hdr.c.

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

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

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

Definition at line 8123 of file 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.

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

CONDITION DCM_AddSequenceElement DCM_OBJECT **    callerObject,
DCM_ELEMENT   element
 

Definition at line 1425 of file 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().

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

CONDITION DCM_CloseObject DCM_OBJECT **    callerObject
 

Definition at line 1207 of file mri_dicom_hdr.c.

References checkObject(), close(), COND_PushCondition(), CONDITION, CTN_FREE, DCM_ELEMENT::d, DCM_CloseObject(), 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.

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

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 3432 of file mri_dicom_hdr.c.

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

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

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

Definition at line 3407 of file mri_dicom_hdr.c.

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

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

CONDITION DCM_CopyObject DCM_OBJECT **    src,
DCM_OBJECT **    dst
 

Definition at line 7918 of file 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.

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

CONDITION DCM_CreateObject DCM_OBJECT **    object,
unsigned long    opt
 

Definition at line 1125 of file 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.

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

void DCM_Debug CTNBOOLEAN    flag
 

Definition at line 2707 of file mri_dicom_hdr.c.

References CTNBOOLEAN, and debug.

02708 {
02709     debug = flag;
02710 }

CONDITION DCM_DumpElements DCM_OBJECT **    callerObject,
long    vm
 

Definition at line 2287 of file 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_DumpElements(), 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.

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

DCM_DumpVector  
 

Definition at line 8333 of file mri_dicom_hdr.c.

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

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

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

Definition at line 10432 of file 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.

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

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

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

Definition at line 2512 of file 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_FormatElements(), 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.

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

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

Definition at line 7689 of file 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.

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

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

Definition at line 3381 of file 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().

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

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

Definition at line 1990 of file 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.

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

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

Definition at line 1651 of file 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.

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

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

Definition at line 3198 of file 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.

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

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

Definition at line 1866 of file 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.

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

CONDITION DCM_GetFirstElement DCM_OBJECT **    callerObject,
DCM_ELEMENT **    e
 

dst = (DCM_OBJECT *) dstObj;

Definition at line 8047 of file 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.

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

CONDITION DCM_GetNextElement DCM_OBJECT **    callerObject,
DCM_ELEMENT **    e
 

Definition at line 8079 of file mri_dicom_hdr.c.

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

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

CONDITION DCM_GetObjectSize DCM_OBJECT **    callerObject,
unsigned long *    returnlength
 

Definition at line 2242 of file mri_dicom_hdr.c.

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

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

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

Definition at line 7880 of file 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.

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

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

Definition at line 3139 of file 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.

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

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

Definition at line 3076 of file 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.

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

char* DCM_GetString DCM_OBJECT **    callerObject,
DCM_TAG    tag
 

Definition at line 1782 of file 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.

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

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

Definition at line 10384 of file mri_dicom_hdr.c.

References DCM_NORMAL, DIM_OF, and i.

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

CTNBOOLEAN DCM_GroupPresent DCM_OBJECT **    o1,
U16    group
 

Definition at line 3488 of file 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.

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

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

Definition at line 2203 of file mri_dicom_hdr.c.

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

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

CTNBOOLEAN DCM_IsString DCM_VALUEREPRESENTATION    representation
 

Definition at line 10611 of file 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.

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

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

Definition at line 10539 of file 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.

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

CONDITION DCM_LookupElement DCM_ELEMENT   element
 

Definition at line 10256 of file 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.

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

CONDITION DCM_MergeObject DCM_OBJECT **    src,
DCM_OBJECT **    dst
 

Definition at line 7998 of file 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.

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

char* DCM_Message CONDITION    condition
 

Definition at line 8321 of file mri_dicom_hdr.c.

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

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

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

Definition at line 2827 of file 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.

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

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

Definition at line 1001 of file 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.

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

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

Definition at line 2917 of file 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.

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

CONDITION DCM_PrintSequenceList DCM_OBJECT **    object,
DCM_TAG    tag
 

Definition at line 7844 of file 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().

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

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 1079 of file 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().

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

CONDITION DCM_RemoveElement DCM_OBJECT **    callerObject,
DCM_TAG    tag
 

Definition at line 1511 of file 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.

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

CONDITION DCM_RemoveGroup DCM_OBJECT **    callerObject,
unsigned short    group
 

Definition at line 3002 of file 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.

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

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 2104 of file 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.

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

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

Definition at line 2747 of file 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().

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

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

Definition at line 7566 of file 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.

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

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

Definition at line 7553 of file mri_dicom_hdr.c.

References c, RWC_printf(), and vm.

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

void dumpSL S32   sl,
long    vm
[static]
 

Definition at line 7516 of file mri_dicom_hdr.c.

References RWC_printf(), and vm.

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

void dumpSS short *    ss,
long    vm
[static]
 

Definition at line 7503 of file mri_dicom_hdr.c.

References RWC_printf(), and vm.

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

void dumpstack FILE *    fp [static]
 

Definition at line 644 of file mri_dicom_hdr.c.

References stackPtr.

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

void dumpUL U32   ul,
long    vm
[static]
 

Definition at line 7541 of file mri_dicom_hdr.c.

References RWC_printf(), U32, and vm.

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

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

Definition at line 7529 of file mri_dicom_hdr.c.

References RWC_printf(), and vm.

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

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 4440 of file 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.

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

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 4613 of file 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.

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

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

Definition at line 4306 of file 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.

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

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 4734 of file 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.

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

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

Definition at line 4252 of file mri_dicom_hdr.c.

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

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

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 5182 of file 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(), exportStream(), 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.

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

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 4195 of file 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.

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

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

Definition at line 5086 of file 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.

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

int fileSize int    fd [static]
 

Definition at line 4884 of file mri_dicom_hdr.c.

References fd.

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

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

Definition at line 3637 of file 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.

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

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

Definition at line 6888 of file 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.

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

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

Definition at line 3757 of file 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().

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

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

Definition at line 3938 of file 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().

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

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

Definition at line 7230 of file 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.

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

VRMAP* lookupVRCode const char *    code [static]
 

Definition at line 4166 of file mri_dicom_hdr.c.

References DIM_OF, and i.

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

unsigned long LST_Count LST_HEAD **    list
 

Definition at line 10869 of file mri_dicom_hdr.c.

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

LST_HEAD* LST_Create void   
 

Definition at line 10727 of file mri_dicom_hdr.c.

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

Referenced by copySequence(), DCM_AddFragment(), DCM_CopyObject(), DCM_CreateObject(), findCreateGroup(), handleGroupItem(), readFile(), and readSequence().

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

LST_NODE* LST_Current LST_HEAD **    list
 

Definition at line 10893 of file mri_dicom_hdr.c.

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

LST_NODE* LST_Dequeue LST_HEAD **    list
 

Definition at line 10811 of file mri_dicom_hdr.c.

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

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

CONDITION LST_Destroy LST_HEAD **    list
 

Definition at line 10750 of file mri_dicom_hdr.c.

References CTN_FREE, LST_LISTNOTEMPTY, and LST_NORMAL.

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

CONDITION LST_Enqueue LST_HEAD **    list,
LST_NODE   node
 

Definition at line 10769 of file mri_dicom_hdr.c.

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

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

LST_NODE* LST_Head LST_HEAD **    list
 

Definition at line 10881 of file mri_dicom_hdr.c.

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

LST_NODE* LST_Index LST_HEAD **    l,
int    index
 

Definition at line 11186 of file mri_dicom_hdr.c.

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

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

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

Definition at line 10918 of file 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.

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

LST_NODE* LST_Next LST_HEAD **    list
 

Definition at line 11053 of file mri_dicom_hdr.c.

References CURRENT.

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

LST_NODE* LST_Pop LST_HEAD **    list
 

Definition at line 10840 of file mri_dicom_hdr.c.

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

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

LST_NODE* LST_Position LST_HEAD **    list,
LST_NODE   node
 

Definition at line 11098 of file mri_dicom_hdr.c.

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

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

LST_NODE* LST_Previous LST_HEAD **    list
 

Definition at line 11074 of file mri_dicom_hdr.c.

References CURRENT.

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

CONDITION LST_Push LST_HEAD **    list,
LST_NODE   node
 

Definition at line 10789 of file mri_dicom_hdr.c.

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

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

LST_NODE* LST_Remove LST_HEAD **    list,
LST_END    dir
 

Definition at line 10981 of file 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.

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

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

Definition at line 11135 of file 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.

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

LST_NODE* LST_Tail LST_HEAD **    list
 

Definition at line 10906 of file mri_dicom_hdr.c.

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

void mapVRtoASCII DCM_VALUEREPRESENTATION    vr,
char *    s
[static]
 

Definition at line 4179 of file mri_dicom_hdr.c.

References DCM_VALUEREPRESENTATION, DIM_OF, and i.

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

char* mri_dicom_header char *    fname
 

Definition at line 203 of file 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.

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

void mri_dicom_nohex int    ii
 

Definition at line 173 of file mri_dicom_hdr.c.

References RWC_NOHEX_MASK, and rwc_opt.

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

void mri_dicom_noname int    ii
 

Definition at line 165 of file mri_dicom_hdr.c.

References RWC_NONAME_MASK, and rwc_opt.

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

void mri_dicom_pxlarr off_t *    poff,
unsigned int *    plen
 

Definition at line 153 of file mri_dicom_hdr.c.

References pxl_len, and pxl_off.

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

void mri_dicom_seterr int    vv
 

Definition at line 194 of file mri_dicom_hdr.c.

References rwc_err.

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

void mri_dicom_setvm int    vv
 

Definition at line 185 of file mri_dicom_hdr.c.

References rwc_vm.

00186 {
00187   rwc_vm = vv ;
00188 }

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

Definition at line 3547 of file 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.

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

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 6738 of file 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().

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

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 5728 of file 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(), readFile(), DCM_ELEMENT::representation, swapATGroupElement(), swapInPlace(), DCM_ELEMENT::tag, U32, updateObjectType(), updateSpecialElements(), and verifyFormat().

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

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 6930 of file 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().

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

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 6285 of file 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.

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

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

Definition at line 7455 of file 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.

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

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 6228 of file 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.

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

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 6546 of file 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.

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

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 6357 of file 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.

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

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

Definition at line 7640 of file mri_dicom_hdr.c.

References c, and name.

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

void RWC_clear_pbuf void    [static]
 

Definition at line 114 of file mri_dicom_hdr.c.

References free, npbuf, and pbuf.

Referenced by mri_dicom_header().

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

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

Definition at line 119 of file mri_dicom_hdr.c.

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

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

void RWC_set_endianosity void    [static]
 

Definition at line 86 of file mri_dicom_hdr.c.

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

Referenced by mri_dicom_header(), and mri_read_dicom().

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

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 6658 of file 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.

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

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

Definition at line 5059 of file 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.

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

void swapATGroupElement DCM_ELEMENT   e [static]
 

Definition at line 7483 of file mri_dicom_hdr.c.

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

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

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

Definition at line 4924 of file 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.

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

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

Definition at line 4040 of file 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.

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

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

Definition at line 4083 of file 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.

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

long UTL_ConvertDatetoLong const char *    date
 

Definition at line 11482 of file mri_dicom_hdr.c.

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

void UTL_ConvertFloattoTime double    dt,
char *    time
 

Definition at line 11607 of file mri_dicom_hdr.c.

References dt.

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

void UTL_ConvertLongtoDate long    ld,
char *    date
 

Definition at line 11504 of file mri_dicom_hdr.c.

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

double UTL_ConvertTimetoFloat const char *    time
 

Definition at line 11527 of file mri_dicom_hdr.c.

References i, and p.

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

CONDITION UTL_DateMatch char *    datestring,
char *    stm
 

Definition at line 11659 of file mri_dicom_hdr.c.

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

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

double UTL_DeltaTime void *    timeStamp
 

Definition at line 11826 of file mri_dicom_hdr.c.

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

void UTL_GetDicomDate char *    datestr
 

Definition at line 11762 of file mri_dicom_hdr.c.

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

void UTL_GetDicomTime char *    timestr
 

Definition at line 11782 of file mri_dicom_hdr.c.

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

void* UTL_GetTimeStamp  
 

Definition at line 11810 of file mri_dicom_hdr.c.

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

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

CTNBOOLEAN UTL_IsDirectory const char *    path
 

Definition at line 11953 of file mri_dicom_hdr.c.

References CTNBOOLEAN, i, and S_ISDIR.

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

void UTL_ReleaseTimeStamp void *    timeStamp
 

Definition at line 11848 of file mri_dicom_hdr.c.

References free, and UTL_TIMESTRUCTURE::key.

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

void UTL_SqueezeBlanks char *    s
 

Definition at line 11636 of file mri_dicom_hdr.c.

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

CONDITION UTL_TimeMatch char *    timestring,
char *    stm
 

Definition at line 11710 of file mri_dicom_hdr.c.

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

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

CONDITION UTL_VerifyCreatePath const char *    path
 

Definition at line 11863 of file mri_dicom_hdr.c.

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

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

CONDITION verifyFormat PRV_ELEMENT_ITEM   item [static]
 

Definition at line 5528 of file 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.

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

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

Definition at line 5027 of file mri_dicom_hdr.c.

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

Referenced by DCM_WriteFile().

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

Variable Documentation

DCMDICT ACQ_dictionary[] [static]
 

Definition at line 8658 of file 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 9685 of file 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 8470 of file 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 9651 of file 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 9638 of file 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 9672 of file mri_dicom_hdr.c.

int BIG_ORDER [static]
 

Definition at line 83 of file mri_dicom_hdr.c.

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

unsigned char ch[4]
 

Definition at line 4436 of file 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 8424 of file 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 9438 of file mri_dicom_hdr.c.

CTNBOOLEAN debug = FALSE [static]
 

Definition at line 864 of file 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 9393 of file 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 10128 of file 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 9762 of file mri_dicom_hdr.c.

EDB EDBStack[MAXEDB] [static]
 

Definition at line 355 of file mri_dicom_hdr.c.

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

Definition at line 356 of file 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 9738 of file mri_dicom_hdr.c.

DCMDICT G300A_dictionary[] [static]
 

Definition at line 9841 of file 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 10071 of file 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 10103 of file mri_dicom_hdr.c.

GROUPPTR group_dictionary[] [static]
 

Definition at line 10138 of file mri_dicom_hdr.c.

union { ... } groupElement
 

Referenced by exportData().

GROUP_DESCRIPTION groupTable[] [static]
 

Definition at line 10315 of file 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 9556 of file mri_dicom_hdr.c.

DCMDICT ID_dictionary[] [static]
 

Definition at line 8493 of file mri_dicom_hdr.c.

DCMDICT IMG_dictionary[] [static]
 

Definition at line 9015 of file 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 9693 of file mri_dicom_hdr.c.

int LITTLE_ENDIAN_ARCHITECTURE = -1 [static]
 

Definition at line 84 of file mri_dicom_hdr.c.

Referenced by RWC_set_endianosity().

int LITTLE_ORDER [static]
 

Definition at line 82 of file 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 9625 of file mri_dicom_hdr.c.

VECTOR messageVector[] [static]
 

Definition at line 8243 of file 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 8455 of file mri_dicom_hdr.c.

DCMDICT NMI_dictionary[] [static]
 

Definition at line 9468 of file mri_dicom_hdr.c.

int npbuf = 0 [static]
 

Definition at line 110 of file mri_dicom_hdr.c.

Referenced by RWC_clear_pbuf(), and RWC_printf().

DCMDICT OLY_dictionary[] [static]
 

Definition at line 9584 of file mri_dicom_hdr.c.

DCMDICT PAD_dictionary[] [static]
 

Initial value:

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

Definition at line 10121 of file mri_dicom_hdr.c.

DCMDICT PAT_dictionary[] [static]
 

Definition at line 8619 of file mri_dicom_hdr.c.

char* pbuf = NULL [static]
 

Definition at line 109 of file 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 9716 of file 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 9707 of file mri_dicom_hdr.c.

DCMDICT PRC_dictionary[] [static]
 

Definition at line 9205 of file 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 9728 of file 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 9619 of file mri_dicom_hdr.c.

unsigned int pxl_len = 0 [static]
 

Definition at line 151 of file mri_dicom_hdr.c.

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

off_t pxl_off = 0 [static]
 

Definition at line 150 of file mri_dicom_hdr.c.

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

DCMDICT REL_dictionary[] [static]
 

Definition at line 8952 of file 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 9406 of file mri_dicom_hdr.c.

int rwc_err = 1 [static]
 

Definition at line 192 of file mri_dicom_hdr.c.

Referenced by mri_dicom_seterr(), and readVRLength().

int rwc_fd [static]
 

Definition at line 201 of file mri_dicom_hdr.c.

Referenced by DCM_OpenFile(), and mri_dicom_header().

int rwc_opt = 0 [static]
 

Definition at line 160 of file mri_dicom_hdr.c.

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

int rwc_vm = 0 [static]
 

Definition at line 183 of file 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 9110 of file mri_dicom_hdr.c.

unsigned short sh[2]
 

Definition at line 4435 of file mri_dicom_hdr.c.

DCMDICT SSET_dictionary[] [static]
 

Definition at line 9791 of file mri_dicom_hdr.c.

int stackPtr = -1 [static]
 

Definition at line 354 of file 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 9142 of file mri_dicom_hdr.c.

VRMAP vrMap[] [static]
 

Definition at line 4130 of file mri_dicom_hdr.c.

DCMDICT WAV_dictionary[] [static]
 

Definition at line 9169 of file mri_dicom_hdr.c.

 

Powered by Plone

This site conforms to the following standards: