rino 0.1.0 → 0.2.0
Sign up to get free protection for your applications and to get access to all the features.
- data/Rakefile +1 -1
- data/ext/extconf.rb +1 -24
- data/ext/libinchi.so +0 -0
- data/ext/src/aux2atom.h +120 -39
- data/ext/src/comdef.h +3 -3
- data/ext/src/dispstru.c +2547 -0
- data/ext/src/dispstru.h +73 -0
- data/ext/src/extr_ct.h +5 -2
- data/ext/src/ichi.h +27 -11
- data/ext/src/ichi_bns.c +1800 -254
- data/ext/src/ichi_bns.h +205 -4
- data/ext/src/ichican2.c +197 -86
- data/ext/src/ichicano.c +8 -13
- data/ext/src/ichicano.h +2 -2
- data/ext/src/ichicans.c +11 -6
- data/ext/src/ichicant.h +2 -2
- data/ext/src/ichicomn.h +2 -2
- data/ext/src/ichicomp.h +19 -4
- data/ext/src/ichidrp.h +9 -5
- data/ext/src/ichierr.h +5 -3
- data/ext/src/ichiisot.c +2 -2
- data/ext/src/ichimain.c +461 -0
- data/ext/src/ichimain.h +23 -15
- data/ext/src/ichimak2.c +6 -6
- data/ext/src/ichimake.c +843 -42
- data/ext/src/ichimake.h +4 -2
- data/ext/src/ichimap1.c +5 -5
- data/ext/src/ichimap2.c +2 -2
- data/ext/src/ichimap4.c +34 -21
- data/ext/src/ichinorm.c +11 -5
- data/ext/src/ichinorm.h +3 -2
- data/ext/src/ichiparm.c +2 -2
- data/ext/src/ichiparm.h +232 -30
- data/ext/src/ichiprt1.c +35 -11
- data/ext/src/ichiprt2.c +78 -7
- data/ext/src/ichiprt3.c +300 -120
- data/ext/src/ichiqueu.c +17 -2
- data/ext/src/ichiread.c +6932 -0
- data/ext/src/ichiring.c +3 -2
- data/ext/src/ichiring.h +2 -2
- data/ext/src/ichirvr1.c +4891 -0
- data/ext/src/ichirvr2.c +6344 -0
- data/ext/src/ichirvr3.c +5499 -0
- data/ext/src/ichirvr4.c +3177 -0
- data/ext/src/ichirvr5.c +1166 -0
- data/ext/src/ichirvr6.c +1287 -0
- data/ext/src/ichirvr7.c +2319 -0
- data/ext/src/ichirvrs.h +882 -0
- data/ext/src/ichisize.h +2 -2
- data/ext/src/ichisort.c +5 -5
- data/ext/src/ichister.c +281 -86
- data/ext/src/ichister.h +9 -3
- data/ext/src/ichitaut.c +208 -9
- data/ext/src/ichitaut.h +13 -11
- data/ext/src/ichitime.h +16 -2
- data/ext/src/inchicmp.h +107 -0
- data/ext/src/inpdef.h +6 -3
- data/ext/src/libinchi_wrap.c +912 -0
- data/ext/src/lreadmol.h +34 -31
- data/ext/src/mode.h +244 -7
- data/ext/src/mol2atom.c +1060 -0
- data/ext/src/mol2atom.h +31 -0
- data/ext/src/readinch.c +239 -0
- data/ext/src/readmol.c +28 -0
- data/ext/src/{e_readmol.h → readmol.h} +7 -9
- data/ext/src/runichi.c +251 -177
- data/ext/src/strutil.c +444 -238
- data/ext/src/strutil.h +150 -11
- data/ext/src/util.c +176 -118
- data/ext/src/util.h +15 -3
- data/lib/rino.rb +71 -3
- data/test/test.rb +33 -4
- metadata +22 -34
- data/ext/ruby_inchi_main.so +0 -0
- data/ext/src/e_0dstereo.c +0 -3014
- data/ext/src/e_0dstereo.h +0 -31
- data/ext/src/e_comdef.h +0 -57
- data/ext/src/e_ctl_data.h +0 -147
- data/ext/src/e_ichi_io.c +0 -498
- data/ext/src/e_ichi_io.h +0 -40
- data/ext/src/e_ichi_parms.c +0 -37
- data/ext/src/e_ichi_parms.h +0 -41
- data/ext/src/e_ichicomp.h +0 -50
- data/ext/src/e_ichierr.h +0 -40
- data/ext/src/e_ichimain.c +0 -593
- data/ext/src/e_ichisize.h +0 -43
- data/ext/src/e_inchi_atom.c +0 -75
- data/ext/src/e_inchi_atom.h +0 -33
- data/ext/src/e_inpdef.h +0 -41
- data/ext/src/e_mode.h +0 -706
- data/ext/src/e_mol2atom.c +0 -649
- data/ext/src/e_readinch.c +0 -58
- data/ext/src/e_readmol.c +0 -54
- data/ext/src/e_readstru.c +0 -251
- data/ext/src/e_readstru.h +0 -33
- data/ext/src/e_util.c +0 -284
- data/ext/src/e_util.h +0 -61
- data/ext/src/ichilnct.c +0 -286
- data/ext/src/inchi_api.h +0 -670
- data/ext/src/inchi_dll.c +0 -1480
- data/ext/src/inchi_dll.h +0 -34
- data/ext/src/inchi_dll_main.c +0 -23
- data/ext/src/inchi_dll_main.h +0 -31
- data/ext/src/ruby_inchi_main.c +0 -558
data/ext/src/ichimake.h
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
3
|
* International Chemical Identifier (InChI)
|
4
4
|
* Version 1
|
5
|
-
* Software version 1.
|
6
|
-
*
|
5
|
+
* Software version 1.01
|
6
|
+
* July 21, 2006
|
7
7
|
* Developed at NIST
|
8
8
|
*/
|
9
9
|
|
@@ -70,6 +70,8 @@
|
|
70
70
|
#define iiEq2ISO 0x0080 /* isotopic */
|
71
71
|
#define iiEq2INV 0x0100 /* equal to inverted (stereo sp3) or to numbering of inverted stereo */
|
72
72
|
|
73
|
+
#define iiEmpty 0x0200 /* item is empty while in the preceding layer the item is not empty */
|
74
|
+
|
73
75
|
/*********************** Printing strings external declarations *******************************/
|
74
76
|
|
75
77
|
extern const char sCompDelim[];
|
data/ext/src/ichimap1.c
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
3
|
* International Chemical Identifier (InChI)
|
4
4
|
* Version 1
|
5
|
-
* Software version 1.
|
6
|
-
*
|
5
|
+
* Software version 1.01
|
6
|
+
* July 21, 2006
|
7
7
|
* Developed at NIST
|
8
8
|
*/
|
9
9
|
|
@@ -38,18 +38,18 @@ int All_SC_Same( AT_RANK canon_rank1, /* canonical number */
|
|
38
38
|
AT_RANK r1 = pRankStack1[0][n1];
|
39
39
|
int iMax1 = (int)r1;
|
40
40
|
int i1, s1;
|
41
|
-
int bFound=0, stereo_atom_parity;
|
41
|
+
int bFound=0, stereo_atom_parity=-1;
|
42
42
|
|
43
43
|
/* find one stereo atom such that canon_rank1 can be mapped on it */
|
44
44
|
for ( i1 = 1; i1 <= iMax1 && r1 == pRankStack2[0][s1=(int)pRankStack2[1][iMax1-i1]]; i1++ ) {
|
45
45
|
if ( at[s1].stereo_bond_neighbor[0] ) {
|
46
|
-
bFound=0; /* at[s1] is not sp3-stereogenic: it belongs to stereobond */
|
46
|
+
bFound=0; /* at[s1] is not sp3-stereogenic: it belongs to a stereobond */
|
47
47
|
break;
|
48
48
|
} else
|
49
49
|
if ( i1 == 1 ) {
|
50
50
|
stereo_atom_parity = PARITY_VAL(at[s1].stereo_atom_parity);
|
51
51
|
if ( !ATOM_PARITY_KNOWN(stereo_atom_parity) ) {
|
52
|
-
bFound=0; /* at[s1] does not have KNOWN parity */
|
52
|
+
bFound=0; /* at[s1] does not have a KNOWN parity */
|
53
53
|
break;
|
54
54
|
}
|
55
55
|
} else
|
data/ext/src/ichimap2.c
CHANGED
data/ext/src/ichimap4.c
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
3
|
* International Chemical Identifier (InChI)
|
4
4
|
* Version 1
|
5
|
-
* Software version 1.
|
6
|
-
*
|
5
|
+
* Software version 1.01
|
6
|
+
* July 21, 2006
|
7
7
|
* Developed at NIST
|
8
8
|
*/
|
9
9
|
|
@@ -67,7 +67,6 @@ int map_stereo_bonds4 (
|
|
67
67
|
*/
|
68
68
|
int tpos1;
|
69
69
|
AT_STEREO_DBLE prevBond;
|
70
|
-
|
71
70
|
tpos1 = CurTreeGetPos( cur_tree );
|
72
71
|
|
73
72
|
total_restart:
|
@@ -604,29 +603,29 @@ repeat_all:
|
|
604
603
|
at_rank_canon_n1 = 0;
|
605
604
|
at_rank_canon_n2 = 0;
|
606
605
|
for ( i = 0; i < num1; i ++ ) {
|
607
|
-
int
|
606
|
+
int at_from_n1, at_to_n1, at_no_n1_num_success = 0;
|
608
607
|
istk2 = istk;
|
609
608
|
if ( num1 == 2 ) {
|
610
609
|
at_rank_canon_n1 = nCanonRankFrom[EN1[0].from_at];
|
611
610
|
/* an additional neighbor mapping is necessary; */
|
612
611
|
/* we need to map only one at_from1 neighbor to make all neighbors have different ranks */
|
613
612
|
|
614
|
-
|
615
|
-
|
613
|
+
at_from_n1 = EN1[0].from_at;
|
614
|
+
at_to_n1 = EN1[0].to_at[i];
|
616
615
|
|
617
616
|
if ( tpos1 < CurTreeGetPos( cur_tree ) &&
|
618
617
|
1 == CurTreeIsLastRank( cur_tree, at_rank_canon_n1 ) &&
|
619
|
-
1 == CurTreeIsLastAtomEqu( cur_tree,
|
618
|
+
1 == CurTreeIsLastAtomEqu( cur_tree, at_to_n1, nSymmStereo ) )
|
620
619
|
continue;
|
621
620
|
/*
|
622
621
|
if ( nSymmStereo && !pCS->bFirstCT ) {
|
623
|
-
if ( i && nSymmStereo[
|
622
|
+
if ( i && nSymmStereo[at_to_n1] == nSymmStereo[(int)EN1[0].to_at[0]] ) {
|
624
623
|
continue; // do not test stereo equivalent atoms except the first one
|
625
624
|
}
|
626
625
|
}
|
627
626
|
*/
|
628
627
|
/* neighbors are tied. Untie them by breaking a tie on ONE of them. */
|
629
|
-
ret1 = map_an_atom2( num_at_tg, num_max,
|
628
|
+
ret1 = map_an_atom2( num_at_tg, num_max, at_from_n1, at_to_n1,
|
630
629
|
nTempRank, nNumMappedRanks[istk2], &nNumMappedRanks[istk2+1], pCS,
|
631
630
|
NeighList, pRankStack1+nStackPtr[istk2], pRankStack2+nStackPtr[istk2],
|
632
631
|
&bAddStack );
|
@@ -644,7 +643,7 @@ repeat_all:
|
|
644
643
|
0 == CurTreeIsLastRank( cur_tree, at_rank_canon_n1 ) ) {
|
645
644
|
CurTreeAddRank( cur_tree, at_rank_canon_n1 );
|
646
645
|
}
|
647
|
-
CurTreeAddAtom( cur_tree,
|
646
|
+
CurTreeAddAtom( cur_tree, at_to_n1 );
|
648
647
|
}
|
649
648
|
|
650
649
|
|
@@ -668,27 +667,28 @@ repeat_all:
|
|
668
667
|
num2 = parity2 > 0? 1:2;
|
669
668
|
at_rank_canon_n2 = 0;
|
670
669
|
for ( j = 0; j < num2; j ++ ) {
|
670
|
+
int at_from_n2, at_to_n2;
|
671
671
|
istk3 = istk2;
|
672
672
|
if ( num2 == 2 ) {
|
673
673
|
at_rank_canon_n2 = nCanonRankFrom[EN2[0].from_at];
|
674
674
|
/* we need to map only one at_from2 neighbor to make its neighbors have different ranks */
|
675
|
-
|
676
|
-
|
675
|
+
at_from_n2 = EN2[0].from_at;
|
676
|
+
at_to_n2 = EN2[0].to_at[j];
|
677
677
|
|
678
678
|
if ( tpos1 < CurTreeGetPos( cur_tree ) &&
|
679
679
|
1 == CurTreeIsLastRank( cur_tree, at_rank_canon_n2 ) &&
|
680
|
-
1 == CurTreeIsLastAtomEqu( cur_tree,
|
680
|
+
1 == CurTreeIsLastAtomEqu( cur_tree, at_to_n2, nSymmStereo ) )
|
681
681
|
continue;
|
682
682
|
|
683
683
|
/*
|
684
684
|
if ( nSymmStereo && !pCS->bFirstCT ) {
|
685
|
-
if ( j && nSymmStereo[
|
685
|
+
if ( j && nSymmStereo[at_to_n2] == nSymmStereo[(int)EN2[0].to_at[0]] ) {
|
686
686
|
continue; // do not test stereo equivalent atoms except the first one
|
687
687
|
}
|
688
688
|
}
|
689
689
|
*/
|
690
690
|
/* neighbors are tied. Untie them by breaking a tie on ONE of them. */
|
691
|
-
ret1 = map_an_atom2( num_at_tg, num_max,
|
691
|
+
ret1 = map_an_atom2( num_at_tg, num_max, at_from_n2, at_to_n2,
|
692
692
|
nTempRank, nNumMappedRanks[istk3], &nNumMappedRanks[istk3+1], pCS,
|
693
693
|
NeighList, pRankStack1+nStackPtr[istk3],
|
694
694
|
pRankStack2+nStackPtr[istk3],
|
@@ -704,7 +704,7 @@ repeat_all:
|
|
704
704
|
0 == CurTreeIsLastRank( cur_tree, at_rank_canon_n2 ) ) {
|
705
705
|
CurTreeAddRank( cur_tree, at_rank_canon_n2 );
|
706
706
|
}
|
707
|
-
CurTreeAddAtom( cur_tree,
|
707
|
+
CurTreeAddAtom( cur_tree, at_to_n2 );
|
708
708
|
}
|
709
709
|
|
710
710
|
parity2 = parity_of_mapped_half_bond( at_from2, at_to2, at_from1, at_to1, at, &EN2[1],
|
@@ -749,7 +749,7 @@ repeat_all:
|
|
749
749
|
/* remove failed atom2 from the tree */
|
750
750
|
if ( tpos1 < CurTreeGetPos( cur_tree ) &&
|
751
751
|
1 == CurTreeIsLastRank( cur_tree, at_rank_canon_n2 ) ) {
|
752
|
-
CurTreeRemoveIfLastAtom( cur_tree,
|
752
|
+
CurTreeRemoveIfLastAtom( cur_tree, at_to_n2 );
|
753
753
|
CurTreeRemoveLastRankIfNoAtoms( cur_tree );
|
754
754
|
}
|
755
755
|
continue; /* Reject: not a minimal CT. */
|
@@ -801,6 +801,7 @@ repeat_all:
|
|
801
801
|
CurTreeKeepLastAtomsOnly( cur_tree, tpos1, 1 ); /* start over */
|
802
802
|
nTotSuccess |= 2; /* Obtained a smaller CT */
|
803
803
|
}
|
804
|
+
at_no_n1_num_success ++;
|
804
805
|
} else {
|
805
806
|
if ( bStereoIsBetterWasSetHere ) { /* rollback */
|
806
807
|
pCS->bStereoIsBetter = 0;
|
@@ -808,7 +809,7 @@ repeat_all:
|
|
808
809
|
}
|
809
810
|
if ( tpos1 < CurTreeGetPos( cur_tree ) &&
|
810
811
|
1 == CurTreeIsLastRank( cur_tree, at_rank_canon_n2 ) ) {
|
811
|
-
CurTreeRemoveIfLastAtom( cur_tree,
|
812
|
+
CurTreeRemoveIfLastAtom( cur_tree, at_to_n2 );
|
812
813
|
CurTreeRemoveLastRankIfNoAtoms( cur_tree );
|
813
814
|
}
|
814
815
|
}
|
@@ -819,6 +820,12 @@ repeat_all:
|
|
819
820
|
1 == CurTreeIsLastRank( cur_tree, at_rank_canon_n2 ) ) {
|
820
821
|
CurTreeRemoveLastRank( cur_tree );
|
821
822
|
}
|
823
|
+
/* added 2006-07-20 */
|
824
|
+
if ( !at_no_n1_num_success && tpos1 < CurTreeGetPos( cur_tree ) &&
|
825
|
+
1 == CurTreeIsLastRank( cur_tree, at_rank_canon_n1 ) ) {
|
826
|
+
CurTreeRemoveIfLastAtom( cur_tree, at_to_n1 );
|
827
|
+
}
|
828
|
+
|
822
829
|
} /* end choices in mapping neighbors of the 1st half-bond */
|
823
830
|
if ( tpos1 < CurTreeGetPos( cur_tree ) &&
|
824
831
|
1 == CurTreeIsLastRank( cur_tree, at_rank_canon_n1 ) ) {
|
@@ -1174,7 +1181,7 @@ repeat_all:
|
|
1174
1181
|
|
1175
1182
|
/*********************************************************************************
|
1176
1183
|
*
|
1177
|
-
* Unknown Stereocenter Parity case: possibly need to map stereo
|
1184
|
+
* Unknown Stereocenter Parity case: possibly need to map stereo center neighbors
|
1178
1185
|
*/
|
1179
1186
|
if ( stereo_center_parity == sb_parity_calc )
|
1180
1187
|
{
|
@@ -1230,14 +1237,20 @@ repeat_all:
|
|
1230
1237
|
pCS->LinearCTStereoCarb[nNumMappedAtoms].parity = parity1;
|
1231
1238
|
pCS->LinearCTStereoCarb[nNumMappedAtoms].at_num = at_rank_canon1;
|
1232
1239
|
pCS->bRankUsedForStereo[at_from1] = 3;
|
1233
|
-
|
1240
|
+
#if( FIX_ChCh_STEREO_CANON_BUG == 1 )
|
1241
|
+
if ( !bAllParitiesIdentical )
|
1242
|
+
#endif
|
1243
|
+
pCS->bAtomUsedForStereo[at_to1] -= STEREO_AT_MARK;
|
1234
1244
|
|
1235
1245
|
ret = map_stereo_atoms4 ( at, num_atoms, num_at_tg, num_max, nCanonRankFrom, nAtomNumberCanonFrom, nCanonRankTo,
|
1236
1246
|
nSymmRank, pRankStack1+nStackPtr[istk], pRankStack2+nStackPtr[istk],
|
1237
1247
|
nTempRank, nMappedRanks[istk], nSymmStereo, NeighList,
|
1238
1248
|
pCS, cur_tree, nNumMappedAtoms+1 );
|
1239
1249
|
pCS->bRankUsedForStereo[at_from1] = 0;
|
1240
|
-
|
1250
|
+
#if( FIX_ChCh_STEREO_CANON_BUG == 1 )
|
1251
|
+
if ( !bAllParitiesIdentical )
|
1252
|
+
#endif
|
1253
|
+
pCS->bAtomUsedForStereo[at_to1] += STEREO_AT_MARK;
|
1241
1254
|
if ( ret == 4 ) {
|
1242
1255
|
return ret;
|
1243
1256
|
}
|
data/ext/src/ichinorm.c
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
3
|
* International Chemical Identifier (InChI)
|
4
4
|
* Version 1
|
5
|
-
* Software version 1.
|
6
|
-
*
|
5
|
+
* Software version 1.01
|
6
|
+
* July 21, 2006
|
7
7
|
* Developed at NIST
|
8
8
|
*/
|
9
9
|
|
@@ -122,7 +122,10 @@ int MarkRingSystemsInp( inp_ATOM *at, int num_atoms )
|
|
122
122
|
do {
|
123
123
|
/* advance */
|
124
124
|
advance_block:
|
125
|
-
if ( (int)at[i=nStackAtom[nTopStackAtom]].valence > (j = (int)cNeighNumb[i]) )
|
125
|
+
/*if ( (int)at[i=nStackAtom[nTopStackAtom]].valence > (j = (int)cNeighNumb[i]) )*/
|
126
|
+
/* replaced due to missing sequence point */
|
127
|
+
if ( i=(int)nStackAtom[nTopStackAtom], j = (int)cNeighNumb[i], (int)at[i].valence > j )
|
128
|
+
{
|
126
129
|
cNeighNumb[i] ++;
|
127
130
|
u = (int)at[i].neighbor[j];
|
128
131
|
if ( !nDfsNumber[u] ) {
|
@@ -199,7 +202,10 @@ advance_block:
|
|
199
202
|
do {
|
200
203
|
/* advance */
|
201
204
|
advance_ring:
|
202
|
-
if ( (int)at[i=nStackAtom[nTopStackAtom]].valence > (j = (int)cNeighNumb[i]) )
|
205
|
+
/*if ( (int)at[i=nStackAtom[nTopStackAtom]].valence > (j = (int)cNeighNumb[i]) )*/
|
206
|
+
/* replaced due to missing sequence point */
|
207
|
+
if ( i=(int)nStackAtom[nTopStackAtom], j = (int)cNeighNumb[i], (int)at[i].valence > j )
|
208
|
+
{
|
203
209
|
cNeighNumb[i] ++;
|
204
210
|
u = (int)at[i].neighbor[j];
|
205
211
|
if ( !nDfsNumber[u] ) {
|
@@ -523,7 +529,7 @@ int remove_terminal_HDT( int num_atoms, inp_ATOM *at )
|
|
523
529
|
at[i].component = i; /* temporarily save original numbering */
|
524
530
|
/* get k = temp. hydrogen isotope/non-hydrogen atom type: */
|
525
531
|
/* k=0:H, k=2:D, k=3:T, k=4=kMax: not a hydrogen */
|
526
|
-
k = at[i].elname[1]? kMax : (p=strchr(szHDT, at[i].elname[0]))? p-szHDT : kMax;
|
532
|
+
k = at[i].elname[1]? kMax : (p=(char*)strchr(szHDT, at[i].elname[0]))? p-szHDT : kMax;
|
527
533
|
/* set hydrogen isotope atw differences */
|
528
534
|
/* Notes: k-value of isotopic H is incremented to correct iso_atw_diff value later. */
|
529
535
|
/* 1H isotope cannot be detected here. */
|
data/ext/src/ichinorm.h
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
3
|
* International Chemical Identifier (InChI)
|
4
4
|
* Version 1
|
5
|
-
* Software version 1.
|
6
|
-
*
|
5
|
+
* Software version 1.01
|
6
|
+
* July 21, 2006
|
7
7
|
* Developed at NIST
|
8
8
|
*/
|
9
9
|
|
@@ -47,6 +47,7 @@ int free_t_group_info( T_GROUP_INFO *t_group_info );
|
|
47
47
|
int make_a_copy_of_t_group_info( T_GROUP_INFO *t_group_info, T_GROUP_INFO *t_group_info_orig );
|
48
48
|
int set_tautomer_iso_sort_keys( T_GROUP_INFO *t_group_info );
|
49
49
|
int CountTautomerGroups( sp_ATOM *at, int num_atoms, T_GROUP_INFO *t_group_info );
|
50
|
+
int CountTautomerGroupsInpAt( inp_ATOM *at, int num_atoms, T_GROUP_INFO *t_group_info );
|
50
51
|
int SortTautomerGroupsAndEndpoints( T_GROUP_INFO *t_group_info, int num_atoms, int num_at_tg, AT_RANK *nRank );
|
51
52
|
int FillIsotopicAtLinearCT( int num_atoms, sp_ATOM* at, const AT_RANK *nAtomNumber,
|
52
53
|
AT_ISOTOPIC *LinearCTIsotopic, int nMaxLenLinearCTIsotopic, int *pnLenLinearCTIsotopic );
|
data/ext/src/ichiparm.c
CHANGED
data/ext/src/ichiparm.h
CHANGED
@@ -2,8 +2,8 @@
|
|
2
2
|
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
3
|
* International Chemical Identifier (InChI)
|
4
4
|
* Version 1
|
5
|
-
* Software version 1.
|
6
|
-
*
|
5
|
+
* Software version 1.01
|
6
|
+
* July 21, 2006
|
7
7
|
* Developed at NIST
|
8
8
|
*/
|
9
9
|
|
@@ -62,7 +62,12 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
62
62
|
int bDisplay = 0;
|
63
63
|
int bNoStructLabels = 0;
|
64
64
|
int bOutputMolfileOnly = 0;
|
65
|
+
int bOutputMolfileDT = 0;
|
66
|
+
int bOutputMolfileSplit = 0;
|
65
67
|
int bForcedChiralFlag = 0;
|
68
|
+
#if( READ_INCHI_STRING == 1 )
|
69
|
+
int bDisplayIfRestoreWarnings = 0;
|
70
|
+
#endif
|
66
71
|
#ifdef INCHI_LIB
|
67
72
|
int bXml = INCHI_OUT_XML;
|
68
73
|
#else
|
@@ -73,6 +78,16 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
73
78
|
#ifdef STEREO_WEDGE_ONLY
|
74
79
|
int bPointedEdgeStereo = STEREO_WEDGE_ONLY; /* NEWPS TG_FLAG_POINTED_EDGE_STEREO*/
|
75
80
|
#endif
|
81
|
+
#if( FIX_ADJ_RAD == 1 )
|
82
|
+
int bFixAdjacentRad = 0;
|
83
|
+
#endif
|
84
|
+
#if( ADD_PHOSPHINE_STEREO == 1 )
|
85
|
+
int bAddPhosphineStereo = 0;
|
86
|
+
#endif
|
87
|
+
#if( ADD_ARSINE_STEREO == 1 )
|
88
|
+
int bAddArsineStereo = 0;
|
89
|
+
#endif
|
90
|
+
int bFixSp3bug = 0;
|
76
91
|
|
77
92
|
|
78
93
|
ext[0] = ".mol";
|
@@ -207,10 +222,10 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
207
222
|
} else
|
208
223
|
#endif
|
209
224
|
if ( !memicmp( pArg, "START:", 6 ) ) {
|
210
|
-
ip->first_struct_number =
|
225
|
+
ip->first_struct_number = strtol(pArg+6, NULL, 10);
|
211
226
|
} else
|
212
227
|
if ( !memicmp( pArg, "END:", 4 ) ) {
|
213
|
-
ip->last_struct_number =
|
228
|
+
ip->last_struct_number = strtol(pArg+4, NULL, 10);
|
214
229
|
} else /* RSB: */
|
215
230
|
if ( !memicmp( pArg, "RSB:", 4 ) ) {
|
216
231
|
mdbr = (int)strtol(pArg+4, NULL, 10);
|
@@ -371,11 +386,28 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
371
386
|
if ( !stricmp( pArg, "NoADP" ) ) {
|
372
387
|
bTgFlagHardAddRenProtons = 0;
|
373
388
|
} else
|
389
|
+
if ( !stricmp( pArg, "FixSp3bug" ) ) {
|
390
|
+
bFixSp3bug = 1;
|
391
|
+
} else
|
392
|
+
if ( !stricmp( pArg, "FB" ) ) {
|
393
|
+
bFixSp3bug = 1; /* fix all known v1 bugs */
|
394
|
+
} else
|
374
395
|
#ifdef STEREO_WEDGE_ONLY
|
375
396
|
if ( !stricmp( pArg, "NEWPS" ) ) {
|
376
397
|
bPointedEdgeStereo = 1;
|
377
398
|
} else
|
378
399
|
#endif
|
400
|
+
#if( ADD_PHOSPHINE_STEREO == 1 )
|
401
|
+
if ( !stricmp( pArg, "SPXYZ" ) ) {
|
402
|
+
bAddPhosphineStereo = 1;
|
403
|
+
} else
|
404
|
+
#endif
|
405
|
+
#if( ADD_ARSINE_STEREO == 1 )
|
406
|
+
if ( !stricmp( pArg, "SASXYZ" ) ) {
|
407
|
+
bAddArsineStereo = 1;
|
408
|
+
} else
|
409
|
+
#endif
|
410
|
+
|
379
411
|
if ( !stricmp( pArg, "PW" ) ) {
|
380
412
|
ip->bSaveWarningStructsAsProblem = 1;
|
381
413
|
} else {
|
@@ -517,10 +549,26 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
517
549
|
if ( !stricmp( pArg, "SUU" ) ) { /* include omitted undef/unkn stereo */
|
518
550
|
bVer1DefaultMode &= ~(REQ_MODE_SB_IGN_ALL_UU | REQ_MODE_SC_IGN_ALL_UU);
|
519
551
|
} else
|
552
|
+
if ( !stricmp( pArg, "FixSp3bug" ) ) {
|
553
|
+
bFixSp3bug = 1;
|
554
|
+
} else
|
555
|
+
if ( !stricmp( pArg, "FB" ) ) {
|
556
|
+
bFixSp3bug = 1; /* fix all known v1 bugs */
|
557
|
+
} else
|
520
558
|
#ifdef STEREO_WEDGE_ONLY
|
521
559
|
if ( !stricmp( pArg, "NEWPS" ) ) {
|
522
560
|
bPointedEdgeStereo = 1;
|
523
561
|
} else
|
562
|
+
#endif
|
563
|
+
#if( ADD_PHOSPHINE_STEREO == 1 )
|
564
|
+
if ( !stricmp( pArg, "SPXYZ" ) ) {
|
565
|
+
bAddPhosphineStereo = 1;
|
566
|
+
} else
|
567
|
+
#endif
|
568
|
+
#if( ADD_ARSINE_STEREO == 1 )
|
569
|
+
if ( !stricmp( pArg, "SASXYZ" ) ) {
|
570
|
+
bAddArsineStereo = 1;
|
571
|
+
} else
|
524
572
|
#endif
|
525
573
|
if ( !stricmp( pArg, "RECMET" ) ) { /* do reconnect metals */
|
526
574
|
bReconnectCoord = 1;
|
@@ -542,6 +590,12 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
542
590
|
if ( !stricmp( pArg, "D" ) ) { /* display the structures */
|
543
591
|
bDisplay |= 1;
|
544
592
|
} else
|
593
|
+
#if( READ_INCHI_STRING == 1 )
|
594
|
+
if ( !stricmp( pArg, "DDSRC" ) ) {
|
595
|
+
bDisplayIfRestoreWarnings = 1; /* InChI->Structure debugging: Display Debug Structure Restore Components */
|
596
|
+
}
|
597
|
+
else
|
598
|
+
#endif
|
545
599
|
if ( !stricmp( pArg, "NOLABELS" ) ) {
|
546
600
|
bNoStructLabels = 1;
|
547
601
|
} else
|
@@ -578,7 +632,32 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
578
632
|
bXml |= INCHI_OUT_PLAIN_TEXT | INCHI_OUT_PLAIN_TEXT_COMMENTS;
|
579
633
|
bXml &= ~(INCHI_OUT_XML | INCHI_OUT_XML_TEXT_COMMENTS);
|
580
634
|
} else
|
581
|
-
|
635
|
+
#if( READ_INCHI_STRING == 1 )
|
636
|
+
if ( !stricmp( pArg, "InChI2InChI" ) ) {
|
637
|
+
/* Read InChI Identifiers and output InChI Identifiers */
|
638
|
+
ip->nInputType = INPUT_INCHI;
|
639
|
+
ip->bReadInChIOptions |= READ_INCHI_OUTPUT_INCHI;
|
640
|
+
ip->bReadInChIOptions &= ~READ_INCHI_TO_STRUCTURE;
|
641
|
+
} else
|
642
|
+
if ( !stricmp( pArg, "SplitInChI" ) ) {
|
643
|
+
/* Split InChI Identifiers into components */
|
644
|
+
ip->bReadInChIOptions |= READ_INCHI_SPLIT_OUTPUT;
|
645
|
+
} else
|
646
|
+
if ( !stricmp( pArg, "InChI2Struct" ) ) {
|
647
|
+
/* Split InChI Identifiers into components */
|
648
|
+
ip->bReadInChIOptions |= READ_INCHI_TO_STRUCTURE;
|
649
|
+
ip->bReadInChIOptions &= ~READ_INCHI_OUTPUT_INCHI;
|
650
|
+
ip->nInputType = INPUT_INCHI;
|
651
|
+
} else
|
652
|
+
if ( !stricmp( pArg, "KeepBalanceP" ) ) {
|
653
|
+
/* When spliting InChI Identifiers into components: */
|
654
|
+
/* If MobileH output then add p to each component; */
|
655
|
+
/* Otherwise add one more component containing balance */
|
656
|
+
/* of protons and exchangeable isotopic H */
|
657
|
+
ip->bReadInChIOptions |= READ_INCHI_KEEP_BALANCE_P;
|
658
|
+
} else
|
659
|
+
#endif
|
660
|
+
if ( /* INPUT_NONE == ip->nInputType &&*/
|
582
661
|
!memicmp( pArg, "SDF:", 4 ) ) {
|
583
662
|
/* SDfile label */
|
584
663
|
k = 0;
|
@@ -587,11 +666,15 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
587
666
|
if ( k ) {
|
588
667
|
ip->pSdfLabel = ip->szSdfDataHeader;
|
589
668
|
ip->pSdfValue = szSdfDataValue;
|
590
|
-
ip->nInputType
|
669
|
+
if ( INPUT_NONE == ip->nInputType ) {
|
670
|
+
ip->nInputType = INPUT_SDFILE;
|
671
|
+
}
|
591
672
|
} else {
|
592
673
|
ip->pSdfLabel = NULL;
|
593
674
|
ip->pSdfValue = NULL;
|
594
|
-
ip->nInputType
|
675
|
+
if ( INPUT_NONE == ip->nInputType ) {
|
676
|
+
ip->nInputType = INPUT_MOLFILE;
|
677
|
+
}
|
595
678
|
}
|
596
679
|
} else
|
597
680
|
#if( ADD_CMLPP == 1 )
|
@@ -604,15 +687,26 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
604
687
|
if ( !stricmp( pArg, "RECMET-" ) ) { /* do not reconnect metals (default) */
|
605
688
|
bReconnectCoord = 0;
|
606
689
|
} else
|
607
|
-
if ( !stricmp( pArg, "OUTPUTSDF" ) ) { /*
|
690
|
+
if ( !stricmp( pArg, "OUTPUTSDF" ) ) { /* output SDfile */
|
608
691
|
bOutputMolfileOnly = 1;
|
609
692
|
} else
|
693
|
+
if ( !stricmp( pArg, "SdfAtomsDT" ) ) { /* output isotopes H as D and T in SDfile */
|
694
|
+
bOutputMolfileDT = 1;
|
695
|
+
} else
|
696
|
+
if ( !stricmp( pArg, "SdfSplit" ) ) { /* Split single Molfiles into disconnected components */
|
697
|
+
bOutputMolfileSplit = 1;
|
698
|
+
} else
|
610
699
|
if ( !stricmp( pArg, "STDIO" ) ) {
|
611
700
|
bNameSuffix = 0;
|
612
701
|
} else
|
613
702
|
if ( !stricmp( pArg, "DCR" ) ) {
|
614
703
|
bDisplayCompositeResults = 1;
|
615
704
|
} else
|
705
|
+
#if( FIX_ADJ_RAD == 1 )
|
706
|
+
if ( !stricmp( pArg, "FixRad" ) ) {
|
707
|
+
bFixAdjacentRad = 1;
|
708
|
+
} else
|
709
|
+
#endif
|
616
710
|
/*============= Additional options ==========*/
|
617
711
|
/* Tautomer perception off */
|
618
712
|
if ( !stricmp( pArg, "EXACT" ) ) {
|
@@ -662,10 +756,10 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
662
756
|
bDisconnectSalts = 0;
|
663
757
|
} else
|
664
758
|
if ( !memicmp( pArg, "START:", 6 ) ) {
|
665
|
-
ip->first_struct_number =
|
759
|
+
ip->first_struct_number = strtol(pArg+6, NULL, 10);
|
666
760
|
} else
|
667
761
|
if ( !memicmp( pArg, "END:", 4 ) ) {
|
668
|
-
ip->last_struct_number =
|
762
|
+
ip->last_struct_number = strtol(pArg+4, NULL, 10);
|
669
763
|
} else /* RSB: */
|
670
764
|
if ( !memicmp( pArg, "RSB:", 4 )) {
|
671
765
|
mdbr = (int)strtol(pArg+4, NULL, 10);
|
@@ -734,7 +828,7 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
734
828
|
szOutputPath[len++] = INCHI_PATH_DELIM;
|
735
829
|
szOutputPath[len] = '\0';
|
736
830
|
}
|
737
|
-
if ( len > 0 && (r = strrchr( p, INCHI_PATH_DELIM ) ) && r[1] ) {
|
831
|
+
if ( len > 0 && (r = (char *)strrchr( p, INCHI_PATH_DELIM ) ) && r[1] ) {
|
738
832
|
strcat( szOutputPath, r+1 );
|
739
833
|
p = szOutputPath;
|
740
834
|
}
|
@@ -757,7 +851,33 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
757
851
|
}
|
758
852
|
}
|
759
853
|
|
760
|
-
#endif /* } ACD_LABS_VERSION */
|
854
|
+
#endif /* } NOT ACD_LABS_VERSION */
|
855
|
+
|
856
|
+
|
857
|
+
#if( READ_INCHI_STRING == 1 )
|
858
|
+
if ( INPUT_INCHI == ip->nInputType ) {
|
859
|
+
bCompareComponents = 0;
|
860
|
+
/*bDisplayCompositeResults = 0;*/
|
861
|
+
bOutputMolfileOnly = 0;
|
862
|
+
/*bNoStructLabels = 1;*/
|
863
|
+
bINChIOutputOptions |= INCHI_OUT_NO_AUX_INFO;
|
864
|
+
bINChIOutputOptions &= ~INCHI_OUT_SHORT_AUX_INFO;
|
865
|
+
bINChIOutputOptions &= ~INCHI_OUT_ONLY_AUX_INFO;
|
866
|
+
ip->bDisplayIfRestoreWarnings = bDisplayIfRestoreWarnings;
|
867
|
+
|
868
|
+
if ( !(bINChIOutputOptions &
|
869
|
+
|
870
|
+
(INCHI_OUT_SDFILE_ONLY |
|
871
|
+
INCHI_OUT_XML |
|
872
|
+
INCHI_OUT_PLAIN_TEXT |
|
873
|
+
INCHI_OUT_PLAIN_TEXT_COMMENTS |
|
874
|
+
INCHI_OUT_XML_TEXT_COMMENTS
|
875
|
+
) ) ) {
|
876
|
+
|
877
|
+
bINChIOutputOptions |= INCHI_OUT_PLAIN_TEXT;
|
878
|
+
}
|
879
|
+
}
|
880
|
+
#endif
|
761
881
|
|
762
882
|
|
763
883
|
if ( bVer1Options ) {
|
@@ -834,6 +954,10 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
834
954
|
if ( bOutputMolfileOnly ) {
|
835
955
|
bXml &= ~(INCHI_OUT_XML | INCHI_OUT_PLAIN_TEXT |
|
836
956
|
INCHI_OUT_PLAIN_TEXT_COMMENTS | INCHI_OUT_XML_TEXT_COMMENTS | INCHI_OUT_TABBED_OUTPUT);
|
957
|
+
#if( SDF_OUTPUT_DT == 1 )
|
958
|
+
ip->bINChIOutputOptions |= bOutputMolfileDT? INCHI_OUT_SDFILE_ATOMS_DT : 0;
|
959
|
+
ip->bINChIOutputOptions |= bOutputMolfileSplit? INCHI_OUT_SDFILE_SPLIT : 0;
|
960
|
+
#endif
|
837
961
|
}
|
838
962
|
if ( bXml & INCHI_OUT_XML ) {
|
839
963
|
bXml &= ~(INCHI_OUT_PLAIN_TEXT | INCHI_OUT_XML_TEXT_COMMENTS | INCHI_OUT_TABBED_OUTPUT);
|
@@ -882,6 +1006,17 @@ int ReadCommandLineParms( int argc, const char *argv[], INPUT_PARMS *ip, char *s
|
|
882
1006
|
#ifdef STEREO_WEDGE_ONLY
|
883
1007
|
ip->bTautFlags |= bPointedEdgeStereo? TG_FLAG_POINTED_EDGE_STEREO : 0;
|
884
1008
|
#endif
|
1009
|
+
#if( FIX_ADJ_RAD == 1 )
|
1010
|
+
ip->bTautFlags |= bFixAdjacentRad? TG_FLAG_FIX_ADJ_RADICALS : 0;
|
1011
|
+
#endif
|
1012
|
+
#if( ADD_PHOSPHINE_STEREO == 1 )
|
1013
|
+
ip->bTautFlags |= bAddPhosphineStereo? TG_FLAG_PHOSPHINE_STEREO : 0;
|
1014
|
+
#endif
|
1015
|
+
#if( ADD_ARSINE_STEREO == 1 )
|
1016
|
+
ip->bTautFlags |= bAddArsineStereo? TG_FLAG_ARSINE_STEREO : 0;
|
1017
|
+
#endif
|
1018
|
+
ip->bTautFlags |= bFixSp3bug? TG_FLAG_FIX_SP3_BUG : 0;
|
1019
|
+
|
885
1020
|
if ( !ip->nInputType ) {
|
886
1021
|
ip->nInputType = INPUT_MOLFILE;
|
887
1022
|
}
|
@@ -898,7 +1033,8 @@ int PrintInputParms( INCHI_FILE *log_file, INPUT_PARMS *ip )
|
|
898
1033
|
|
899
1034
|
/* SDfile output */
|
900
1035
|
if ( ip->bINChIOutputOptions & INCHI_OUT_SDFILE_ONLY ) {
|
901
|
-
my_fprintf( log_file, "Output SDfile only\n"
|
1036
|
+
my_fprintf( log_file, "Output SDfile only%s\n",
|
1037
|
+
(ip->bINChIOutputOptions & INCHI_OUT_SDFILE_ATOMS_DT)? " (write H isotopes as D, T)":"" );
|
902
1038
|
return 0;
|
903
1039
|
}
|
904
1040
|
/* tautomerism */
|
@@ -919,6 +1055,11 @@ int PrintInputParms( INCHI_FILE *log_file, INPUT_PARMS *ip )
|
|
919
1055
|
}
|
920
1056
|
}
|
921
1057
|
my_fprintf( log_file, "\n");
|
1058
|
+
#if( FIX_ADJ_RAD == 1 )
|
1059
|
+
if ( ip->bTautFlags & TG_FLAG_FIX_ADJ_RADICALS ) {
|
1060
|
+
my_fprintf( log_file, "Fix Adjacent Radicals\n" );
|
1061
|
+
}
|
1062
|
+
#endif
|
922
1063
|
i = 0;
|
923
1064
|
/* isotopic */
|
924
1065
|
if ( nMode & REQ_MODE_ISO ) {
|
@@ -960,11 +1101,27 @@ int PrintInputParms( INCHI_FILE *log_file, INPUT_PARMS *ip )
|
|
960
1101
|
}
|
961
1102
|
i = 0;
|
962
1103
|
}
|
1104
|
+
#endif
|
963
1105
|
if ( TG_FLAG_POINTED_EDGE_STEREO & ip->bTautFlags ) {
|
964
1106
|
my_fprintf( log_file, "%sOnly narrow end of wedge points to stereocenter\n", i? "\n":"" );
|
965
1107
|
i = 0;
|
966
1108
|
}
|
1109
|
+
#if( ADD_PHOSPHINE_STEREO == 1 )
|
1110
|
+
if ( TG_FLAG_PHOSPHINE_STEREO & ip->bTautFlags ) {
|
1111
|
+
my_fprintf( log_file, "%sInclude phoshine stereochemistry\n", i? "\n":"" );
|
1112
|
+
i = 0;
|
1113
|
+
}
|
1114
|
+
#endif
|
1115
|
+
#if( ADD_ARSINE_STEREO == 1 )
|
1116
|
+
if ( TG_FLAG_ARSINE_STEREO & ip->bTautFlags ) {
|
1117
|
+
my_fprintf( log_file, "%sInclude arsine stereochemistry\n", i? "\n":"" );
|
1118
|
+
i = 0;
|
1119
|
+
}
|
967
1120
|
#endif
|
1121
|
+
if ( TG_FLAG_FIX_SP3_BUG & ip->bTautFlags ) {
|
1122
|
+
my_fprintf( log_file, "%sFix bug leading to missing or undefined sp3 parity\n", i? "\n":"" );
|
1123
|
+
i = 0;
|
1124
|
+
}
|
968
1125
|
} else {
|
969
1126
|
my_fprintf( log_file, ", Stereo OFF");
|
970
1127
|
}
|
@@ -1036,8 +1193,16 @@ int PrintInputParms( INCHI_FILE *log_file, INPUT_PARMS *ip )
|
|
1036
1193
|
ip->nInputType == INPUT_MOLFILE? "MOLfile" :
|
1037
1194
|
ip->nInputType == INPUT_SDFILE? "SDfile" :
|
1038
1195
|
ip->nInputType == INPUT_CMLFILE? "CMLfile" :
|
1196
|
+
#if( READ_INCHI_STRING == 1 )
|
1197
|
+
ip->nInputType == INPUT_INCHI? "InChI (plain identifier)" :
|
1198
|
+
#endif
|
1199
|
+
#if( SPECIAL_BUILD == 1 )
|
1200
|
+
ip->nInputType == INPUT_INCHI_XML? "MoChI (xml)" :
|
1201
|
+
ip->nInputType == INPUT_INCHI_PLAIN? "MoChI (plain)" : "Unknown" );
|
1202
|
+
#else
|
1039
1203
|
ip->nInputType == INPUT_INCHI_XML? "InChI (xml)" :
|
1040
1204
|
ip->nInputType == INPUT_INCHI_PLAIN? "InChI (plain)" : "Unknown" );
|
1205
|
+
#endif
|
1041
1206
|
if ( (ip->nInputType == INPUT_MOLFILE || ip->nInputType == INPUT_SDFILE) &&
|
1042
1207
|
ip->bGetMolfileNumber ) {
|
1043
1208
|
my_fprintf( log_file, " (attempting to read Molfile number)" );
|
@@ -1066,10 +1231,10 @@ int PrintInputParms( INCHI_FILE *log_file, INPUT_PARMS *ip )
|
|
1066
1231
|
my_fprintf( log_file, "%sUp to %d atoms per structure\n", i?"; ":"", MAX_ATOMS);
|
1067
1232
|
i = 0;
|
1068
1233
|
if ( ip->first_struct_number > 1 ) {
|
1069
|
-
my_fprintf( log_file, "Skipping %
|
1234
|
+
my_fprintf( log_file, "Skipping %ld structure%s\n", ip->first_struct_number-1, ip->first_struct_number==2? "":"s" );
|
1070
1235
|
}
|
1071
1236
|
if ( ip->last_struct_number > 0 ) {
|
1072
|
-
my_fprintf( log_file, "Terminate after structure #%
|
1237
|
+
my_fprintf( log_file, "Terminate after structure #%ld\n", ip->last_struct_number );
|
1073
1238
|
}
|
1074
1239
|
if ( ip->bSaveWarningStructsAsProblem && ip->path[3] && ip->path[3][0] ) {
|
1075
1240
|
my_fprintf( log_file, "Saving warning structures into the problem file\n");
|
@@ -1144,8 +1309,7 @@ void HelpCommandLineParms( INCHI_FILE *f )
|
|
1144
1309
|
|
1145
1310
|
#if ( bRELEASE_VERSION == 1 )
|
1146
1311
|
|
1147
|
-
inchi_print_nodisplay( f, "%s ver %s.\n\nUsage:\
|
1148
|
-
|
1312
|
+
inchi_print_nodisplay( f, "%s ver %s%s.\n\nUsage:\nc%s-%s inputFile [outputFile [logFile [problemFile]]] [%coption[ %coption...]]\n", INCHI_NAME, INCHI_VERSION, SPECIAL_BUILD_STRING, INCHI_NAME, INCHI_VERSION, INCHI_OPTION_PREFX, INCHI_OPTION_PREFX);
|
1149
1313
|
inchi_print_nodisplay( f, "\nOptions:\n");
|
1150
1314
|
inchi_print_nodisplay( f, " SNon Exclude stereo (Default: Include Absolute stereo)\n");
|
1151
1315
|
inchi_print_nodisplay( f, " SRel Relative stereo\n");
|
@@ -1153,6 +1317,12 @@ void HelpCommandLineParms( INCHI_FILE *f )
|
|
1153
1317
|
inchi_print_nodisplay( f, " SUCF Use Chiral Flag: On means Absolute stereo, Off - Relative\n");
|
1154
1318
|
inchi_print_nodisplay( f, " SUU Include omitted unknown/undefined stereo\n");
|
1155
1319
|
inchi_print_nodisplay( f, " NEWPS Narrow end of wedge points to stereocenter (default: both)\n");
|
1320
|
+
#if( ADD_PHOSPHINE_STEREO == 1 )
|
1321
|
+
inchi_print_nodisplay( f, " SPXYZ Include Phosphines Stereochemistry\n");
|
1322
|
+
#endif
|
1323
|
+
#if( ADD_ARSINE_STEREO == 1 )
|
1324
|
+
inchi_print_nodisplay( f, " SAsXYZ Include Arsines Stereochemistry\n");
|
1325
|
+
#endif
|
1156
1326
|
inchi_print_nodisplay( f, " RecMet Include reconnected metals results\n");
|
1157
1327
|
inchi_print_nodisplay( f, " FixedH Mobile H Perception Off (Default: On)\n");
|
1158
1328
|
inchi_print_nodisplay( f, " AuxNone Omit auxiliary information (default: Include)\n");
|
@@ -1171,14 +1341,29 @@ void HelpCommandLineParms( INCHI_FILE *f )
|
|
1171
1341
|
inchi_print_nodisplay( f, " Wnumber Set time-out per structure in seconds; W0 means unlimited\n");
|
1172
1342
|
inchi_print_nodisplay( f, " SDF:DataHeader Read from the input SDfile the ID under this DataHeader\n");
|
1173
1343
|
#if( ADD_CMLPP == 1 )
|
1174
|
-
inchi_print_nodisplay( f, " CML Input in CML format (default for input file .CML extension)
|
1344
|
+
inchi_print_nodisplay( f, " CML Input in CML format (default for input file .CML extension)\n");
|
1175
1345
|
#endif
|
1176
1346
|
inchi_print_nodisplay( f, " NoLabels Omit structure number, DataHeader and ID from %s output\n", INCHI_NAME);
|
1177
1347
|
inchi_print_nodisplay( f, " Tabbed Separate structure number, %s, and AuxIndo with tabs\n", INCHI_NAME);
|
1178
1348
|
inchi_print_nodisplay( f, " OutputSDF Convert %s created with default aux. info to SDfile\n", INCHI_NAME);
|
1349
|
+
#ifdef INCHI_MAIN
|
1350
|
+
inchi_print_nodisplay( f, " InChI2Struct Test mode: Mol/SDfile->%s->Structure->%s and a structure in AuxInfo format\n", INCHI_NAME, INCHI_NAME);
|
1351
|
+
#else
|
1352
|
+
/*
|
1353
|
+
inchi_print_nodisplay( f, " InChI2Struct Convert %s string into a structure in AuxInfo format and its %s\n", INCHI_NAME, INCHI_NAME);
|
1354
|
+
*/
|
1355
|
+
#endif
|
1356
|
+
inchi_print_nodisplay( f, " InChI2InChI Convert %s string into %s string for validation purposes\n", INCHI_NAME, INCHI_NAME);
|
1357
|
+
#if ( SDF_OUTPUT_DT == 1 )
|
1358
|
+
inchi_print_nodisplay( f, " SdfAtomsDT Output Hydrogen Isotopes to SDfile as Atoms D and T\n");
|
1359
|
+
#endif
|
1179
1360
|
inchi_print_nodisplay( f, " STDIO Use standard input/output streams\n");
|
1361
|
+
inchi_print_nodisplay( f, " FB (or FixSp3Bug) Fix bug leading to missing or undefined sp3 parity\n" );
|
1180
1362
|
inchi_print_nodisplay( f, " WarnOnEmptyStructure Warn and produce empty %s for empty structure\n", INCHI_NAME);
|
1181
|
-
|
1363
|
+
#if( FIX_ADJ_RAD == 1 )
|
1364
|
+
inchi_print_nodisplay( f, " FixRad Fix Adjacent Radicals\n");
|
1365
|
+
#endif
|
1366
|
+
|
1182
1367
|
#else
|
1183
1368
|
|
1184
1369
|
inchi_print_nodisplay( f, "%s ver %s. Special testing version 12-12-2002.\n", INCHI_NAME, INCHI_VERSION);
|
@@ -1245,27 +1430,30 @@ int OpenFiles( FILE **inp_file, FILE **output_file, FILE **log_file, FILE **prb_
|
|
1245
1430
|
*/
|
1246
1431
|
/* logfile -- open es early as possible */
|
1247
1432
|
if ( !ip->path[2] || !ip->path[2][0] ) {
|
1248
|
-
my_fprintf( stderr, "%s version %s%s\n", INCHI_NAME, INCHI_VERSION, bRELEASE_VERSION? "":" (For pre-release testing)" );
|
1433
|
+
my_fprintf( stderr, "%s version %s%s%s\n", INCHI_NAME, INCHI_VERSION, SPECIAL_BUILD_STRING, bRELEASE_VERSION? "":" (For pre-release testing)" );
|
1249
1434
|
my_fprintf( stderr, "Log file not specified. Using standard error output.\n");
|
1250
1435
|
*log_file = stderr;
|
1251
1436
|
} else
|
1252
1437
|
if ( !(*log_file = fopen( ip->path[2], "w" ) ) ) {
|
1253
|
-
|
1254
|
-
|
1438
|
+
my_fprintf( stderr, "%s version %s%s%s\n", INCHI_NAME, INCHI_VERSION, SPECIAL_BUILD_STRING, bRELEASE_VERSION? "":" (For pre-release testing)" );
|
1439
|
+
my_fprintf( stderr, "Cannot open log file '%s'. Using standard error output.\n", ip->path[2] );
|
1255
1440
|
*log_file = stderr;
|
1256
1441
|
} else {
|
1257
|
-
my_fprintf( *log_file, "%s version %s%s\n", INCHI_NAME, INCHI_VERSION, bRELEASE_VERSION? "":" (For pre-release testing)" );
|
1442
|
+
//my_fprintf( *log_file, "%s version %s%s%s\n", INCHI_NAME, INCHI_VERSION, SPECIAL_BUILD_STRING, bRELEASE_VERSION? "":" (For pre-release testing)" );
|
1258
1443
|
//my_fprintf( *log_file, "Opened log file '%s'\n", ip->path[2] );
|
1259
1444
|
}
|
1260
1445
|
/* input file */
|
1261
|
-
if ( (ip->nInputType == INPUT_MOLFILE || ip->nInputType == INPUT_SDFILE ||
|
1446
|
+
if ( (ip->nInputType == INPUT_MOLFILE || ip->nInputType == INPUT_SDFILE ||
|
1447
|
+
ip->nInputType == INPUT_CMLFILE || ip->nInputType == INPUT_INCHI) && ip->num_paths > 0 ) {
|
1262
1448
|
const char *fmode = NULL;
|
1263
1449
|
#if( defined(_MSC_VER)&&defined(_WIN32) || defined(__BORLANDC__)&&defined(__WIN32__) || defined(__GNUC__)&&defined(__MINGW32__)&&defined(_WIN32) )
|
1264
1450
|
/* compilers that definitely allow fopen "rb" (binary read) mode */
|
1451
|
+
fmode = "rb";
|
1265
1452
|
if ( !ip->path[0] || !ip->path[0][0] || !(*inp_file = fopen( ip->path[0], "rb" ) ) ) {
|
1266
1453
|
my_fprintf( *log_file, "Cannot open input file '%s'. Terminating.\n", ip->path[0]? ip->path[0] : "<No name>" );
|
1267
1454
|
goto exit_function;
|
1268
|
-
} else
|
1455
|
+
} else
|
1456
|
+
if ( ip->nInputType == INPUT_CMLFILE ) {
|
1269
1457
|
int c;
|
1270
1458
|
#ifdef CML_DEBUG
|
1271
1459
|
printf ("cr %d lf %d ret %d\n", (int) '\r', (int) '\f', (int) '\n');
|
@@ -1280,7 +1468,7 @@ int OpenFiles( FILE **inp_file, FILE **output_file, FILE **log_file, FILE **prb_
|
|
1280
1468
|
my_fprintf( *log_file, "Cannot open input file '%s' (2nd attempt). Terminating.\n", ip->path[0] );
|
1281
1469
|
goto exit_function;
|
1282
1470
|
}
|
1283
|
-
|
1471
|
+
my_fprintf( *log_file, "Opened input file '%s'\n", ip->path[0] );
|
1284
1472
|
fmode = "r";
|
1285
1473
|
} else {
|
1286
1474
|
fclose( *inp_file );
|
@@ -1303,7 +1491,7 @@ int OpenFiles( FILE **inp_file, FILE **output_file, FILE **log_file, FILE **prb_
|
|
1303
1491
|
#endif
|
1304
1492
|
DetectInputINChIFileType( inp_file, ip, fmode );
|
1305
1493
|
} else
|
1306
|
-
if ( (ip->nInputType != INPUT_MOLFILE && ip->nInputType != INPUT_SDFILE && ip->nInputType != INPUT_CMLFILE) ) {
|
1494
|
+
if ( (ip->nInputType != INPUT_MOLFILE && ip->nInputType != INPUT_SDFILE && ip->nInputType != INPUT_CMLFILE && ip->nInputType != INPUT_INCHI) ) {
|
1307
1495
|
my_fprintf( *log_file, "Input file type not specified. Terminating.\n");
|
1308
1496
|
goto exit_function;
|
1309
1497
|
} else {
|
@@ -1331,7 +1519,13 @@ int OpenFiles( FILE **inp_file, FILE **output_file, FILE **log_file, FILE **prb_
|
|
1331
1519
|
}
|
1332
1520
|
/* problem file */
|
1333
1521
|
if ( ip->path[3] && ip->path[3][0] ) {
|
1334
|
-
|
1522
|
+
const char *fmode = "w";
|
1523
|
+
#if( defined(_MSC_VER)&&defined(_WIN32) || defined(__BORLANDC__)&&defined(__WIN32__) || defined(__GNUC__)&&defined(__MINGW32__)&&defined(_WIN32) )
|
1524
|
+
if ( ip->nInputType != INPUT_CMLFILE ) {
|
1525
|
+
fmode = "wb";
|
1526
|
+
}
|
1527
|
+
#endif
|
1528
|
+
if ( !(*prb_file = fopen( ip->path[3], fmode ) ) ) {
|
1335
1529
|
my_fprintf( *log_file, "Cannot open problem file '%s'. Terminating.\n", ip->path[3] );
|
1336
1530
|
goto exit_function;
|
1337
1531
|
} else {
|
@@ -1344,7 +1538,7 @@ exit_function:
|
|
1344
1538
|
return 0; /* failed */
|
1345
1539
|
|
1346
1540
|
}
|
1347
|
-
#define NUM_VERSIONS
|
1541
|
+
#define NUM_VERSIONS 6
|
1348
1542
|
#define LEN_VERSIONS 64
|
1349
1543
|
/*******************************************************************/
|
1350
1544
|
static int bMatchOnePrefix( int len, char *str, int lenPrefix[],
|
@@ -1382,7 +1576,7 @@ int DetectInputINChIFileType( FILE **inp_file, INPUT_PARMS *ip, const char *fmod
|
|
1382
1576
|
static int lenXmlMsgFatal;
|
1383
1577
|
static int bInitilized = 0;
|
1384
1578
|
int bINChI_plain = 0, bINChI_xml = 0, len, i;
|
1385
|
-
if ( ip->nInputType == INPUT_INCHI_XML || ip->nInputType == INPUT_INCHI_PLAIN ) {
|
1579
|
+
if ( ip->nInputType == INPUT_INCHI_XML || ip->nInputType == INPUT_INCHI_PLAIN || ip->nInputType == INPUT_INCHI ) {
|
1386
1580
|
return 1;
|
1387
1581
|
}
|
1388
1582
|
if ( !bInitilized ) {
|
@@ -1390,18 +1584,26 @@ int DetectInputINChIFileType( FILE **inp_file, INPUT_PARMS *ip, const char *fmod
|
|
1390
1584
|
lenPlnVersion[1] = sprintf( szPlnVersion[1], "INChI=1.12Beta/" );
|
1391
1585
|
lenPlnVersion[2] = sprintf( szPlnVersion[2], "INChI=1.0RC/" );
|
1392
1586
|
lenPlnVersion[3] = sprintf( szPlnVersion[3], "InChI=1.0RC/" );
|
1587
|
+
lenPlnVersion[4] = sprintf( szPlnVersion[4], "InChI=1/" );
|
1588
|
+
lenPlnVersion[5] = sprintf( szPlnVersion[5], "MoChI=1a/" );
|
1393
1589
|
lenPlnAuxVer[0] = sprintf( szPlnAuxVer[0], "AuxInfo=%s/", INCHI_VERSION );
|
1394
1590
|
lenPlnAuxVer[1] = sprintf( szPlnAuxVer[1], "AuxInfo=1.12Beta/" );
|
1395
1591
|
lenPlnAuxVer[2] = sprintf( szPlnAuxVer[2], "AuxInfo=1.0RC/" );
|
1396
1592
|
lenPlnAuxVer[3] = sprintf( szPlnAuxVer[3], "AuxInfo=1.0RC/" );
|
1593
|
+
lenPlnAuxVer[4] = sprintf( szPlnAuxVer[4], "AuxInfo=1/" );
|
1594
|
+
lenPlnAuxVer[5] = sprintf( szPlnAuxVer[5], "AuxInfo=1a/" );
|
1397
1595
|
lenXmlVersion[0] = sprintf( szXmlVersion[0], "<%s version=\"%s\">", INCHI_NAME, INCHI_VERSION );
|
1398
1596
|
lenXmlVersion[1] = sprintf( szXmlVersion[1], "<INChI version=\"1.12Beta\">" );
|
1399
1597
|
lenXmlVersion[2] = sprintf( szXmlVersion[2], "<INChI version=\"1.0RC\">" );
|
1400
1598
|
lenXmlVersion[3] = sprintf( szXmlVersion[3], "<InChI version=\"1.0RC\">" );
|
1599
|
+
lenXmlVersion[4] = sprintf( szXmlVersion[4], "<InChI version=\"1\">" );
|
1600
|
+
lenXmlVersion[5] = sprintf( szXmlVersion[5], "<MoChI version=\"1a\">" );
|
1401
1601
|
lenXmlIdentVer[0] = sprintf( szXmlIdentVer[0], "<identifier version=\"%s\"", INCHI_VERSION );
|
1402
1602
|
lenXmlIdentVer[1] = sprintf( szXmlIdentVer[1], "<identifier version=\"1.12Beta\"" );
|
1403
1603
|
lenXmlIdentVer[2] = sprintf( szXmlIdentVer[2], "<identifier version=\"1.0RC\"" );
|
1404
1604
|
lenXmlIdentVer[3] = sprintf( szXmlIdentVer[3], "<identifier version=\"1.0RC\"" );
|
1605
|
+
lenXmlIdentVer[4] = sprintf( szXmlIdentVer[4], "<identifier version=\"1\"" );
|
1606
|
+
lenXmlIdentVer[5] = sprintf( szXmlIdentVer[5], "<identifier version=\"1a\"" );
|
1405
1607
|
lenXmlMsgError = sprintf( szXmlMsgError, "<message type=\"error (no %s)\"", INCHI_NAME );
|
1406
1608
|
lenXmlStruct = strlen(szXmlStruct);
|
1407
1609
|
lenXmlMsgFatal = strlen(szXmlMsgFatal);
|