bool InchiLineFormat::read(const std::string &formula, chemkit::Molecule *molecule) { // verify formula if(formula.empty()){ return 0; } QString formulaString = formula.c_str(); // add `InChI=` to the start if it is not there if(formula.compare(0, 6, "InChI=") != 0){ formulaString.prepend("InChI="); } // setup input struct inchi_InputINCHI input; input.szInChI = new char[formulaString.size()+1]; strncpy(input.szInChI, formulaString.toAscii().data(), formulaString.size()+1); input.szOptions = 0; // get inchi output inchi_OutputStruct output; int ret = GetStructFromStdINCHI(&input, &output); Q_UNUSED(ret); // build molecule from inchi output QVector<chemkit::Atom *> atoms(output.num_atoms); bool addHydrogens = option("add-hydrogens").toBool(); // add atoms for(int i = 0; i < output.num_atoms; i++){ inchi_Atom *inchiAtom = &output.atom[i]; chemkit::Atom *atom = molecule->addAtom(inchiAtom->elname); atoms[i] = atom; // add implicit hydrogens (if enabled) if(addHydrogens){ for(int j = 0; j < inchiAtom->num_iso_H[0]; j++){ chemkit::Atom *hydrogen = molecule->addAtom(chemkit::Atom::Hydrogen); molecule->addBond(atom, hydrogen); } } } // add bonds for(int i = 0; i < output.num_atoms; i++){ inchi_Atom *inchiAtom = &output.atom[i]; chemkit::Atom *atom = atoms[i]; for(int j = 0; j < inchiAtom->num_bonds; j++){ chemkit::Atom *neighbor = atoms[inchiAtom->neighbor[j]]; molecule->addBond(atom, neighbor, inchiAtom->bond_type[j]); } } // free input and output structures delete [] input.szInChI; FreeStructFromStdINCHI(&output); return true; }