/* * * Copyright (C) 1994-2021, OFFIS e.V. * All rights reserved. See COPYRIGHT file for details. * * This software and supporting documentation were developed by * * OFFIS e.V. * R&D Division Health * Escherweg 2 * D-26121 Oldenburg, Germany * * * Module: dcmdata * * Author: Andrew Hewett * * Purpose: * Generate a builtin data dictionary which can be compiled into * the dcmdata library. * */ #include "dcmtk/config/osconfig.h" /* make sure OS specific configuration is included first */ #include "dcmtk/dcmdata/dcdict.h" #include "dcmtk/dcmdata/cmdlnarg.h" #include "dcmtk/ofstd/ofstring.h" #include "dcmtk/ofstd/ofdatime.h" #include "dcmtk/ofstd/ofstd.h" #include "dcmtk/dcmdata/dcdicent.h" #define PRIVATE_TAGS_IFNAME "ENABLE_PRIVATE_TAGS" void DcmDataDictionary::loadBuiltinDictionary() { /* * * Empty Stub. ** ** Used to keep compiler happy when building mkdictbi since it links itself ** against dcdict.cc. */ } static const char* rr2s(DcmDictRangeRestriction rr) { const char* s; switch (rr) { case DcmDictRange_Unspecified: s = "DcmDictRange_Unspecified"; break; case DcmDictRange_Odd: s = "DcmDictRange_Odd"; break; case DcmDictRange_Even: s = "DcmDictRange_Even"; break; default: s = "DcmDictRange_GENERATOR_ERROR"; break; } return s; } static void printSimpleEntry(FILE* fout, const DcmDictEntry* e, OFBool& isFirst, OFBool& isPrivate) { const char *c = e->getPrivateCreator(); if (c && !isPrivate) { fprintf(fout, "#ifdef %s\n", PRIVATE_TAGS_IFNAME); isPrivate = OFTrue; } else if (isPrivate && !c) { fprintf(fout, "#endif\n"); isPrivate = OFFalse; } if (isFirst) { fprintf(fout, " "); isFirst = OFFalse; } else fprintf(fout, " , "); fprintf(fout, "{ 0x%04x, 0x%04x, 0x%04x, 0x%04x,\n", e->getGroup(), e->getElement(), e->getUpperGroup(), e->getUpperElement()); fprintf(fout, " EVR_%s, \"%s\", %d, %d, \"%s\",\n", e->getVR().getVRName(), e->getTagName(), e->getVMMin(), e->getVMMax(), OFSTRING_GUARD(e->getStandardVersion())); fprintf(fout, " %s, %s,\n", rr2s(e->getGroupRangeRestriction()), rr2s(e->getElementRangeRestriction())); if (c) fprintf(fout, " \"%s\" }\n", c); else fprintf(fout, " NULL }\n"); } int main(int argc, char* argv[]) { char* progname; const char* filename = NULL; FILE* fout = NULL; DcmDictEntry* e = NULL; OFStandard::initializeNetwork(); prepareCmdLineArgs(argc, argv, "mkdictbi"); DcmDataDictionary& globalDataDict = dcmDataDict.wrlock(); /* clear out any preloaded dictionary */ globalDataDict.clear(); progname = argv[0]; if (argc >= 3 && 0 == strcmp(argv[1], "-o")) { filename = argv[2]; argv += 2; argc -= 2; } int i; for (i=1; i 1) { fprintf(fout, "** From: %s\n", argv[1]); for (i=2; igroup, b->element,\n"); fprintf(fout, " b->upperGroup, b->upperElement, b->evr,\n"); fprintf(fout, " b->tagName, b->vmMin, b->vmMax,\n"); fprintf(fout, " b->standardVersion, OFFalse, b->privateCreator);\n"); fprintf(fout, " e->setGroupRangeRestriction(b->groupRestriction);\n"); fprintf(fout, " e->setElementRangeRestriction(b->elementRestriction);\n"); fprintf(fout, " addEntry(e);\n"); fprintf(fout, " }\n"); fprintf(fout, "}\n"); fprintf(fout, "\n"); fprintf(fout, "\n"); fprintf(fout, "#else // DCM_DICT_DEFAULT == DCM_DICT_DEFAULT_USE_BUILTIN\n"); fprintf(fout, "void\n"); fprintf(fout, "DcmDataDictionary::loadBuiltinDictionary()\n"); fprintf(fout, "{\n"); fprintf(fout, "/*\n"); fprintf(fout, " ** Empty Stub.\n"); fprintf(fout, " **\n"); fprintf(fout, " ** We don't want a populated built-in data dictionary. In order to enable it,\n"); fprintf(fout, " ** define DCM_DICT_DEFAULT == DCM_DICT_DEFAULT_USE_BUILTIN (1).\n"); fprintf(fout, " ** To re-create the builtin dictionary from a textfile like dicom.dic,\n"); fprintf(fout, " ** use dcmdata/libsrc/mkdictbi.\n"); fprintf(fout, "*/\n"); fprintf(fout, "}\n"); fprintf(fout, "\n"); fprintf(fout, "#endif // DCM_DICT_DEFAULT == DCM_DICT_DEFAULT_USE_BUILTIN\n"); fprintf(fout, "\n"); dcmDataDict.wrunlock(); if (filename) { fclose(fout); } return 0; }