| 1 | Patches taken from the rdkit fork at this commit (there version
|
| 2 | AvalonToolkit_2.0.6-pre.2):
|
| 3 | https://github.com/rdkit/ava-formake/commit/d05bee0382b8f4696b2b4b05b0038fb7d559520a
|
| 4 |
|
| 5 | diff -ur a/src/main/C/common/reaccsio.c b/src/main/C/common/reaccsio.c
|
| 6 | |
| 7 | |
| 8 | @@ -322,34 +322,49 @@
|
| 9 | fprintf(fp,"\n");
|
| 10 | }
|
| 11 |
|
| 12 | +#define MAX_BONDLINE_FIELDS 7
|
| 13 | +#define BONDLINE_FIELD_LEN 3
|
| 14 | +
|
| 15 | int ReadREACCSBond(Fortran_FILE *fp, struct reaccs_bond_t *bp)
|
| 16 | {
|
| 17 | - int nitems, i;
|
| 18 | - char buffer[MAX_BUFFER+1];
|
| 19 | + int nitems, i, j, k;
|
| 20 | + int bond_line_len, n_chars, pos;
|
| 21 | + int *ptrarray[MAX_BONDLINE_FIELDS];
|
| 22 | + char c;
|
| 23 | + char buffer[BONDLINE_FIELD_LEN+1];
|
| 24 |
|
| 25 | if (fp->status != FORTRAN_NORMAL) return(fp->status);
|
| 26 |
|
| 27 | - strncpy(buffer,fp->buffer,MAX_BUFFER);
|
| 28 | - /* zero pad only atom numbers! */
|
| 29 | - for (i=0; i<6; i++) if (buffer[i] == ' ') buffer[i] = '0';
|
| 30 | -
|
| 31 | bp->stereo_symbol = 0;
|
| 32 | bp->dummy = 0;
|
| 33 | bp->topography = 0;
|
| 34 | bp->reaction_mark = NONE;
|
| 35 | - // make sure spaces are interpreted the Fortran-way
|
| 36 | - for (i=9; i<strlen(buffer) && i<21; i+=3)
|
| 37 | - {
|
| 38 | - if ((i+1)<strlen(buffer) && buffer[i+1]==' ') buffer[i+1] = '0';
|
| 39 | - if ((i+2)<strlen(buffer) && buffer[i+2]==' ') buffer[i+2] = '0';
|
| 40 | + ptrarray[0] = &bp->atoms[0];
|
| 41 | + ptrarray[1] = &bp->atoms[1];
|
| 42 | + ptrarray[2] = &bp->bond_type;
|
| 43 | + ptrarray[3] = &bp->stereo_symbol;
|
| 44 | + ptrarray[4] = &bp->dummy;
|
| 45 | + ptrarray[5] = &bp->topography;
|
| 46 | + ptrarray[6] = &bp->reaction_mark;
|
| 47 | + bond_line_len = strlen(fp->buffer);
|
| 48 | + nitems = bond_line_len ? (bond_line_len - 1) / BONDLINE_FIELD_LEN + 1 : 0;
|
| 49 | + if (nitems > MAX_BONDLINE_FIELDS)
|
| 50 | + nitems = MAX_BONDLINE_FIELDS;
|
| 51 | + for (i = 0; i < nitems; ++i)
|
| 52 | + {
|
| 53 | + pos = i * BONDLINE_FIELD_LEN;
|
| 54 | + memset(buffer, 0, BONDLINE_FIELD_LEN + 1);
|
| 55 | + n_chars = bond_line_len - pos;
|
| 56 | + if (n_chars > BONDLINE_FIELD_LEN)
|
| 57 | + n_chars = BONDLINE_FIELD_LEN;
|
| 58 | + for (j = 0, k = 0; j < n_chars; ++j)
|
| 59 | + {
|
| 60 | + c = fp->buffer[pos + j];
|
| 61 | + if (c != ' ')
|
| 62 | + buffer[k++] = c;
|
| 63 | + }
|
| 64 | + sscanf(buffer, "%3d", ptrarray[i]);
|
| 65 | }
|
| 66 | - nitems = sscanf(buffer,
|
| 67 | - "%3d%3d%3d%3d%3d%3d%3d",
|
| 68 | - &bp->atoms[0], &bp->atoms[1],
|
| 69 | - &bp->bond_type, &bp->stereo_symbol,
|
| 70 | - &bp->dummy,
|
| 71 | - &bp->topography, &bp->reaction_mark);
|
| 72 | -
|
| 73 | if (nitems >= 3)
|
| 74 | {
|
| 75 | GetBuffer(fp);
|
| 76 | @@ -1582,6 +1597,8 @@
|
| 77 |
|
| 78 | PrintREACCSMolecule(fp, mp,"");
|
| 79 |
|
| 80 | + fputc('\0', fp);
|
| 81 | + fflush(fp);
|
| 82 | rewind(fp);
|
| 83 |
|
| 84 | MolStr = _ReadFile(fp);
|
| 85 | diff -ur a/src/main/C/programs/struchk.c b/src/main/C/programs/struchk.c
|
| 86 | |
| 87 | |
| 88 | @@ -1581,6 +1581,22 @@
|
| 89 |
|
| 90 | if ((result & SIZE_CHECK_FAILED) == 0)
|
| 91 | {
|
| 92 | + for (i = 0; i < mp->n_bonds; ++i) {
|
| 93 | + for (j = 0; j < 2; ++j) {
|
| 94 | + if (mp->bond_array[i].atoms[j] < 1 || mp->bond_array[i].atoms[j] > mp->n_atoms)
|
| 95 | + {
|
| 96 | + snprintf(msg_buffer, MAXMSG,
|
| 97 | + "%10s : illegal atom # (%d, max allowed is %d) in bond %d",
|
| 98 | + mp->name, mp->bond_array[i].atoms[j], mp->n_atoms, i + 1);
|
| 99 | + AddMsgToList(msg_buffer);
|
| 100 | + result |= SIZE_CHECK_FAILED;
|
| 101 | + }
|
| 102 | + }
|
| 103 | + }
|
| 104 | + }
|
| 105 | +
|
| 106 | + if ((result & SIZE_CHECK_FAILED) == 0)
|
| 107 | + {
|
| 108 | if (convert_atom_texts)
|
| 109 | {
|
| 110 | tmp = ConvertAtomAliases(mp);
|