projects/guix·blob python-team · refs

110 lines · 3.4 KiB

1Patches taken from the rdkit fork at this commit (there version
2AvalonToolkit_2.0.6-pre.2):
3https://github.com/rdkit/ava-formake/commit/d05bee0382b8f4696b2b4b05b0038fb7d559520a
4
5diff -ur a/src/main/C/common/reaccsio.c b/src/main/C/common/reaccsio.c
6--- a/src/main/C/common/reaccsio.c
7+++ b/src/main/C/common/reaccsio.c
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);
85diff -ur a/src/main/C/programs/struchk.c b/src/main/C/programs/struchk.c
86--- a/src/main/C/programs/struchk.c
87+++ b/src/main/C/programs/struchk.c
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);