int main()

in utils/indigo-deco/main.cpp [143:397]


int main(int argc, const char** argv)
{
    int i;
    int done_with_options = 0;
    int approximate = 0;
    int scaffold = 0;
    int aromatic = 1;
    const char* outfile_hl = 0;
    const char* outfile_rg = 0;
    const char* outfile_maxscaf = 0;
    const char* outfile_allscafs = 0;
    const char* outfile_scaf_r = 0;
    int deco = 0;
    int structures = 0;

    const qword session = indigoAllocSessionId();
    indigoSetErrorHandler(onError, 0);

    printf("R-Group deconvolution utility, powered by Indigo API version %s\n", indigoVersion());

    structures = indigoCreateArray();

    indigoSetOptionBool("treat-x-as-pseudoatom", 1);
    indigoSetOptionBool("ignore-stereochemistry-errors", 1);

    for (i = 1; i < argc; i++)
    {
        if (!done_with_options && argv[i][0] == '-')
        {
            if (strcmp(argv[i], "--") == 0)
                done_with_options = 1;
            else if (strcmp(argv[i], "-h") == 0 || strcmp(argv[i], "-?") == 0 || strcmp(argv[i], "/?") == 0 || strcmp(argv[i], "-help") == 0 ||
                     strcmp(argv[i], "--help") == 0)
            {
                _printHelpMessage();
                return 0;
            }
            else if (strcmp(argv[i], "-a") == 0)
                approximate = 1;
            else if (strcmp(argv[i], "-l") == 0)
            {
                if (++i == argc)
                {
                    fprintf(stderr, "expecting filename after -l\n");
                    return -1;
                }
                scaffold = indigoLoadMoleculeFromFile(argv[i]);
            }
            else if (strcmp(argv[i], "-o") == 0)
            {
                if (++i == argc)
                {
                    fprintf(stderr, "expecting filename after -o\n");
                    return -1;
                }
                outfile_hl = argv[i];
            }
            else if (strcmp(argv[i], "-r") == 0)
            {
                if (++i == argc)
                {
                    fprintf(stderr, "expecting filename after -r\n");
                    return -1;
                }
                outfile_rg = argv[i];
            }
            else if (strcmp(argv[i], "-s") == 0)
            {
                if (++i == argc)
                {
                    fprintf(stderr, "expecting filename after -s\n");
                    return -1;
                }
                outfile_maxscaf = argv[i];
            }
            else if (strcmp(argv[i], "-sr") == 0)
            {
                if (++i == argc)
                {
                    fprintf(stderr, "expecting filename after -sr\n");
                    return -1;
                }
                outfile_scaf_r = argv[i];
            }
            else if (strcmp(argv[i], "-S") == 0)
            {
                if (++i == argc)
                {
                    fprintf(stderr, "expecting filename after -S\n");
                    return -1;
                }
                outfile_allscafs = argv[i];
            }
            else if (strcmp(argv[i], "-na") == 0)
                aromatic = 0;
            else
            {
                fprintf(stderr, "Unknown option: %s", argv[i]);
                _printHelpMessage();
                return -1;
            }
        }
        else
        {
            char dirname[1024];
            char errbuf[1024];
            const char* pattern = 0;
            int k;

            for (k = (int)strlen(argv[i]) - 1; k >= 0; k--)
                if (argv[i][k] == '/' || argv[i][k] == '\\')
                    break;

            if (k == -1)
                strncpy(dirname, ".", sizeof(dirname));
            else if (k == 0)
            {
                dirname[0] = argv[i][0];
                dirname[1] = 0;
            }
            else if (k == strlen(argv[i]) - 1)
            {
                fprintf(stderr, "can not handle filenames ending with a slash\n");
                return -1;
            }
            else if (k > sizeof(dirname) - 1)
            {
                fprintf(stderr, "filename too long\n");
                return -1;
            }
            else
            {
                memcpy(dirname, argv[i], k);
                dirname[k] = 0;
            }

            _replaceSlashes(dirname);

            pattern = argv[i] + k + 1;

            for (const auto& path : std::filesystem::directory_iterator(dirname))
            {
                const char* current_filename = path.path().filename().string().c_str();
                if (!matchesPattern(current_filename, pattern))
                {
                    continue;
                }
                _handleInputFile(path.path().string().c_str(), structures);
            }
        }
    }

    if (indigoCount(structures) < 1)
    {
        fprintf(stderr, "no input structures\n");
        _printHelpMessage();
        return -1;
    }

    printf("got %d input structures\n", indigoCount(structures));

    indigoSetOptionBool("deconvolution-aromatization", aromatic);

    if (scaffold == 0)
    {
        printf("calculating scaffold... ");
        fflush(stdout);
        if (approximate)
            scaffold = indigoExtractCommonScaffold(structures, "approximate");
        else
            scaffold = indigoExtractCommonScaffold(structures, "exact");
        printf("done\n");
        fflush(stdout);
    }

    if (outfile_maxscaf != 0)
    {
        printf("saving the scaffold to %s\n", outfile_maxscaf);
        indigoSaveMolfileToFile(scaffold, outfile_maxscaf);
    }

    if (outfile_allscafs != 0)
    {
        int output = indigoWriteFile(outfile_allscafs);
        int allscafs = indigoAllScaffolds(scaffold);
        int item, iter = indigoIterateArray(allscafs);

        printf("saving all obtained scaffolds (%d total) to %s\n", indigoCount(allscafs), outfile_allscafs);

        while ((item = indigoNext(iter)))
        {
            indigoSdfAppend(output, item);
            indigoFree(item);
        }
        indigoFree(iter);
        indigoFree(output);
    }

    if (outfile_hl == 0 && outfile_rg == 0 && outfile_scaf_r == 0)
    {
        printf("none of -o, -r, -sr specified, nothing left to do\n");
        return 0;
    }

    printf("decomposing the structures... ");
    fflush(stdout);
    deco = indigoDecomposeMolecules(scaffold, structures);
    printf("done\n");
    fflush(stdout);

    if (outfile_scaf_r != 0)
    {
        int sr = indigoDecomposedMoleculeScaffold(deco);
        indigoLayout(sr);
        printf("saving the scaffold with R-sites to %s\n", outfile_scaf_r);
        indigoSaveMolfileToFile(sr, outfile_scaf_r);
    }

    if (outfile_hl != 0)
    {
        int output = indigoWriteFile(outfile_hl);
        int item, iter = indigoIterateDecomposedMolecules(deco);

        printf("saving the highlighted structures to %s\n", outfile_hl);

        while ((item = indigoNext(iter)))
        {
            indigoSdfAppend(output, indigoDecomposedMoleculeHighlighted(item));
            indigoFree(item);
        }

        indigoFree(iter);
        indigoFree(output);
    }

    if (outfile_rg != 0)
    {
        int output = indigoWriteFile(outfile_rg);
        int item, iter = indigoIterateDecomposedMolecules(deco);

        printf("saving the structures with R-groups to %s\n", outfile_rg);

        while ((item = indigoNext(iter)))
        {
            indigoSdfAppend(output, indigoDecomposedMoleculeWithRGroups(item));
            indigoFree(item);
        }

        indigoFree(iter);
        indigoFree(output);
    }

    indigoReleaseSessionId(session);
    return 0;
};