8#include "tpcclibConfig.h"
21static char *info[] = {
22 "List the header contents of a DICOM file.",
24 "Usage: @P [options] dicomfile [> outputfile]",
27 " -group=<tag group>",
28 " List only contents with specified tag group.",
29 " -element=<tag element>",
30 " List only contents with specified tag element.",
32 " List (y, default) or do not list (n) the element tag.",
34 " List (y, default) or do not list (n) the tag description.",
36 " List (y) or do not list (n, default) the element VR.",
38 " List (y) or do not list (n, default) the element VL.",
42 " @P -group=0002 -element=0010 f1.dcm",
44 "See also: dcmdict, dcmframe, dcmmlist, dcmxform, lmhdr, ana_lhdr, iftlist",
46 "Keywords: DICOM, header",
65int main(
int argc,
char **argv)
67 int ai, help=0, version=0, verbose=1;
69 int group=-1, element=-1;
75 char dcmfile[FILENAME_MAX];
81 if(argc==1) {
tpcPrintUsage(argv[0], info, stderr);
return(1);}
84 for(ai=1; ai<argc; ai++)
if(*argv[ai]==
'-') {
86 cptr=argv[ai]+1;
if(*cptr==
'-') cptr++;
if(!*cptr)
continue;
87 if(strncasecmp(cptr,
"GROUP=", 6)==0) {
89 if(sscanf(cptr+6,
"%x", &ui)==1) {group=(int)ui;
continue;}
90 }
else if(strncasecmp(cptr,
"ELEMENT=", 8)==0) {
92 if(sscanf(cptr+8,
"%x", &ui)==1) {element=(int)ui;
continue;}
93 }
else if(strcasecmp(cptr,
"VR")==0) {
95 }
else if(strncasecmp(cptr,
"VR=", 3)==0) {
96 if((listVR=
tpcYesNo(cptr+3))>=0)
continue;
97 }
else if(strncasecmp(cptr,
"VL=", 3)==0) {
98 if((listVL=
tpcYesNo(cptr+3))>=0)
continue;
99 }
else if(strncasecmp(cptr,
"TAG=", 4)==0) {
100 if((listTag=
tpcYesNo(cptr+4))>=0)
continue;
101 }
else if(strncasecmp(cptr,
"TAGNAME=", 8)==0) {
102 if((listTagname=
tpcYesNo(cptr+8))>=0)
continue;
103 }
else if(strncasecmp(cptr,
"VALUE=", 6)==0) {
104 if((listValue=
tpcYesNo(cptr+6))>=0)
continue;
106 fprintf(stderr,
"Error: invalid option '%s'.\n", argv[ai]);
115 if(help==2) {
tpcHtmlUsage(argv[0], info,
"");
return(0);}
120 if(ai<argc)
strlcpy(dcmfile, argv[ai++], FILENAME_MAX);
122 fprintf(stderr,
"Error: invalid argument '%s'.\n", argv[ai]);
127 fprintf(stderr,
"Error: missing command-line argument; use option --help\n");
133 printf(
"dcmfile := %s\n", dcmfile);
135 if(group<0) printf(
"0xXXXX,");
136 else printf(
"0x%04x,", (
unsigned short int)group);
137 if(element<0) printf(
"0xXXXX)\n");
138 else printf(
"0x%04x)\n", (
unsigned short int)element);
139 printf(
"listVR := %d\n", listVR);
140 printf(
"listVL := %d\n", listVL);
141 printf(
"listTag := %d\n", listTag);
142 printf(
"listTagname := %d\n", listTagname);
143 printf(
"listValue := %d\n", listValue);
147 if(!listVR && !listVL && !listTag && !listTagname && !listValue) {
148 fprintf(stderr,
"Error: all prints were turned off.\n");
167 unsigned int itemNr=0;
168 unsigned int listedNr=0;
171 unsigned int parent1Shown=0;
173 if((group<0 || group==d1->tag.group) &&
174 (element<0 || element==d1->tag.element))
181 if((listTag || listTagname) && (listVR || listVL || listValue)) printf(
":= ");
185 if(listVL && d1->
vl!=0xFFFFFFFF) printf(
"%u ", d1->
vl);
198 unsigned int parent2Shown=0;
200 if((group<0 || group==d2->tag.group) &&
201 (element<0 || element==d2->tag.element))
217 if((listTag || listTagname) && (listVR || listVL || listValue)) printf(
":= ");
221 if(listVL && d2->
vl!=0xFFFFFFFF) printf(
"%u ", d2->
vl);
235 if((group>=0 && group!=d3->
tag.
group) ||
260 if((listTag || listTagname) && (listVR || listValue)) printf(
":= ");
264 if(listVL && d3->
vl!=0xFFFFFFFF) printf(
"%u ", d3->
vl);
272 itemNr++; listedNr++;
276 itemNr++; listedNr++;
280 itemNr++; listedNr++;
286 printf(
"elementNr := %d\n", itemNr);
287 if(listedNr!=itemNr || verbose>2)
288 printf(
"selected_tags := %d\n", listedNr);
291 fprintf(stderr,
"Error: invalid header in %s\n", dcmfile);
295 fprintf(stderr,
"Error: required tags not found.\n");
void dcmfileInit(DCMFILE *d)
void dcmfileFree(DCMFILE *d)
unsigned short int dcmfileMaxDepth(DCMFILE *df)
char * dcmValueString(DCMITEM *d)
char * dcmDictIndexDescr(unsigned int i)
unsigned int dcmDictFindTag(DCMTAG *tag)
int dcmFileRead(const char *filename, DCMFILE *dcm, const short int headerOnly, TPCSTATUS *status)
char * dcmVRName(dcmvr id)
int tpcProcessStdOptions(const char *s, int *print_usage, int *print_version, int *verbose_level)
int tpcYesNo(const char *s)
int tpcHtmlUsage(const char *program, char *text[], const char *path)
void tpcPrintBuild(const char *program, FILE *fp)
void tpcPrintUsage(const char *program, char *text[], FILE *fp)
void statusInit(TPCSTATUS *s)
char * errorMsg(tpcerror e)
void statusSet(TPCSTATUS *s, const char *func, const char *srcfile, int srcline, tpcerror error)
size_t strlcpy(char *dst, const char *src, size_t dstsize)
struct DCMITEM * child_item
struct DCMITEM * next_item
unsigned short int element
int verbose
Verbose level, used by statusPrint() etc.
tpcerror error
Error code.
Header file for libtpcdcm.
Header file for library libtpcextensions.