rino 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (87) hide show
  1. data/README +44 -0
  2. data/Rakefile +123 -0
  3. data/ext/extconf.rb +26 -0
  4. data/ext/ruby_inchi_main.so +0 -0
  5. data/ext/src/aux2atom.h +2786 -0
  6. data/ext/src/comdef.h +148 -0
  7. data/ext/src/e_0dstereo.c +3014 -0
  8. data/ext/src/e_0dstereo.h +31 -0
  9. data/ext/src/e_comdef.h +57 -0
  10. data/ext/src/e_ctl_data.h +147 -0
  11. data/ext/src/e_ichi_io.c +498 -0
  12. data/ext/src/e_ichi_io.h +40 -0
  13. data/ext/src/e_ichi_parms.c +37 -0
  14. data/ext/src/e_ichi_parms.h +41 -0
  15. data/ext/src/e_ichicomp.h +50 -0
  16. data/ext/src/e_ichierr.h +40 -0
  17. data/ext/src/e_ichimain.c +593 -0
  18. data/ext/src/e_ichisize.h +43 -0
  19. data/ext/src/e_inchi_atom.c +75 -0
  20. data/ext/src/e_inchi_atom.h +33 -0
  21. data/ext/src/e_inpdef.h +41 -0
  22. data/ext/src/e_mode.h +706 -0
  23. data/ext/src/e_mol2atom.c +649 -0
  24. data/ext/src/e_readinch.c +58 -0
  25. data/ext/src/e_readmol.c +54 -0
  26. data/ext/src/e_readmol.h +180 -0
  27. data/ext/src/e_readstru.c +251 -0
  28. data/ext/src/e_readstru.h +33 -0
  29. data/ext/src/e_util.c +284 -0
  30. data/ext/src/e_util.h +61 -0
  31. data/ext/src/extr_ct.h +251 -0
  32. data/ext/src/ichi.h +206 -0
  33. data/ext/src/ichi_bns.c +7999 -0
  34. data/ext/src/ichi_bns.h +231 -0
  35. data/ext/src/ichican2.c +5000 -0
  36. data/ext/src/ichicano.c +2195 -0
  37. data/ext/src/ichicano.h +49 -0
  38. data/ext/src/ichicans.c +1625 -0
  39. data/ext/src/ichicant.h +379 -0
  40. data/ext/src/ichicomn.h +260 -0
  41. data/ext/src/ichicomp.h +50 -0
  42. data/ext/src/ichidrp.h +119 -0
  43. data/ext/src/ichierr.h +124 -0
  44. data/ext/src/ichiisot.c +101 -0
  45. data/ext/src/ichilnct.c +286 -0
  46. data/ext/src/ichimain.h +132 -0
  47. data/ext/src/ichimak2.c +1189 -0
  48. data/ext/src/ichimake.c +3812 -0
  49. data/ext/src/ichimake.h +205 -0
  50. data/ext/src/ichimap1.c +851 -0
  51. data/ext/src/ichimap2.c +2856 -0
  52. data/ext/src/ichimap4.c +1609 -0
  53. data/ext/src/ichinorm.c +741 -0
  54. data/ext/src/ichinorm.h +67 -0
  55. data/ext/src/ichiparm.c +45 -0
  56. data/ext/src/ichiparm.h +1441 -0
  57. data/ext/src/ichiprt1.c +3612 -0
  58. data/ext/src/ichiprt2.c +1511 -0
  59. data/ext/src/ichiprt3.c +3011 -0
  60. data/ext/src/ichiqueu.c +1003 -0
  61. data/ext/src/ichiring.c +326 -0
  62. data/ext/src/ichiring.h +49 -0
  63. data/ext/src/ichisize.h +35 -0
  64. data/ext/src/ichisort.c +539 -0
  65. data/ext/src/ichister.c +3538 -0
  66. data/ext/src/ichister.h +35 -0
  67. data/ext/src/ichitaut.c +3843 -0
  68. data/ext/src/ichitaut.h +387 -0
  69. data/ext/src/ichitime.h +74 -0
  70. data/ext/src/inchi_api.h +670 -0
  71. data/ext/src/inchi_dll.c +1480 -0
  72. data/ext/src/inchi_dll.h +34 -0
  73. data/ext/src/inchi_dll_main.c +23 -0
  74. data/ext/src/inchi_dll_main.h +31 -0
  75. data/ext/src/inpdef.h +328 -0
  76. data/ext/src/lreadmol.h +1246 -0
  77. data/ext/src/mode.h +706 -0
  78. data/ext/src/ruby_inchi_main.c +558 -0
  79. data/ext/src/runichi.c +4179 -0
  80. data/ext/src/strutil.c +3861 -0
  81. data/ext/src/strutil.h +182 -0
  82. data/ext/src/util.c +1130 -0
  83. data/ext/src/util.h +85 -0
  84. data/lib/clean_tempfile.rb +220 -0
  85. data/lib/rino.rb +111 -0
  86. data/test/test.rb +386 -0
  87. metadata +130 -0
@@ -0,0 +1,50 @@
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 __INCHI_COMPAT_H__
11
+ #define __INCHI_COMPAT_H__
12
+
13
+ /* compatibility */
14
+
15
+ #if( defined(__GNUC__) && defined(__MINGW32__) && __GNUC__ == 3 && __GNUC_MINOR__ == 2 && __GNUC_PATCHLEVEL__ == 0 && defined(_WIN32) )
16
+ /* replace with the proper definition for GNU gcc & MinGW-2.0.0-3 (mingw special 20020817-1), gcc 3.2 core */
17
+ #define my_va_start(A,B) ((A)=(va_list)__builtin_next_arg(lpszFormat))
18
+ #else
19
+ #define my_va_start va_start
20
+ #endif
21
+
22
+
23
+
24
+ /* ANSI redefinitions */
25
+ #ifdef INCHI_ANSI_ONLY /* { */
26
+ #ifndef __isascii
27
+ #define __isascii(val) ((unsigned)(val) <= 0x7F)
28
+ #endif
29
+
30
+ /* #ifndef __GNUC__ */
31
+ /* these non-ANSI functions are implemented in gcc */
32
+ #include <stdio.h>
33
+ /* this #include provides size_t definition */
34
+ /* implementation is located in util.c */
35
+ #if ( !defined(_MSC_VER) || defined(__STDC__) && __STDC__ == 1 )
36
+ /* support (VC++ Language extensions) = OFF && defined(INCHI_ANSI_ONLY) */
37
+ int memicmp (const void*, const void*, size_t);
38
+ int stricmp( const char *s1, const char *s2 );
39
+ char *_strnset( char *string, int c, size_t count );
40
+ char *_strdup( const char *string );
41
+ #endif
42
+ /* #endif */
43
+
44
+ #endif /* } */
45
+
46
+ #define inchi_max(a,b) (((a)>(b))?(a):(b))
47
+ #define inchi_min(a,b) (((a)<(b))?(a):(b))
48
+
49
+
50
+ #endif /* __INCHI_COMPAT_H__ */
data/ext/src/ichidrp.h ADDED
@@ -0,0 +1,119 @@
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 __INCHIDRP_H__
11
+ #define __INCHIDRP_H__
12
+
13
+ #ifndef INCHI_ANSI_ONLY /* { */
14
+ /********************************************
15
+ * Parameters for the structure drawing
16
+ ********************************************/
17
+ #define TDP_LEN_LBL 16 /* length of a label (label: Req., Shown, Found) */
18
+ /* #define TDP_NUM_LBL 3 */ /* number of labels */
19
+ /* #define TDP_NUM_PAR 3 */ /* number of types per label (types: B/T, I/N, S) */
20
+ typedef enum tagTblTypes {itBASIC, itISOTOPIC, itSTEREO, TDP_NUM_PAR} TBL_TYPES; /* types */
21
+ typedef enum tagTblLabels{ ilSHOWN, TDP_NUM_LBL} TBL_LABELS; /* labels */
22
+ typedef struct tagTblDrawPatms {
23
+ char ReqShownFoundTxt[TDP_NUM_LBL][TDP_LEN_LBL];
24
+ char ReqShownFound[TDP_NUM_LBL][TDP_NUM_PAR];
25
+ int nOrientation; /* 10*degrees: 0 or 2700 */
26
+ int bDrawTbl;
27
+ } TBL_DRAW_PARMS;
28
+ /*********************************************/
29
+ typedef struct tagDrawParmsSettings {
30
+ TBL_DRAW_PARMS *tdp;
31
+ unsigned long ulDisplTime;
32
+ int bOrigAtom;
33
+ int nFontSize;
34
+ } SET_DRAW_PARMS; /* input only: how to draw or calculate */
35
+ /*********************************************/
36
+ typedef struct tagReturnedDrawParms {
37
+ int bEsc;
38
+ } RET_DRAW_PARMS;
39
+ /*********************************************/
40
+ typedef struct tagPersistDrawParms {
41
+ int rcPict[4];
42
+ } PER_DRAW_PARMS; /* saved between displaying different structures */
43
+ /*********************************************/
44
+ typedef struct tagDrawParms {
45
+ SET_DRAW_PARMS sdp; /* how to draw: fill on the 1st call */
46
+ RET_DRAW_PARMS rdp; /* returned when drawing window is closed */
47
+ PER_DRAW_PARMS *pdp; /* persistent: save between calls (window size) */
48
+ #ifndef INCHI_LIB
49
+ #ifndef INCHI_ANSI_ONLY
50
+ AT_NUMB *nEquLabels; /* num_inp_atoms elements, value>0 marks atoms in the set #value */
51
+ AT_NUMB nNumEquSets; /* max mark value */
52
+ AT_NUMB nCurEquLabel; /* current mark */
53
+ #endif
54
+ #endif
55
+ } DRAW_PARMS; /* Settings: How to draw the structure */
56
+
57
+ #endif /* } INCHI_ANSI_ONLY */
58
+
59
+ #if( ACD_LABS_VERSION == 1 )
60
+ #define MAX_NUM_PATHS 5
61
+ #else
62
+ #define MAX_NUM_PATHS 4
63
+ #endif
64
+
65
+ typedef enum tagInputType { INPUT_NONE=0, INPUT_MOLFILE=1, INPUT_SDFILE=2, INPUT_INCHI_XML=3, INPUT_INCHI_PLAIN=4, INPUT_CMLFILE=5, INPUT_MAX } INPUT_TYPE;
66
+ typedef struct tagInputParms {
67
+ char szSdfDataHeader[MAX_SDF_HEADER+1];
68
+ char *pSdfLabel;
69
+ char *pSdfValue;
70
+ long lSdfId;
71
+ long lMolfileNumber;
72
+ #ifndef INCHI_ANSI_ONLY
73
+ DRAW_PARMS dp;
74
+ PER_DRAW_PARMS pdp;
75
+ TBL_DRAW_PARMS tdp;
76
+ #endif
77
+ /*
78
+ -- Files --
79
+ ip->path[0] => Input
80
+ ip->path[1] => Output (INChI)
81
+ ip->path[2] => Log
82
+ ip->path[3] => Problem structures
83
+ ip->path[4] => Errors file (ACD(
84
+
85
+ */
86
+ const char *path[MAX_NUM_PATHS];
87
+ int num_paths;
88
+ int first_struct_number;
89
+ int last_struct_number;
90
+ INPUT_TYPE nInputType;
91
+ INCHI_MODE nMode;
92
+ int bAbcNumbers;
93
+ /*int bXml;*/
94
+ int bINChIOutputOptions; /* !(ip->bINChIOutputOptions & INCHI_OUT_PLAIN_TEXT) */
95
+ int bCtPredecessors;
96
+ int bXmlStarted;
97
+ int bDisplayEachComponentINChI;
98
+
99
+ long msec_MaxTime; /* was ulMaxTime; max time to run ProsessOneStructure */
100
+ long msec_LeftTime;
101
+
102
+ long ulDisplTime; /* not used: max structure or question display time */
103
+ int bDisplay;
104
+ int bMergeAllInputStructures;
105
+ int bSaveWarningStructsAsProblem;
106
+ int bSaveAllGoodStructsAsProblem;
107
+ int bGetSdfileId;
108
+ int bGetMolfileNumber; /* read molfile number from the name line like "Structure #22" */
109
+ int bCompareComponents; /* see flags CMP_COMPONENTS, etc. */
110
+ int bDisplayCompositeResults;
111
+ int bDoNotAddH;
112
+ int bNoStructLabels;
113
+ int bChiralFlag;
114
+ int bAllowEmptyStructure;
115
+ INCHI_MODE bTautFlags;
116
+ INCHI_MODE bTautFlagsDone;
117
+ } INPUT_PARMS;
118
+
119
+ #endif /* __INCHIDRP_H__ */
data/ext/src/ichierr.h ADDED
@@ -0,0 +1,124 @@
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 __INCHIERR_H__
11
+ #define __INCHIERR_H__
12
+
13
+ #define _IS_OKAY 0
14
+ #define _IS_WARNING 1
15
+ #define _IS_ERROR 2 /* Microsoft defined its own IS_ERROR() macro */
16
+ #define _IS_FATAL 3
17
+ #define _IS_UNKNOWN 4 /* unknown error: used in INChI DLL only */
18
+ #define _IS_EOF -1 /* end of file */
19
+ #define _IS_SKIP -2
20
+
21
+ #define CT_ERR_FIRST (-30000)
22
+ #define CT_OVERFLOW (CT_ERR_FIRST- 0) /*(-30000) */
23
+ #define CT_LEN_MISMATCH (CT_ERR_FIRST- 1) /*(-30001) */
24
+ #define CT_OUT_OF_RAM (CT_ERR_FIRST- 2) /*(-30002) */
25
+ #define CT_RANKING_ERR (CT_ERR_FIRST- 3) /*(-30003) */
26
+ #define CT_ISOCOUNT_ERR (CT_ERR_FIRST- 4) /*(-30004) */
27
+ #define CT_TAUCOUNT_ERR (CT_ERR_FIRST- 5) /*(-30005) */
28
+ #define CT_ISOTAUCOUNT_ERR (CT_ERR_FIRST- 6) /*(-30006) */
29
+ #define CT_MAPCOUNT_ERR (CT_ERR_FIRST- 7) /*(-30007) */
30
+ #define CT_TIMEOUT_ERR (CT_ERR_FIRST- 8) /*(-30008) */
31
+ #define CT_ISO_H_ERR (CT_ERR_FIRST- 9) /*(-30009) */
32
+ #define CT_STEREOCOUNT_ERR (CT_ERR_FIRST-10) /*(-30010) */
33
+ #define CT_ATOMCOUNT_ERR (CT_ERR_FIRST-11) /*(-30011) */
34
+ #define CT_STEREOBOND_ERROR (CT_ERR_FIRST-12) /*(-30012) */
35
+ #define CT_USER_QUIT_ERR (CT_ERR_FIRST-13) /*(-30013) */
36
+ #define CT_REMOVE_STEREO_ERR (CT_ERR_FIRST-14) /*(-30014) */
37
+ #define CT_CALC_STEREO_ERR (CT_ERR_FIRST-15) /*(-30015) */
38
+ #define CT_CANON_ERR (CT_ERR_FIRST-16) /*(-30016) */
39
+ #define CT_STEREO_CANON_ERR (CT_ERR_FIRST-17) /*(-30017) */
40
+ #define CT_UNKNOWN_ERR (CT_ERR_FIRST-18) /*(-30018) */
41
+
42
+ #define CT_ERR_MIN CT_UNKNOWN_ERR
43
+ #define CT_ERR_MAX CT_ERR_FIRST
44
+
45
+ #define CHECK_OVERFLOW(Len, Maxlen) ( (Len) >= (Maxlen) )
46
+ #define RETURNED_ERROR(nVal) (CT_ERR_MIN<=(nVal) && (nVal)<=CT_ERR_MAX)
47
+
48
+
49
+ #define BNS_ERR -9999
50
+ #define BNS_WRONG_PARMS (BNS_ERR + 0) /*(-9999)*/
51
+ #define BNS_OUT_OF_RAM (BNS_ERR + 1) /*(-9998)*/
52
+ #define BNS_PROGRAM_ERR (BNS_ERR + 2) /*(-9997)*/
53
+ #define BNS_ALTPATH_OVFL (BNS_ERR + 3) /*(-9996)*/
54
+ #define BNS_BOND_ERR (BNS_ERR + 4) /*(-9995)*/
55
+ #define BNS_VERT_NUM_ERR (BNS_ERR + 5) /*(-9994)*/
56
+ #define BNS_VERT_EDGE_OVFL (BNS_ERR + 6) /*(-9993)*/
57
+ #define BNS_SET_ALTP_ERR (BNS_ERR + 7) /*(-9992)*/
58
+ #define BNS_CPOINT_ERR (BNS_ERR + 8) /*(-9991)*/
59
+ #define BNS_CANT_SET_BOND (BNS_ERR + 9) /*(-9990)*/
60
+ #define BNS_CAP_FLOW_ERR (BNS_ERR + 10) /*(-9989)*/
61
+ #define BNS_RADICAL_ERR (BNS_ERR + 11) /*(-9988)*/
62
+ #define BNS_REINIT_ERR (BNS_ERR + 12) /*(-9987)*/
63
+
64
+ #define BNS_MAX_ERR_VALUE (BNS_ERR + 19) /*(-9980)*/
65
+
66
+ #define IS_BNS_ERROR(X) (BNS_ERR <= (X) && (X) <= BNS_MAX_ERR_VALUE)
67
+
68
+
69
+ #define INCHI_INP_ERROR_ERR 40
70
+ #define INCHI_INP_ERROR_RET (-1)
71
+
72
+ #define INCHI_INP_FATAL_ERR 1
73
+ #define INCHI_INP_FATAL_RET 0
74
+
75
+ #define INCHI_INP_EOF_ERR 11
76
+ #define INCHI_INP_EOF_RET 0
77
+
78
+ #ifndef INCHI_ALL_CPP
79
+ #ifdef __cplusplus
80
+ extern "C" {
81
+ #endif
82
+ #endif
83
+
84
+ extern int (*UserAction)(void); /* callback */
85
+ extern int (*ConsoleQuit)(void); /* Console user issued CTRL+C etc. */
86
+
87
+ #ifndef INCHI_ALL_CPP
88
+ #ifdef __cplusplus
89
+ }
90
+ #endif
91
+ #endif
92
+
93
+ #define LOG_MASK_WARN 1
94
+ #define LOG_MASK_ERR 2
95
+ #define LOG_MASK_FATAL 4
96
+
97
+ #define LOG_MASK_ALL (LOG_MASK_WARN | LOG_MASK_ERR | LOG_MASK_FATAL)
98
+ #define LOG_MASK_NO_WARN (LOG_MASK_ERR | LOG_MASK_FATAL)
99
+
100
+ #ifdef INCHI_LIB
101
+ #include <stdarg.h>
102
+
103
+ #ifndef INCHI_ALL_CPP
104
+ #ifdef __cplusplus
105
+ extern "C" {
106
+ #endif
107
+ #endif
108
+
109
+ extern void (*FWPRINT) (const char * format, va_list argptr );
110
+ extern void (*DRAWDATA) ( struct DrawData * pDrawData);
111
+ extern int (*DRAWDATA_EXISTS) ( int nComponent, int nType, int bReconnected );
112
+ extern struct DrawData * (*GET_DRAWDATA) ( int nComponent, int nType, int bReconnected );
113
+
114
+ #ifndef INCHI_ALL_CPP
115
+ #ifdef __cplusplus
116
+ }
117
+ #endif
118
+ #endif
119
+
120
+ #endif
121
+
122
+ #define USER_ACTION_QUIT 1
123
+
124
+ #endif /* __INCHIERR_H__ */
@@ -0,0 +1,101 @@
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 <string.h>
13
+
14
+ #include "mode.h"
15
+
16
+ #include "comdef.h"
17
+ #include "extr_ct.h"
18
+ #include "ichitaut.h"
19
+ #include "ichicant.h"
20
+ #include "ichicomn.h"
21
+
22
+ #ifdef NEVER
23
+ /**********************************************************************************/
24
+ int unpack_iso_sort_key( AT_ISO_SORT_KEY iso_sort_key, S_CHAR *num_1H, S_CHAR *num_2H, S_CHAR *num_3H, S_CHAR *iso_atw_diff )
25
+ {
26
+ int is_negative;
27
+ AT_ISO_SORT_KEY HOnlyAtwPart;
28
+ static const AT_ISO_SORT_KEY MultAtwDiff = AT_ISO_SORT_KEY_MULT*AT_ISO_SORT_KEY_MULT*AT_ISO_SORT_KEY_MULT;
29
+ if ( !iso_sort_key ) {
30
+ *num_1H = *num_2H = *num_3H = *iso_atw_diff = 0;
31
+ return 0;
32
+ } else
33
+ if ( iso_sort_key < 0 ) {
34
+ is_negative = 1;
35
+ iso_sort_key = -iso_sort_key;
36
+ HOnlyAtwPart = MultAtwDiff - iso_sort_key % MultAtwDiff;
37
+ iso_sort_key += HOnlyAtwPart;
38
+ } else {
39
+ is_negative = 0;
40
+ HOnlyAtwPart = iso_sort_key % MultAtwDiff;
41
+ iso_sort_key -= HOnlyAtwPart;
42
+ }
43
+
44
+ iso_sort_key /= MultAtwDiff;
45
+
46
+ *num_1H = (S_CHAR)(HOnlyAtwPart % AT_ISO_SORT_KEY_MULT);
47
+ HOnlyAtwPart /= AT_ISO_SORT_KEY_MULT;
48
+ *num_2H = (S_CHAR)(HOnlyAtwPart % AT_ISO_SORT_KEY_MULT);
49
+ HOnlyAtwPart /= AT_ISO_SORT_KEY_MULT;
50
+ *num_3H = (S_CHAR)(HOnlyAtwPart % AT_ISO_SORT_KEY_MULT);
51
+
52
+ *iso_atw_diff = (S_CHAR)(is_negative? -iso_sort_key : iso_sort_key);
53
+
54
+ return 1;
55
+ }
56
+ #endif
57
+
58
+ /**********************************************************************************/
59
+ AT_ISO_SORT_KEY make_iso_sort_key( int iso_atw_diff, int num_1H, int num_2H, int num_3H)
60
+ {
61
+ AT_ISO_SORT_KEY iso_sort_key = 0, mult=1;
62
+
63
+ iso_sort_key += mult * num_1H;
64
+ mult *= AT_ISO_SORT_KEY_MULT;
65
+ iso_sort_key += mult * num_2H;
66
+ mult *= AT_ISO_SORT_KEY_MULT;
67
+ iso_sort_key += mult * num_3H;
68
+ mult *= AT_ISO_SORT_KEY_MULT;
69
+ iso_sort_key += mult * iso_atw_diff;
70
+ return iso_sort_key;
71
+ }
72
+ /**********************************************************************************/
73
+ /* set sp_ATOM isotopic sort keys */
74
+ int set_atom_iso_sort_keys( int num_at, sp_ATOM *at, T_GROUP_INFO* t_group_info, int *bHasIsotopicInTautomerGroups )
75
+ {
76
+ int i, num_isotopic = 0, bMergedTgroup;
77
+ AT_ISO_SORT_KEY iso_sort_key;
78
+ T_GROUP *t_group =
79
+ (t_group_info &&
80
+ t_group_info->t_group &&
81
+ t_group_info->num_t_groups > 0)? t_group_info->t_group : NULL;
82
+
83
+ if ( bHasIsotopicInTautomerGroups )
84
+ *bHasIsotopicInTautomerGroups = 0;
85
+ for ( i = 0; i < num_at; i ++ ) {
86
+ bMergedTgroup = (t_group_info && t_group_info->nIsotopicEndpointAtomNumber && (at[i].cFlags & AT_FLAG_ISO_H_POINT));
87
+ if ( (!at[i].endpoint || !t_group) && !bMergedTgroup ) {
88
+ iso_sort_key = make_iso_sort_key(at[i].iso_atw_diff, at[i].num_iso_H[0], at[i].num_iso_H[1], at[i].num_iso_H[2]);
89
+ } else {
90
+ /* H isotopes go to the tautomer part of the CT (name) */
91
+ /* if (at[i].endpoint && t_group) ... */
92
+ iso_sort_key = make_iso_sort_key(at[i].iso_atw_diff, 0, 0, 0);
93
+ if ( bHasIsotopicInTautomerGroups )
94
+ *bHasIsotopicInTautomerGroups += (at[i].num_iso_H[0] || at[i].num_iso_H[1] || at[i].num_iso_H[2] || bMergedTgroup);
95
+ }
96
+ at[i].iso_sort_key = iso_sort_key;
97
+ num_isotopic += (iso_sort_key != 0);
98
+ }
99
+ return num_isotopic;
100
+ }
101
+
@@ -0,0 +1,286 @@
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 InChI library */
19
+
20
+ #include "mode.h"
21
+ #include "inchi_api.h"
22
+ #include "util.h"
23
+ #include "ichierr.h"
24
+ #include "ichicomp.h"
25
+
26
+ #define my_fgetsTab l_my_fgetsTab
27
+ #define my_fgetsTab1 l_my_fgetsTab1
28
+ #define my_fgets l_my_fgets
29
+ #define str_fgetc l_str_fgetc
30
+ #define str_fgets l_str_fgets
31
+ #define str_fgetsTab l_str_fgetsTab
32
+
33
+ #define INChIToInchi_Atom l_INChIToInchi_Atom
34
+
35
+ int INChIToInchi_Input( INCHI_FILE *inp_molfile, inchi_Input *orig_at_data, int bMergeAllInputStructures,
36
+ int bDoNotAddH, INPUT_TYPE nInputType,
37
+ char *pSdfLabel, char *pSdfValue, long *lSdfId, INCHI_MODE *pInpAtomFlags,
38
+ int *err, char *pStrErr );
39
+
40
+ /* This contains executable code. Included in lReadAux.c, e_ReadINCH.c, ReadINCH.c, */
41
+ #include "aux2atom.h"
42
+
43
+ extern int bLibInchiSemaphore;
44
+ /*****************************************************************************************************/
45
+ EXPIMP_TEMPLATE INCHI_API int INCHI_DECL Get_inchi_Input_FromAuxInfo(
46
+ char *szInchiAuxInfo, int bDoNotAddH, InchiInpData *pInchiInp )
47
+ {
48
+ INCHI_FILE inp;
49
+ int num_at, nRet = inchi_Ret_OKAY, err = 0;
50
+ INCHI_MODE bChiral = 0;
51
+ /* the input string may contain the following line: "Structure NNN. HHH=VVV" */
52
+ long lNumber; /* structure number NNN from the input */
53
+ char szHeader[MAX_SDF_HEADER]; /* stucture label header HHH from the input */
54
+ char szLabel[MAX_SDF_VALUE]; /* stucture label VVV from the input */
55
+ if ( bLibInchiSemaphore ) { /* does not work properly under sufficient stress */
56
+ return inchi_Ret_BUSY;
57
+ }
58
+ bLibInchiSemaphore = 1;
59
+
60
+ if ( pInchiInp && pInchiInp->pInp ) {
61
+ /* clear output fields */
62
+ inchi_Input *pInp = pInchiInp->pInp;
63
+ char *szOptions = pInp->szOptions;
64
+ memset( pInchiInp, 0, sizeof(*pInchiInp) );
65
+ memset( pInp, 0, sizeof(*pInp) );
66
+ pInp->szOptions = szOptions;
67
+ pInchiInp->pInp = pInp;
68
+ } else {
69
+ bLibInchiSemaphore = 0;
70
+ return inchi_Ret_ERROR;
71
+ }
72
+ szHeader[0] = '\0';
73
+ szLabel[0] = '\0';
74
+ lNumber = 0;
75
+ /* prepare input string pointers */
76
+ inp.pStr = szInchiAuxInfo;
77
+ inp.nUsedLength = strlen(szInchiAuxInfo);
78
+ inp.nAllocatedLength = inp.nUsedLength+1;
79
+ inp.nPtr = 0;
80
+
81
+ num_at = INChIToInchi_Input( &inp, pInchiInp->pInp, 1, bDoNotAddH, INPUT_INCHI_PLAIN,
82
+ szHeader, szLabel, &lNumber, &bChiral,
83
+ &err, pInchiInp->szErrMsg );
84
+ pInchiInp->bChiral = bChiral;
85
+ if ( num_at <= 0 ) {
86
+ if ( 10 < err && err < 20 ) {
87
+ nRet = inchi_Ret_EOF;
88
+ } else
89
+ if ( err == 9 ) {
90
+ nRet = inchi_Ret_ERROR; /* sdfile bypassed to $$$$ */
91
+ } else
92
+ if ( err && err < 30 ) {
93
+ nRet = inchi_Ret_FATAL;
94
+ } else
95
+ if ( 98 == err ) {
96
+ nRet = inchi_Ret_WARNING; /* empty AuxInfo */
97
+ } else
98
+ if ( err ) {
99
+ nRet = inchi_Ret_ERROR;
100
+ } else
101
+ if ( pInchiInp->szErrMsg[0] ) {
102
+ nRet = inchi_Ret_WARNING;
103
+ }
104
+ }
105
+ if ( nRet != inchi_Ret_OKAY && nRet != inchi_Ret_WARNING ) {
106
+ Free_inchi_Input( pInchiInp->pInp );
107
+ pInchiInp->bChiral = 0;
108
+ }
109
+ bLibInchiSemaphore = 0;
110
+ return nRet;
111
+ }
112
+ /*****************************************************************************************************/
113
+ EXPIMP_TEMPLATE INCHI_API void INCHI_DECL Free_inchi_Input( inchi_Input *pInp )
114
+ {
115
+ FreeInchi_Atom( &pInp->atom );
116
+ FreeInchi_Stereo0D ( &pInp->stereo0D );
117
+ pInp->num_atoms = 0;
118
+ pInp->num_stereo0D = 0;
119
+ }
120
+
121
+
122
+ /*#endif*/ /* INCHI_MAIN */
123
+
124
+ #ifndef INCHI_LIBRARY
125
+ #error "INCHI_LIBRARY MUST be defined here"
126
+ #endif
127
+
128
+
129
+ /**********************************************************************************/
130
+ int INChIToInchi_Input( INCHI_FILE *inp_molfile, inchi_Input *orig_at_data, int bMergeAllInputStructures,
131
+ int bDoNotAddH, INPUT_TYPE nInputType,
132
+ char *pSdfLabel, char *pSdfValue, long *lSdfId, INCHI_MODE *pInpAtomFlags,
133
+ int *err, char *pStrErr )
134
+ {
135
+ /* inp_ATOM *at = NULL; */
136
+ int num_dimensions_new;
137
+ int num_inp_bonds_new;
138
+ int num_inp_atoms_new;
139
+ int num_inp_0D_new;
140
+ inchi_Atom *at_new = NULL;
141
+ inchi_Atom *at_old = NULL;
142
+ inchi_Stereo0D *stereo0D_new = NULL;
143
+ inchi_Stereo0D *stereo0D_old = NULL;
144
+ int nNumAtoms = 0, nNumStereo0D = 0;
145
+ MOL_COORD *szCoordNew = NULL;
146
+ MOL_COORD *szCoordOld = NULL;
147
+ int i, j;
148
+
149
+ if ( pStrErr ) {
150
+ pStrErr[0] = '\0';
151
+ }
152
+
153
+ /*FreeOrigAtData( orig_at_data );*/
154
+ if ( lSdfId )
155
+ *lSdfId = 0;
156
+ do {
157
+
158
+ at_old = orig_at_data? orig_at_data->atom : NULL; /* save pointer to the previous allocation */
159
+ stereo0D_old = orig_at_data? orig_at_data->stereo0D : NULL;
160
+ szCoordOld = NULL;
161
+ num_inp_atoms_new =
162
+ INChIToInchi_Atom( inp_molfile, orig_at_data? &stereo0D_new:NULL, &num_inp_0D_new,
163
+ bDoNotAddH, nInputType, orig_at_data? &at_new:NULL, MAX_ATOMS,
164
+ &num_dimensions_new, &num_inp_bonds_new,
165
+ pSdfLabel, pSdfValue, lSdfId, pInpAtomFlags, err, pStrErr );
166
+ if ( num_inp_atoms_new <= 0 && !*err ) {
167
+ MOLFILE_ERR_SET (*err, 0, "Empty structure");
168
+ *err = 98;
169
+ } else
170
+ if ( orig_at_data && !num_inp_atoms_new && 10 < *err && *err < 20 && orig_at_data->num_atoms > 0 && bMergeAllInputStructures ) {
171
+ *err = 0; /* end of file */
172
+ break;
173
+ } else
174
+ if ( num_inp_atoms_new > 0 && orig_at_data ) {
175
+ /* merge pOrigDataTmp + orig_at_data => pOrigDataTmp; */
176
+ nNumAtoms = num_inp_atoms_new + orig_at_data->num_atoms;
177
+ nNumStereo0D = num_inp_0D_new + orig_at_data->num_stereo0D;
178
+ if ( nNumAtoms >= MAX_ATOMS ) {
179
+ MOLFILE_ERR_SET (*err, 0, "Too many atoms");
180
+ *err = 70;
181
+ orig_at_data->num_atoms = -1;
182
+ } else
183
+ if ( !at_old ) {
184
+ /* the first structure */
185
+ orig_at_data->atom = at_new; at_new = NULL;
186
+ orig_at_data->num_atoms = num_inp_atoms_new; num_inp_atoms_new = 0;
187
+ orig_at_data->stereo0D = stereo0D_new; stereo0D_new = NULL;
188
+ orig_at_data->num_stereo0D = num_inp_0D_new; num_inp_0D_new = 0;
189
+ } else
190
+ if ( orig_at_data->atom = CreateInchi_Atom( nNumAtoms ) ) {
191
+ /* switch at_new <--> orig_at_data->at; */
192
+ if ( orig_at_data->num_atoms ) {
193
+ memcpy( orig_at_data->atom, at_old, orig_at_data->num_atoms * sizeof(orig_at_data->atom[0]) );
194
+ /* adjust numbering in the newly read structure */
195
+ for ( i = 0; i < num_inp_atoms_new; i ++ ) {
196
+ for ( j = 0; j < at_new[i].num_bonds; j ++ ) {
197
+ at_new[i].neighbor[j] += orig_at_data->num_atoms;
198
+ }
199
+ }
200
+ }
201
+ FreeInchi_Atom( &at_old );
202
+ /* copy newly read structure */
203
+ memcpy( orig_at_data->atom + orig_at_data->num_atoms,
204
+ at_new,
205
+ num_inp_atoms_new * sizeof(orig_at_data->atom[0]) );
206
+ /* copy newly read 0D stereo */
207
+ if ( num_inp_0D_new > 0 && stereo0D_new ) {
208
+ if ( orig_at_data->stereo0D = CreateInchi_Stereo0D( nNumStereo0D ) ) {
209
+ memcpy( orig_at_data->stereo0D, stereo0D_old, orig_at_data->num_stereo0D * sizeof(orig_at_data->stereo0D[0]) );
210
+ /* adjust numbering in the newly read structure */
211
+ for ( i = 0; i < num_inp_0D_new; i ++ ) {
212
+ if ( stereo0D_new[i].central_atom >= 0 ) {
213
+ stereo0D_new[i].central_atom += orig_at_data->num_atoms;
214
+ }
215
+ for ( j = 0; j < 4; j ++ ) {
216
+ stereo0D_new[i].neighbor[j] += orig_at_data->num_atoms;
217
+ }
218
+ }
219
+ FreeInchi_Stereo0D( &stereo0D_old );
220
+ memcpy( orig_at_data->stereo0D+orig_at_data->num_stereo0D,
221
+ stereo0D_new,
222
+ num_inp_0D_new * sizeof(orig_at_data->stereo0D[0]) );
223
+ } else {
224
+ num_inp_0D_new = 0;
225
+ MOLFILE_ERR_SET (*err, 0, "Out of RAM");
226
+ *err = -1;
227
+ }
228
+ } else {
229
+ num_inp_0D_new = 0;
230
+ }
231
+ /* update lengths */
232
+ orig_at_data->num_atoms += num_inp_atoms_new;
233
+ orig_at_data->num_stereo0D += num_inp_0D_new;
234
+ } else {
235
+ MOLFILE_ERR_SET (*err, 0, "Out of RAM");
236
+ *err = -1;
237
+ }
238
+ } else
239
+ if ( num_inp_atoms_new > 0 ) {
240
+ nNumAtoms += num_inp_atoms_new;
241
+ }
242
+ FreeInchi_Atom( &at_new );
243
+ num_inp_atoms_new = 0;
244
+ FreeInchi_Stereo0D( &stereo0D_new );
245
+ num_inp_0D_new = 0;
246
+
247
+ } while ( !*err && bMergeAllInputStructures );
248
+ /*
249
+ if ( !*err ) {
250
+ orig_at_data->num_components =
251
+ MarkDisconnectedComponents( orig_at_data );
252
+ if ( orig_at_data->num_components == 0 ) {
253
+ MOLFILE_ERR_SET (*err, 0, "No components found");
254
+ *err = 99;
255
+ }
256
+ if ( orig_at_data->num_components < 0 ) {
257
+ MOLFILE_ERR_SET (*err, 0, "Too many components");
258
+ *err = 99;
259
+ }
260
+ }
261
+ */
262
+ if ( szCoordNew ) {
263
+ inchi_free( szCoordNew );
264
+ }
265
+ if ( at_new ) {
266
+ inchi_free( at_new );
267
+ }
268
+ /*
269
+ if ( !*err ) {
270
+ if ( ReconcileAllCmlBondParities( orig_at_data->atom, orig_at_data->num_atoms ) ) {
271
+ MOLFILE_ERR_SET (*err, 0, "Cannot reconcile stereobond parities");
272
+ if (!orig_at_data->num_atoms) {
273
+ *err = 1;
274
+ }
275
+ }
276
+ }
277
+ */
278
+ if ( *err ) {
279
+ FreeInchi_Input( orig_at_data );
280
+ }
281
+ if ( *err && !(10 < *err && *err < 20) && pStrErr && !pStrErr[0] ) {
282
+ MOLFILE_ERR_SET (*err, 0, "Unknown error"); /* <BRKPT> */
283
+ }
284
+ return orig_at_data? orig_at_data->num_atoms : nNumAtoms;
285
+ }
286
+