rino 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README +44 -0
- data/Rakefile +123 -0
- data/ext/extconf.rb +26 -0
- data/ext/ruby_inchi_main.so +0 -0
- data/ext/src/aux2atom.h +2786 -0
- data/ext/src/comdef.h +148 -0
- data/ext/src/e_0dstereo.c +3014 -0
- data/ext/src/e_0dstereo.h +31 -0
- data/ext/src/e_comdef.h +57 -0
- data/ext/src/e_ctl_data.h +147 -0
- data/ext/src/e_ichi_io.c +498 -0
- data/ext/src/e_ichi_io.h +40 -0
- data/ext/src/e_ichi_parms.c +37 -0
- data/ext/src/e_ichi_parms.h +41 -0
- data/ext/src/e_ichicomp.h +50 -0
- data/ext/src/e_ichierr.h +40 -0
- data/ext/src/e_ichimain.c +593 -0
- data/ext/src/e_ichisize.h +43 -0
- data/ext/src/e_inchi_atom.c +75 -0
- data/ext/src/e_inchi_atom.h +33 -0
- data/ext/src/e_inpdef.h +41 -0
- data/ext/src/e_mode.h +706 -0
- data/ext/src/e_mol2atom.c +649 -0
- data/ext/src/e_readinch.c +58 -0
- data/ext/src/e_readmol.c +54 -0
- data/ext/src/e_readmol.h +180 -0
- data/ext/src/e_readstru.c +251 -0
- data/ext/src/e_readstru.h +33 -0
- data/ext/src/e_util.c +284 -0
- data/ext/src/e_util.h +61 -0
- data/ext/src/extr_ct.h +251 -0
- data/ext/src/ichi.h +206 -0
- data/ext/src/ichi_bns.c +7999 -0
- data/ext/src/ichi_bns.h +231 -0
- data/ext/src/ichican2.c +5000 -0
- data/ext/src/ichicano.c +2195 -0
- data/ext/src/ichicano.h +49 -0
- data/ext/src/ichicans.c +1625 -0
- data/ext/src/ichicant.h +379 -0
- data/ext/src/ichicomn.h +260 -0
- data/ext/src/ichicomp.h +50 -0
- data/ext/src/ichidrp.h +119 -0
- data/ext/src/ichierr.h +124 -0
- data/ext/src/ichiisot.c +101 -0
- data/ext/src/ichilnct.c +286 -0
- data/ext/src/ichimain.h +132 -0
- data/ext/src/ichimak2.c +1189 -0
- data/ext/src/ichimake.c +3812 -0
- data/ext/src/ichimake.h +205 -0
- data/ext/src/ichimap1.c +851 -0
- data/ext/src/ichimap2.c +2856 -0
- data/ext/src/ichimap4.c +1609 -0
- data/ext/src/ichinorm.c +741 -0
- data/ext/src/ichinorm.h +67 -0
- data/ext/src/ichiparm.c +45 -0
- data/ext/src/ichiparm.h +1441 -0
- data/ext/src/ichiprt1.c +3612 -0
- data/ext/src/ichiprt2.c +1511 -0
- data/ext/src/ichiprt3.c +3011 -0
- data/ext/src/ichiqueu.c +1003 -0
- data/ext/src/ichiring.c +326 -0
- data/ext/src/ichiring.h +49 -0
- data/ext/src/ichisize.h +35 -0
- data/ext/src/ichisort.c +539 -0
- data/ext/src/ichister.c +3538 -0
- data/ext/src/ichister.h +35 -0
- data/ext/src/ichitaut.c +3843 -0
- data/ext/src/ichitaut.h +387 -0
- data/ext/src/ichitime.h +74 -0
- data/ext/src/inchi_api.h +670 -0
- data/ext/src/inchi_dll.c +1480 -0
- data/ext/src/inchi_dll.h +34 -0
- data/ext/src/inchi_dll_main.c +23 -0
- data/ext/src/inchi_dll_main.h +31 -0
- data/ext/src/inpdef.h +328 -0
- data/ext/src/lreadmol.h +1246 -0
- data/ext/src/mode.h +706 -0
- data/ext/src/ruby_inchi_main.c +558 -0
- data/ext/src/runichi.c +4179 -0
- data/ext/src/strutil.c +3861 -0
- data/ext/src/strutil.h +182 -0
- data/ext/src/util.c +1130 -0
- data/ext/src/util.h +85 -0
- data/lib/clean_tempfile.rb +220 -0
- data/lib/rino.rb +111 -0
- data/test/test.rb +386 -0
- metadata +130 -0
@@ -0,0 +1,58 @@
|
|
1
|
+
/*
|
2
|
+
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
|
+
* International Chemical Identifier (InChI)
|
4
|
+
* Version 1
|
5
|
+
* Software version 1.00
|
6
|
+
* April 13, 2005
|
7
|
+
* Developed at NIST
|
8
|
+
*/
|
9
|
+
|
10
|
+
#include <stdio.h>
|
11
|
+
#include <stdlib.h>
|
12
|
+
#include <limits.h>
|
13
|
+
#include <math.h>
|
14
|
+
#include <float.h>
|
15
|
+
#include <string.h>
|
16
|
+
#include <ctype.h>
|
17
|
+
|
18
|
+
/* for use in the main program */
|
19
|
+
|
20
|
+
|
21
|
+
#include "e_mode.h"
|
22
|
+
#include "inchi_api.h"
|
23
|
+
#include "e_ctl_data.h"
|
24
|
+
#include "e_inchi_atom.h"
|
25
|
+
#include "e_ichi_io.h"
|
26
|
+
|
27
|
+
#include "e_ichisize.h"
|
28
|
+
#include "e_comdef.h"
|
29
|
+
#include "e_util.h"
|
30
|
+
#include "e_ichierr.h"
|
31
|
+
#include "e_ichicomp.h"
|
32
|
+
#include "e_readstru.h"
|
33
|
+
#include "e_inpdef.h"
|
34
|
+
|
35
|
+
/* rename to avoid duplicated entry points */
|
36
|
+
|
37
|
+
#define mystrncpy e_mystrncpy
|
38
|
+
#define LtrimRtrim e_LtrimRtrim
|
39
|
+
#define FreeInchi_Atom e_FreeInchi_Atom
|
40
|
+
#define FreeInchi_Stereo0D e_FreeInchi_Stereo0D
|
41
|
+
#define CreateInchi_Atom e_CreateInchi_Atom
|
42
|
+
#define CreateInchi_Stereo0D e_CreateInchi_Stereo0D
|
43
|
+
#define FreeInchi_Input e_FreeInchi_Input
|
44
|
+
#define AddMOLfileError e_AddMOLfileError
|
45
|
+
#define my_fgets e_my_fgets
|
46
|
+
#define my_fgetsTab e_my_fgetsTab
|
47
|
+
#define my_fgetsTab1 e_my_fgetsTab1
|
48
|
+
#define is_in_the_slist e_is_in_the_slist
|
49
|
+
#define is_element_a_metal e_is_element_a_metal
|
50
|
+
#define INChIToInchi_Atom e_INChIToInchi_Atom
|
51
|
+
#define INChIToInchi_Input e_INChIToInchi_Input
|
52
|
+
|
53
|
+
#define IGNORE_HEADERS
|
54
|
+
#define STATIC
|
55
|
+
|
56
|
+
/* This contains executable code. Included in lReadAux.c, e_ReadINCH.c, ReadINCH.c, */
|
57
|
+
#include "aux2atom.h"
|
58
|
+
|
data/ext/src/e_readmol.c
ADDED
@@ -0,0 +1,54 @@
|
|
1
|
+
/*
|
2
|
+
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
|
+
* International Chemical Identifier (InChI)
|
4
|
+
* Version 1
|
5
|
+
* Software version 1.00
|
6
|
+
* April 13, 2005
|
7
|
+
* Developed at NIST
|
8
|
+
*/
|
9
|
+
|
10
|
+
#include <stdio.h>
|
11
|
+
#include <stdlib.h>
|
12
|
+
#include <limits.h>
|
13
|
+
#include <math.h>
|
14
|
+
#include <float.h>
|
15
|
+
#include <string.h>
|
16
|
+
#include <ctype.h>
|
17
|
+
|
18
|
+
#include "e_mode.h"
|
19
|
+
#include "inchi_api.h"
|
20
|
+
#include "e_ctl_data.h"
|
21
|
+
|
22
|
+
#include "e_ichisize.h"
|
23
|
+
#include "e_comdef.h"
|
24
|
+
#include "e_util.h"
|
25
|
+
#include "e_readmol.h"
|
26
|
+
#include "e_ichicomp.h"
|
27
|
+
#include "e_ichi_io.h"
|
28
|
+
#include "e_readstru.h"
|
29
|
+
#include "e_inpdef.h"
|
30
|
+
|
31
|
+
#define AddMOLfileError e_AddMOLfileError
|
32
|
+
#define remove_one_lf e_remove_one_lf
|
33
|
+
#define RemoveNonPrintable e_RemoveNonPrintable
|
34
|
+
#define mystrncpy e_mystrncpy
|
35
|
+
#define read_mol_file e_read_mol_file
|
36
|
+
#define bypass_sdf_data_items e_bypass_sdf_data_items
|
37
|
+
#define extract_ChargeRadical e_extract_ChargeRadical
|
38
|
+
#define delete_mol_data e_delete_mol_data
|
39
|
+
#define remove_trailing_spaces e_remove_trailing_spaces
|
40
|
+
#define normalize_name e_normalize_name
|
41
|
+
#define read_sdfile_segment e_read_sdfile_segment
|
42
|
+
#define CopyMOLfile e_CopyMOLfile
|
43
|
+
#define LtrimRtrim e_LtrimRtrim
|
44
|
+
|
45
|
+
#ifndef inchi_calloc
|
46
|
+
#define inchi_calloc e_inchi_calloc
|
47
|
+
#endif
|
48
|
+
|
49
|
+
#ifndef inchi_free
|
50
|
+
#define inchi_free e_inchi_free
|
51
|
+
#endif
|
52
|
+
|
53
|
+
#include "lreadmol.h"
|
54
|
+
|
data/ext/src/e_readmol.h
ADDED
@@ -0,0 +1,180 @@
|
|
1
|
+
/*
|
2
|
+
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
|
+
* International Chemical Identifier (InChI)
|
4
|
+
* Version 1
|
5
|
+
* Software version 1.00
|
6
|
+
* April 13, 2005
|
7
|
+
* Developed at NIST
|
8
|
+
*/
|
9
|
+
|
10
|
+
#ifndef __READMOL_H__
|
11
|
+
#define __READMOL_H__
|
12
|
+
|
13
|
+
/*************** read MOL file V2000.************************/
|
14
|
+
/* ref: A.Dalby et al, "Description of Several Chemical Structure
|
15
|
+
* File Formats Used by Computer Programs Developed at Molecular
|
16
|
+
* Design Limited", J. Chem. Inf. Comput. Sci., 1992, 32, 244-255.
|
17
|
+
*/
|
18
|
+
|
19
|
+
/*
|
20
|
+
#define MOLFILEINPLINELEN 84 // add cr, lf, double zero termination
|
21
|
+
#ifndef MOLFILEMAXLINELEN
|
22
|
+
#define MOLFILEMAXLINELEN 80
|
23
|
+
#endif
|
24
|
+
*/
|
25
|
+
|
26
|
+
#define MOLFILEINPLINELEN 204 /* add cr, lf, double zero termination */
|
27
|
+
#ifndef MOLFILEMAXLINELEN
|
28
|
+
#define MOLFILEMAXLINELEN 200
|
29
|
+
#endif
|
30
|
+
|
31
|
+
|
32
|
+
#define MOL_PRESENT 1
|
33
|
+
#define MOL_ABSENT 0
|
34
|
+
|
35
|
+
/* configuration */
|
36
|
+
#define MOL_QUERY MOL_ABSENT
|
37
|
+
#define MOL_CPSS MOL_ABSENT
|
38
|
+
#define MOL_REACT MOL_ABSENT
|
39
|
+
|
40
|
+
#define MOL_STRING_DATA 'S'
|
41
|
+
#define MOL_CHAR_INT_DATA 'C'
|
42
|
+
#define MOL_SHORT_INT_DATA 'N'
|
43
|
+
#define MOL_LONG_INT_DATA 'L'
|
44
|
+
#define MOL_DOUBLE_DATA 'D'
|
45
|
+
#define MOL_FLOAT_DATA 'F'
|
46
|
+
#define MOL_JUMP_TO_RIGHT 'J'
|
47
|
+
#define MOL_MAX_VALUE_LEN 32 /* max length of string containing a numerical value */
|
48
|
+
|
49
|
+
|
50
|
+
#define SDF_END_OF_DATA "$$$$"
|
51
|
+
|
52
|
+
/****************************************************************************/
|
53
|
+
typedef struct tagMOL_HEADER_BLOCK {
|
54
|
+
/* Line #1 */
|
55
|
+
char szMoleculeName[MOLFILEMAXLINELEN+1]; /* up to 80 characters */
|
56
|
+
/* Line #2: optional */
|
57
|
+
char szMoleculeLine2[MOLFILEMAXLINELEN+1]; /* the whole line2 -- up to 80 characters */
|
58
|
+
char szUserInitials[3]; /* 2 bytes; char */
|
59
|
+
char szProgramName[9]; /* 8 bytes; char */
|
60
|
+
char cMonth; /* 2 bytes; integral */
|
61
|
+
char cDay; /* 2 bytes; integral */
|
62
|
+
char cYear; /* 2 bytes; integral */
|
63
|
+
char cHour; /* 2 bytes; integral */
|
64
|
+
char cMinute; /* 2 bytes; integral */
|
65
|
+
char szDimCode[3]; /* 2 bytes: dimensional code; char */
|
66
|
+
short nScalingFactor1; /* 2 bytes; I2 */
|
67
|
+
double dScalingFactor2; /* 10 bytes, F10.5 */
|
68
|
+
double dEnergy; /* 10 bytes, F10.5 */
|
69
|
+
long lInternalRegistryNumber;/* 6 bytes, integral */
|
70
|
+
/* Line #3: comment */
|
71
|
+
char szComment[81];
|
72
|
+
}MOL_HEADER_BLOCK;
|
73
|
+
|
74
|
+
/****************************************************************************/
|
75
|
+
typedef struct tagMOL_ATOM {
|
76
|
+
double fX; /* F10.5; Generic */
|
77
|
+
double fY; /* F10.5; Generic */
|
78
|
+
double fZ; /* F10.5; Generic */
|
79
|
+
char szAtomSymbol[6]; /* aaa; Generic */ /* changed from 4 to 6 to match STDATA */
|
80
|
+
S_SHORT cMassDifference; /* dd; (M_ISO) Generic: -3..+4 otherwise 0 or 127=most abund. isotope */
|
81
|
+
S_CHAR cCharge; /* ccc; (M CHG), Generic: 1=+3,2=+2,3=+1,4=doublet,5=-1,6=-2,7=-3 */
|
82
|
+
char cRadical; /* (M RAD) */
|
83
|
+
char cStereoParity; /* sss; Generic */
|
84
|
+
#if ( MOL_QUERY == MOL_PRESENT )
|
85
|
+
char cH_countPlus1; /* hhh; Query; Hn means >= n H; H0 means no H */
|
86
|
+
char cStereoCare; /* bbb; Query: 0=ignore; 1=must match */
|
87
|
+
#endif
|
88
|
+
char cValence; /* vvv: 0=no marking; (1..14)=(1..14); 15=zero valence */
|
89
|
+
/* number of bonds including bonds to implies H's */
|
90
|
+
#if ( MOL_CPSS == MOL_PRESENT )
|
91
|
+
char cH0_designator; /* HHH: CPSS */
|
92
|
+
char cReactionComponentType; /* rrr: CPSS: 1=reactant, 2=product, 3=intermediate */
|
93
|
+
char cReactionComponentNumber; /* iii: CPSS: 0 to (n-1) */
|
94
|
+
#endif
|
95
|
+
|
96
|
+
#if ( MOL_REACT == MOL_PRESENT )
|
97
|
+
short nAtomAtomMappingNumber; /* mmm: Reaction: 1..255 */
|
98
|
+
char cInversionRetentionFlag; /* nnn: 1=inverted,2=retained config.; 0=property not applied */
|
99
|
+
#endif
|
100
|
+
#if ( MOL_REACT == MOL_PRESENT || MOL_QUERY == MOL_PRESENT )
|
101
|
+
char cExactChargeFlag; /* eee: 1=charge on atom must match exactly, 0=property not applied */
|
102
|
+
#endif
|
103
|
+
char cMyNumImpH; /* number of implicit H calculated for adding H to strings in STDATA */
|
104
|
+
char cDisplayAtom; /* Do not hide element's name ( applies to C 7-25-98 DCh */
|
105
|
+
char cAtomAliasedFlag; /* Do not remove charge/radical/isotope if it is in the alias. 9-3-99 DCh */
|
106
|
+
} MOL_ATOM;
|
107
|
+
|
108
|
+
/****************************************************************************/
|
109
|
+
typedef struct tagMOL_BONDS {
|
110
|
+
short nAtomNo1; /* 111: First atom number: Generic */
|
111
|
+
short nAtomNo2; /* 222: Second atom number: Generic */
|
112
|
+
char cBondType; /* ttt: 1,2,3=single, double, triple; 4=aromatic; 5=single or double */
|
113
|
+
/* 6=single or aromatic, 7=double or aromatic, 8=any. */
|
114
|
+
/* values 4-8 are for SSS queries only */
|
115
|
+
char cBondStereo; /* sss: Single bonds: 0=not stereo, 1=up, 4=either, 6=down */
|
116
|
+
/* Double bonds: 0=use x,y,z to determine cis/trans */
|
117
|
+
/* 3=cis or trans (either) */
|
118
|
+
/* xxx: not used */
|
119
|
+
#if ( MOL_QUERY == MOL_PRESENT )
|
120
|
+
char cBondTopology; /* rrr: 0=either, 1=ring, 2=chain: SSS queries only */
|
121
|
+
#endif
|
122
|
+
#if ( MOL_REACT == MOL_PRESENT )
|
123
|
+
char cReactingCenterStatus; /* ccc: 0=unmarked, 1=a center, -1=not a center; Additional: */
|
124
|
+
/* 2=no charge,4=bond made/broken,8=bond order changes */
|
125
|
+
/* 12=4+8; 5=4+1, 9=8+1, 13=12+1 are also possible */
|
126
|
+
#endif
|
127
|
+
} MOL_BONDS;
|
128
|
+
/****************************************************************************/
|
129
|
+
typedef struct tagMOL_CTAB {
|
130
|
+
/* Line #1: Counts line */
|
131
|
+
short nNumberOfAtoms; /* aaa; <= 999; Generic */
|
132
|
+
short nNumberOfBonds; /* bbb; <= 999; Generic */
|
133
|
+
#if ( MOL_QUERY == MOL_PRESENT )
|
134
|
+
short nNumberOfAtomsLists; /* lll; <= 30; Query */
|
135
|
+
#endif
|
136
|
+
/* fff; Obsolete */
|
137
|
+
char cChiralFlag; /* ccc; 0 or 1; Generic */
|
138
|
+
short nNumberOfStextEntries; /* sss; CPSS */
|
139
|
+
#if ( MOL_CPSS == MOL_PRESENT )
|
140
|
+
short nNumberOfReactionComponentsPlus1; /* xxx; CPSS */
|
141
|
+
short nNumberOfReactants; /* rrr; CPSS */
|
142
|
+
short nNumberOfProducts; /* ppp; CPSS */
|
143
|
+
short nNumberOfIntermediates; /* iii; CPSS */
|
144
|
+
#endif
|
145
|
+
short nNumberOfPropertyLines; /* mmm; Generic */
|
146
|
+
char csCurrentCtabVersion[7]; /* vvvvvv; Generic; 'V2000' */
|
147
|
+
/* The Atom Block */
|
148
|
+
MOL_ATOM *MolAtom;
|
149
|
+
MOL_BONDS *MolBond;
|
150
|
+
MOL_COORD *szCoord;
|
151
|
+
} MOL_CTAB;
|
152
|
+
|
153
|
+
typedef struct tagMOL_DATA {
|
154
|
+
MOL_HEADER_BLOCK hdr;
|
155
|
+
MOL_CTAB ctab;
|
156
|
+
} MOL_DATA;
|
157
|
+
|
158
|
+
#ifndef INCHI_ALL_CPP
|
159
|
+
#ifdef __cplusplus
|
160
|
+
extern "C" {
|
161
|
+
#endif
|
162
|
+
#endif
|
163
|
+
|
164
|
+
|
165
|
+
MOL_DATA* e_delete_mol_data( MOL_DATA* mol_data );
|
166
|
+
|
167
|
+
MOL_DATA* e_read_sdfile_segment(FILE* inp, MOL_HEADER_BLOCK *OnlyHeaderBlock, MOL_CTAB *OnlyCtab,
|
168
|
+
int bGetOrigCoord,
|
169
|
+
char *pname, int lname,
|
170
|
+
long *Id, const char *pSdfLabel, char *pSdfValue,
|
171
|
+
int *err, char *pStrErr );
|
172
|
+
|
173
|
+
|
174
|
+
#ifndef INCHI_ALL_CPP
|
175
|
+
#ifdef __cplusplus
|
176
|
+
}
|
177
|
+
#endif
|
178
|
+
#endif
|
179
|
+
|
180
|
+
#endif /*__READMOL_H__*/
|
@@ -0,0 +1,251 @@
|
|
1
|
+
/*
|
2
|
+
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
|
+
* International Chemical Identifier (InChI)
|
4
|
+
* Version 1
|
5
|
+
* Software version 1.00
|
6
|
+
* April 13, 2005
|
7
|
+
* Developed at NIST
|
8
|
+
*/
|
9
|
+
|
10
|
+
#include <stdio.h>
|
11
|
+
#include <stdlib.h>
|
12
|
+
|
13
|
+
#include <string.h>
|
14
|
+
#include <ctype.h>
|
15
|
+
#include <stdarg.h>
|
16
|
+
#include <errno.h>
|
17
|
+
#include <limits.h>
|
18
|
+
#include <float.h>
|
19
|
+
|
20
|
+
#include "e_mode.h"
|
21
|
+
#include "ichitime.h"
|
22
|
+
#include "inchi_api.h"
|
23
|
+
#include "e_ctl_data.h"
|
24
|
+
#include "e_readstru.h"
|
25
|
+
#include "e_ichi_io.h"
|
26
|
+
#include "e_util.h"
|
27
|
+
#include "e_ichierr.h"
|
28
|
+
#include "e_inpdef.h"
|
29
|
+
|
30
|
+
int e_TreatReadTheStructureErrors( STRUCT_DATA *sd, INPUT_PARMS *ip,
|
31
|
+
FILE *inp_file, FILE *log_file, FILE *output_file, FILE *prb_file,
|
32
|
+
inchi_Input *pInp, int *num_inp );
|
33
|
+
int e_GetInpStructErrorType( INPUT_PARMS *ip, int err, char *pStrErrStruct, int num_inp_atoms );
|
34
|
+
|
35
|
+
/*********************************************************************************************************/
|
36
|
+
int e_ReadStructure( STRUCT_DATA *sd, INPUT_PARMS *ip,
|
37
|
+
FILE *inp_file, FILE *log_file, FILE *output_file, FILE *prb_file,
|
38
|
+
inchi_Input *pInp, int num_inp, /* for CML:*/ int inp_index, int *out_index )
|
39
|
+
{
|
40
|
+
inchiTime ulTStart;
|
41
|
+
int nRet = 0, nRet2 = 0;
|
42
|
+
int bGetOrigCoord = 0;
|
43
|
+
INCHI_MODE InpAtomFlags = 0;
|
44
|
+
|
45
|
+
memset( sd, 0, sizeof(*sd) );
|
46
|
+
switch ( ip->nInputType ) {
|
47
|
+
case INPUT_MOLFILE:
|
48
|
+
case INPUT_SDFILE:
|
49
|
+
if ( pInp ) {
|
50
|
+
if ( ip->pSdfValue && ip->pSdfValue[0] ) {
|
51
|
+
/* Added 07-29-2003 to avoid inheriting exact value from prev. structure
|
52
|
+
and to make reference to a (bad) structure with unknown ID Value */
|
53
|
+
char *p, *q; /* q shadows prev declaration of const char *q */
|
54
|
+
int n;
|
55
|
+
if ( (p = strrchr( ip->pSdfValue, '+' )) &&
|
56
|
+
'[' == *(p-1) && 0 < (n=strtol(p+1,&q,10)) && q[0] && ']'==q[0] && !q[1] ) {
|
57
|
+
sprintf( p+1, "%d]", n+1 );
|
58
|
+
} else {
|
59
|
+
strcat( ip->pSdfValue, " [+1]" );
|
60
|
+
}
|
61
|
+
}
|
62
|
+
e_InchiTimeGet( &ulTStart );
|
63
|
+
sd->fPtrStart = (inp_file == stdin)? -1 : ftell( inp_file );
|
64
|
+
/* read the original structure */
|
65
|
+
nRet2 = e_MolfileToInchi_Input( inp_file, pInp, ip->bMergeAllInputStructures,
|
66
|
+
ip->bDoNotAddH, ip->bAllowEmptyStructure,
|
67
|
+
ip->pSdfLabel, ip->pSdfValue, &ip->lSdfId, &ip->lMolfileNumber,
|
68
|
+
&InpAtomFlags, &sd->nStructReadError, sd->pStrErrStruct );
|
69
|
+
|
70
|
+
sd->bChiralFlag |= InpAtomFlags;
|
71
|
+
if ( !ip->bGetSdfileId || ip->lSdfId == 999999) ip->lSdfId = 0;
|
72
|
+
if ( !ip->bGetMolfileNumber || ip->lMolfileNumber < 0 ) ip->lMolfileNumber = 0;
|
73
|
+
sd->fPtrEnd = (inp_file == stdin)? -1 : ftell( inp_file );
|
74
|
+
sd->ulStructTime += e_InchiTimeElapsed( &ulTStart );
|
75
|
+
} else {
|
76
|
+
/* read the next original structure */
|
77
|
+
int nStructReadError=0;
|
78
|
+
if ( !ip->bMergeAllInputStructures ) {
|
79
|
+
nRet2 = e_MolfileToInchi_Input( inp_file, NULL, 0, 0, 0,
|
80
|
+
NULL, NULL, NULL, NULL, NULL, &nStructReadError, NULL );
|
81
|
+
if ( nRet2 <= 0 && 10 < nStructReadError && nStructReadError < 20 ) {
|
82
|
+
return _IS_EOF;
|
83
|
+
}
|
84
|
+
} else {
|
85
|
+
return _IS_EOF;
|
86
|
+
}
|
87
|
+
}
|
88
|
+
break;
|
89
|
+
case INPUT_INCHI_XML:
|
90
|
+
case INPUT_INCHI_PLAIN:
|
91
|
+
if ( pInp ) {
|
92
|
+
if ( ip->pSdfValue && ip->pSdfValue[0] ) {
|
93
|
+
/* Added 07-29-2003 to avoid inheriting exact value from prev. structure
|
94
|
+
and to make reference to a (bad) structure with unknown ID Value */
|
95
|
+
char *p, *q;
|
96
|
+
int n;
|
97
|
+
if ( (p = strrchr( ip->pSdfValue, '+' )) &&
|
98
|
+
'[' == *(p-1) && 0 < (n=strtol(p+1,&q,10)) && q[0] && ']'==q[0] && !q[1] ) {
|
99
|
+
sprintf( p+1, "%d]", n+1 );
|
100
|
+
} else {
|
101
|
+
strcat( ip->pSdfValue, " [+1]" );
|
102
|
+
}
|
103
|
+
}
|
104
|
+
e_InchiTimeGet( &ulTStart );
|
105
|
+
sd->fPtrStart = (inp_file == stdin)? -1 : ftell( inp_file );
|
106
|
+
/* read the original structure */
|
107
|
+
nRet2 = e_INChIToInchi_Input( inp_file, pInp, ip->bMergeAllInputStructures, ip->bDoNotAddH,
|
108
|
+
ip->nInputType, ip->pSdfLabel, ip->pSdfValue, &ip->lMolfileNumber,
|
109
|
+
&InpAtomFlags, &sd->nStructReadError, sd->pStrErrStruct );
|
110
|
+
/*if ( !ip->bGetSdfileId || ip->lSdfId == 999999) ip->lSdfId = 0;*/
|
111
|
+
sd->bChiralFlag |= InpAtomFlags;
|
112
|
+
sd->fPtrEnd = (inp_file == stdin)? -1 : ftell( inp_file );
|
113
|
+
sd->ulStructTime += e_InchiTimeElapsed( &ulTStart );
|
114
|
+
} else {
|
115
|
+
/* read the next original structure */
|
116
|
+
int nStructReadError=0;
|
117
|
+
if ( !ip->bMergeAllInputStructures ) {
|
118
|
+
nRet2 = e_INChIToInchi_Input( inp_file, NULL, 0, 0,
|
119
|
+
ip->nInputType, NULL, NULL, NULL, NULL, &nStructReadError, NULL );
|
120
|
+
if ( nRet2 <= 0 && 10 < nStructReadError && nStructReadError < 20 ) {
|
121
|
+
return _IS_EOF;
|
122
|
+
}
|
123
|
+
} else {
|
124
|
+
return _IS_EOF;
|
125
|
+
}
|
126
|
+
}
|
127
|
+
break;
|
128
|
+
|
129
|
+
#if( ADD_CMLPP == 1 )
|
130
|
+
/* BILLY 8/6/04 */
|
131
|
+
case INPUT_CMLFILE:
|
132
|
+
if ( pInp ) {
|
133
|
+
|
134
|
+
e_InchiTimeGet( &ulTStart );
|
135
|
+
/*
|
136
|
+
if ( inp_index >= 0 ) {
|
137
|
+
sd->fPtrStart = inp_index;
|
138
|
+
} else {
|
139
|
+
sd->fPtrStart = GetCmlStructIndex();
|
140
|
+
}
|
141
|
+
*/
|
142
|
+
sd->fPtrStart = -1; /* disable "e_CopyMOLfile() for CML input files */
|
143
|
+
sd->fPtrEnd = -1;
|
144
|
+
/* read the original structure */
|
145
|
+
nRet = CmlfileToOrigAtom( inp_file, pInp, ip->bMergeAllInputStructures,
|
146
|
+
bGetOrigCoord, ip->bDoNotAddH, inp_index, out_index,
|
147
|
+
ip->pSdfLabel, ip->pSdfValue, &ip->lSdfId,
|
148
|
+
&sd->nStructReadError, sd->pStrErrStruct );
|
149
|
+
|
150
|
+
|
151
|
+
sd->ulStructTime += e_InchiTimeElapsed( &ulTStart );
|
152
|
+
#if( bRELEASE_VERSION == 0 )
|
153
|
+
sd->bExtract |= pInp->bExtract;
|
154
|
+
#endif
|
155
|
+
} else {
|
156
|
+
/* read the next original structure */
|
157
|
+
int nStructReadError=0;
|
158
|
+
if ( !ip->bMergeAllInputStructures ) {
|
159
|
+
nRet2 = CmlfileToOrigAtom( inp_file, NULL, 0, 0, 0, inp_index, out_index,
|
160
|
+
NULL, NULL, NULL, &nStructReadError, NULL );
|
161
|
+
|
162
|
+
if ( nRet2 <= 0 && 10 < nStructReadError && nStructReadError < 20 ) {
|
163
|
+
return _IS_EOF;
|
164
|
+
}
|
165
|
+
} else {
|
166
|
+
return _IS_EOF;
|
167
|
+
}
|
168
|
+
}
|
169
|
+
break;
|
170
|
+
#endif
|
171
|
+
|
172
|
+
default:
|
173
|
+
nRet = _IS_FATAL; /* wrong file type */
|
174
|
+
}
|
175
|
+
nRet2 = e_TreatReadTheStructureErrors( sd, ip, inp_file, log_file, output_file, prb_file,
|
176
|
+
pInp, &num_inp );
|
177
|
+
if ( (!nRet || nRet == _IS_WARNING) && nRet2 )
|
178
|
+
nRet = nRet2;
|
179
|
+
|
180
|
+
return nRet;
|
181
|
+
}
|
182
|
+
/*****************************************************************************************************/
|
183
|
+
int e_TreatReadTheStructureErrors( STRUCT_DATA *sd, INPUT_PARMS *ip,
|
184
|
+
FILE *inp_file, FILE *log_file, FILE *output_file, FILE *prb_file,
|
185
|
+
inchi_Input *pInp, int *num_inp )
|
186
|
+
{
|
187
|
+
int nRet = _IS_OKAY;
|
188
|
+
/* End of file */
|
189
|
+
if ( 10 < sd->nStructReadError && sd->nStructReadError < 20 ) {
|
190
|
+
nRet = _IS_EOF;
|
191
|
+
goto exit_function; /* end of file */
|
192
|
+
}
|
193
|
+
/* Skipping the structures */
|
194
|
+
if ( *num_inp < ip->first_struct_number ) {
|
195
|
+
if ( log_file != stderr ) {
|
196
|
+
//e_my_fprintf( stderr, "\rSkipping structure #%d.%s%s%s%s...\r", *num_inp, SDF_LBL_VAL(ip->pSdfLabel,ip->pSdfValue));
|
197
|
+
}
|
198
|
+
nRet = sd->nErrorType = _IS_SKIP;
|
199
|
+
goto exit_function;
|
200
|
+
}
|
201
|
+
|
202
|
+
sd->nErrorType = e_GetInpStructErrorType( ip, sd->nStructReadError, sd->pStrErrStruct, pInp->num_atoms );
|
203
|
+
|
204
|
+
/* Fatal error */
|
205
|
+
if ( sd->nErrorType == _IS_FATAL ) {
|
206
|
+
e_my_fprintf( log_file, "Fatal Error %d (aborted; %s) inp structure #%d.%s%s%s%s\n",
|
207
|
+
sd->nStructReadError, sd->pStrErrStruct, *num_inp, SDF_LBL_VAL(ip->pSdfLabel,ip->pSdfValue) );
|
208
|
+
#if( bRELEASE_VERSION == 1 || EXTR_FLAGS == 0 )
|
209
|
+
if ( prb_file && 0L <= sd->fPtrStart && sd->fPtrStart < sd->fPtrEnd && !ip->bSaveAllGoodStructsAsProblem ) {
|
210
|
+
e_CopyMOLfile(inp_file, sd->fPtrStart, sd->fPtrEnd, prb_file, *num_inp);
|
211
|
+
}
|
212
|
+
#endif
|
213
|
+
/* goto exit_function; */
|
214
|
+
}
|
215
|
+
/* Non-fatal errors: do not produce INChI */
|
216
|
+
if ( sd->nErrorType == _IS_ERROR ) { /* 70 => too many atoms */
|
217
|
+
e_my_fprintf( log_file, "Error %d (no INChI; %s) inp structure #%d.%s%s%s%s\n",
|
218
|
+
sd->nStructReadError, sd->pStrErrStruct, *num_inp, SDF_LBL_VAL(ip->pSdfLabel,ip->pSdfValue) );
|
219
|
+
#if( bRELEASE_VERSION == 1 || EXTR_FLAGS == 0 )
|
220
|
+
if ( prb_file && 0L <= sd->fPtrStart && sd->fPtrStart < sd->fPtrEnd && !ip->bSaveAllGoodStructsAsProblem) {
|
221
|
+
e_CopyMOLfile(inp_file, sd->fPtrStart, sd->fPtrEnd, prb_file, *num_inp);
|
222
|
+
}
|
223
|
+
#endif
|
224
|
+
}
|
225
|
+
/* Warnings: try to produce INChI */
|
226
|
+
if ( sd->nErrorType == _IS_WARNING ) {
|
227
|
+
e_my_fprintf( log_file, "Warning: (%s) inp structure #%d.%s%s%s%s\n",
|
228
|
+
sd->pStrErrStruct, *num_inp, SDF_LBL_VAL(ip->pSdfLabel,ip->pSdfValue) );
|
229
|
+
}
|
230
|
+
exit_function:
|
231
|
+
if ( nRet <= _IS_OKAY && sd->nErrorType > 0 ) {
|
232
|
+
nRet = sd->nErrorType;
|
233
|
+
}
|
234
|
+
return nRet;
|
235
|
+
}
|
236
|
+
/**********************************************************************************************/
|
237
|
+
int e_GetInpStructErrorType( INPUT_PARMS *ip, int err, char *pStrErrStruct, int num_inp_atoms )
|
238
|
+
{
|
239
|
+
if ( err && err == 9 )
|
240
|
+
return _IS_ERROR; /* sdfile bypassed to $$$$ */
|
241
|
+
if ( err && err < 30 )
|
242
|
+
return _IS_FATAL;
|
243
|
+
if ( num_inp_atoms <= 0 || err ) {
|
244
|
+
if ( 98 == err && 0 == num_inp_atoms && ip->bAllowEmptyStructure )
|
245
|
+
return _IS_OKAY /* _IS_WARNING*/; /* the warning will be issued by the dll */
|
246
|
+
return _IS_ERROR;
|
247
|
+
}
|
248
|
+
if ( pStrErrStruct[0] )
|
249
|
+
return _IS_WARNING;
|
250
|
+
return _IS_OKAY;
|
251
|
+
}
|
@@ -0,0 +1,33 @@
|
|
1
|
+
/*
|
2
|
+
* International Union of Pure and Applied Chemistry (IUPAC)
|
3
|
+
* International Chemical Identifier (InChI)
|
4
|
+
* Version 1
|
5
|
+
* Software version 1.00
|
6
|
+
* April 13, 2005
|
7
|
+
* Developed at NIST
|
8
|
+
*/
|
9
|
+
|
10
|
+
#ifndef __READSTRU_H__
|
11
|
+
#define __READSTRU_H__
|
12
|
+
|
13
|
+
|
14
|
+
#ifndef INCHI_ALL_CPP
|
15
|
+
#ifdef __cplusplus
|
16
|
+
extern "C" {
|
17
|
+
#endif
|
18
|
+
#endif
|
19
|
+
|
20
|
+
|
21
|
+
|
22
|
+
int e_ReadStructure( STRUCT_DATA *sd, INPUT_PARMS *ip, FILE *inp_file, FILE *log_file, FILE *output_file, FILE *prb_file,
|
23
|
+
inchi_Input *pInp, int num_inp, /* for CML:*/ int inp_index, int *out_index );
|
24
|
+
|
25
|
+
|
26
|
+
#ifndef INCHI_ALL_CPP
|
27
|
+
#ifdef __cplusplus
|
28
|
+
}
|
29
|
+
#endif
|
30
|
+
#endif
|
31
|
+
|
32
|
+
|
33
|
+
#endif /* __READSTRU_H__ */
|