rino 0.1.0 → 0.2.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.
Files changed (104) hide show
  1. data/Rakefile +1 -1
  2. data/ext/extconf.rb +1 -24
  3. data/ext/libinchi.so +0 -0
  4. data/ext/src/aux2atom.h +120 -39
  5. data/ext/src/comdef.h +3 -3
  6. data/ext/src/dispstru.c +2547 -0
  7. data/ext/src/dispstru.h +73 -0
  8. data/ext/src/extr_ct.h +5 -2
  9. data/ext/src/ichi.h +27 -11
  10. data/ext/src/ichi_bns.c +1800 -254
  11. data/ext/src/ichi_bns.h +205 -4
  12. data/ext/src/ichican2.c +197 -86
  13. data/ext/src/ichicano.c +8 -13
  14. data/ext/src/ichicano.h +2 -2
  15. data/ext/src/ichicans.c +11 -6
  16. data/ext/src/ichicant.h +2 -2
  17. data/ext/src/ichicomn.h +2 -2
  18. data/ext/src/ichicomp.h +19 -4
  19. data/ext/src/ichidrp.h +9 -5
  20. data/ext/src/ichierr.h +5 -3
  21. data/ext/src/ichiisot.c +2 -2
  22. data/ext/src/ichimain.c +461 -0
  23. data/ext/src/ichimain.h +23 -15
  24. data/ext/src/ichimak2.c +6 -6
  25. data/ext/src/ichimake.c +843 -42
  26. data/ext/src/ichimake.h +4 -2
  27. data/ext/src/ichimap1.c +5 -5
  28. data/ext/src/ichimap2.c +2 -2
  29. data/ext/src/ichimap4.c +34 -21
  30. data/ext/src/ichinorm.c +11 -5
  31. data/ext/src/ichinorm.h +3 -2
  32. data/ext/src/ichiparm.c +2 -2
  33. data/ext/src/ichiparm.h +232 -30
  34. data/ext/src/ichiprt1.c +35 -11
  35. data/ext/src/ichiprt2.c +78 -7
  36. data/ext/src/ichiprt3.c +300 -120
  37. data/ext/src/ichiqueu.c +17 -2
  38. data/ext/src/ichiread.c +6932 -0
  39. data/ext/src/ichiring.c +3 -2
  40. data/ext/src/ichiring.h +2 -2
  41. data/ext/src/ichirvr1.c +4891 -0
  42. data/ext/src/ichirvr2.c +6344 -0
  43. data/ext/src/ichirvr3.c +5499 -0
  44. data/ext/src/ichirvr4.c +3177 -0
  45. data/ext/src/ichirvr5.c +1166 -0
  46. data/ext/src/ichirvr6.c +1287 -0
  47. data/ext/src/ichirvr7.c +2319 -0
  48. data/ext/src/ichirvrs.h +882 -0
  49. data/ext/src/ichisize.h +2 -2
  50. data/ext/src/ichisort.c +5 -5
  51. data/ext/src/ichister.c +281 -86
  52. data/ext/src/ichister.h +9 -3
  53. data/ext/src/ichitaut.c +208 -9
  54. data/ext/src/ichitaut.h +13 -11
  55. data/ext/src/ichitime.h +16 -2
  56. data/ext/src/inchicmp.h +107 -0
  57. data/ext/src/inpdef.h +6 -3
  58. data/ext/src/libinchi_wrap.c +912 -0
  59. data/ext/src/lreadmol.h +34 -31
  60. data/ext/src/mode.h +244 -7
  61. data/ext/src/mol2atom.c +1060 -0
  62. data/ext/src/mol2atom.h +31 -0
  63. data/ext/src/readinch.c +239 -0
  64. data/ext/src/readmol.c +28 -0
  65. data/ext/src/{e_readmol.h → readmol.h} +7 -9
  66. data/ext/src/runichi.c +251 -177
  67. data/ext/src/strutil.c +444 -238
  68. data/ext/src/strutil.h +150 -11
  69. data/ext/src/util.c +176 -118
  70. data/ext/src/util.h +15 -3
  71. data/lib/rino.rb +71 -3
  72. data/test/test.rb +33 -4
  73. metadata +22 -34
  74. data/ext/ruby_inchi_main.so +0 -0
  75. data/ext/src/e_0dstereo.c +0 -3014
  76. data/ext/src/e_0dstereo.h +0 -31
  77. data/ext/src/e_comdef.h +0 -57
  78. data/ext/src/e_ctl_data.h +0 -147
  79. data/ext/src/e_ichi_io.c +0 -498
  80. data/ext/src/e_ichi_io.h +0 -40
  81. data/ext/src/e_ichi_parms.c +0 -37
  82. data/ext/src/e_ichi_parms.h +0 -41
  83. data/ext/src/e_ichicomp.h +0 -50
  84. data/ext/src/e_ichierr.h +0 -40
  85. data/ext/src/e_ichimain.c +0 -593
  86. data/ext/src/e_ichisize.h +0 -43
  87. data/ext/src/e_inchi_atom.c +0 -75
  88. data/ext/src/e_inchi_atom.h +0 -33
  89. data/ext/src/e_inpdef.h +0 -41
  90. data/ext/src/e_mode.h +0 -706
  91. data/ext/src/e_mol2atom.c +0 -649
  92. data/ext/src/e_readinch.c +0 -58
  93. data/ext/src/e_readmol.c +0 -54
  94. data/ext/src/e_readstru.c +0 -251
  95. data/ext/src/e_readstru.h +0 -33
  96. data/ext/src/e_util.c +0 -284
  97. data/ext/src/e_util.h +0 -61
  98. data/ext/src/ichilnct.c +0 -286
  99. data/ext/src/inchi_api.h +0 -670
  100. data/ext/src/inchi_dll.c +0 -1480
  101. data/ext/src/inchi_dll.h +0 -34
  102. data/ext/src/inchi_dll_main.c +0 -23
  103. data/ext/src/inchi_dll_main.h +0 -31
  104. data/ext/src/ruby_inchi_main.c +0 -558
@@ -1,58 +0,0 @@
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
-
@@ -1,54 +0,0 @@
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
-
@@ -1,251 +0,0 @@
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
- }
@@ -1,33 +0,0 @@
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__ */
@@ -1,284 +0,0 @@
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 <string.h>
12
- #include <stdlib.h>
13
- #include <ctype.h>
14
- #include <stdarg.h>
15
-
16
- #include "e_mode.h"
17
- #include "inchi_api.h"
18
- #include "e_ichisize.h"
19
- #include "e_comdef.h"
20
- #include "e_util.h"
21
- #include "e_ichicomp.h"
22
-
23
- #define extract_ChargeRadical e_extract_ChargeRadical
24
- #define normalize_name e_normalize_name
25
- /******************************************************************************************************/
26
- int extract_ChargeRadical( char *elname, int *pnRadical, int *pnCharge )
27
- {
28
- char *q, *r, *p;
29
- int nCharge=0, nRad = 0, charge_len = 0, k, nVal, nSign, nLastSign=1, len;
30
-
31
- p = elname;
32
-
33
- /* extract radicals & charges */
34
- while ( q = strpbrk( p, "+-^" ) ) {
35
- switch ( *q ) {
36
- case '+':
37
- case '-':
38
- for ( k = 0, nVal=0; (nSign = ('+' == q[k])) || (nSign = -('-' == q[k])); k++ ) {
39
- nVal += (nLastSign = nSign);
40
- charge_len ++;
41
- }
42
- if ( nSign = (int)strtol( q+k, &r, 10 ) ) { /* fixed 12-5-2001 */
43
- nVal += nLastSign * (nSign-1);
44
- }
45
- charge_len = r - q;
46
- nCharge += nVal;
47
- break;
48
- /* case '.': */ /* singlet '.' may be confused with '.' in formulas like CaO.H2O */
49
- case '^':
50
- nRad = 1; /* doublet here is 1. See below */
51
- charge_len = 1;
52
- for ( k = 1; q[0] == q[k]; k++ ) {
53
- nRad ++;
54
- charge_len ++;
55
- }
56
- break;
57
- }
58
- memmove( q, q+charge_len, strlen(q+charge_len)+1 );
59
- }
60
- len = strlen(p);
61
- /* radical */
62
- if ( (q = strrchr( p, ':' )) && !q[1]) {
63
- nRad = RADICAL_SINGLET;
64
- q[0] = '\0';
65
- len --;
66
- } else {
67
- while( (q = strrchr( p, '.' )) && !q[1] ) {
68
- nRad ++;
69
- q[0] = '\0';
70
- len --;
71
- }
72
-
73
- nRad = nRad == 1? RADICAL_DOUBLET :
74
- nRad == 2? RADICAL_TRIPLET : 0;
75
- }
76
- *pnRadical = nRad;
77
- *pnCharge = nCharge;
78
- return ( nRad || nCharge );
79
-
80
- }
81
- /*****************************************************************/
82
- int normalize_name( char* name )
83
- {
84
- /* remove leading & trailing spaces; replace consecutive spaces with a single space */
85
- /* Treat non-printable characters (Greeks) as spaces. 11-23-99 DCh. */
86
- int i, len, n;
87
- len = (int)strlen(name);
88
- for ( i = 0, n = 0; i < len; i++ ) {
89
- if ( isspace( UCINT name[i] ) /*|| !isprint( UCINT name[i] )*/ ) {
90
- name[i] = ' '; /* exterminate tabs !!! */
91
- n++;
92
- } else {
93
- if ( n > 0 ) {
94
- memmove( (void*) &name[i-n], (void*) &name[i], len-i+1 );
95
- i -= n;
96
- len -= n;
97
- }
98
- n = -1;
99
- }
100
- }
101
- if ( n == len ) /* empty line */
102
- name[len=0] = '\0';
103
- else
104
- if ( ++n && n <= len ) {
105
- len -= n;
106
- name[len] = '\0';
107
- }
108
- return len;
109
- }
110
- /************************************************/
111
- #ifndef e_inchi_malloc
112
- void *e_inchi_malloc(size_t c)
113
- {
114
- return malloc(c);
115
- }
116
- #endif
117
- #ifndef e_inchi_calloc
118
- void *e_inchi_calloc(size_t c, size_t n)
119
- {
120
- return calloc(c,n);
121
- }
122
- #endif
123
- #ifndef e_inchi_free
124
- void e_inchi_free(void *p)
125
- {
126
- if(p) {
127
- free(p); /*added check if zero*/
128
- }
129
- }
130
- #endif
131
-
132
-
133
- /***************************************************************************/
134
- /* Copies up to maxlen characters INCLUDING end null from source to target */
135
- /* Fills out the rest of the target with null bytes */
136
- int e_mystrncpy(char *target,const char *source,unsigned maxlen)
137
- { /* protected from non-zero-terminated source and overlapped target/source. 7-9-99 DCh. */
138
- const char *p;
139
- unsigned len;
140
-
141
- if (target==NULL || maxlen == 0 || source == NULL)
142
- return 0;
143
- if ( p = (const char*)memchr(source, 0, maxlen) ) {
144
- len = p-source; /* maxlen does not include the found zero termination */
145
- } else {
146
- len = maxlen-1; /* reduced length does not include one more byte for zero termination */
147
- }
148
- if ( len )
149
- memmove( target, source, len );
150
- /* target[len] = '\0'; */
151
- memset( target+len, 0, maxlen-len); /* zero termination */
152
- return 1;
153
- }
154
- /************************************************************************/
155
- /* Remove leading and trailing white spaces */
156
- char* e_LtrimRtrim( char *p, int* nLen )
157
- {
158
- int i, len=0;
159
- if ( p && (len = strlen( p )) ) {
160
- for ( i = 0; i < len && __isascii( p[i] ) && isspace( p[i] ); i++ )
161
- ;
162
- if ( i )
163
- (memmove)( p, p+i, (len -= i)+1 );
164
- for ( ; 0 < len && __isascii( p[len-1] ) && isspace( p[len-1] ); len-- )
165
- ;
166
- p[len] = '\0';
167
- }
168
- if ( nLen )
169
- *nLen = len;
170
- return p;
171
- }
172
-
173
- /*************************************************************************/
174
- void e_remove_trailing_spaces( char* p )
175
- {
176
- int len;
177
- for( len = (int)strlen( p ) - 1; len >= 0 && isspace( UCINT p[len] ); len-- )
178
- ;
179
- p[++len] = '\0';
180
- }
181
- /*************************************************************************/
182
- void e_remove_one_lf( char* p)
183
- {
184
- size_t len;
185
- if ( p && 0 < (len = strlen(p)) && p[len-1] == '\n' ){
186
- p[len-1] = '\0';
187
- if ( len >= 2 && p[len-2] == '\r' )
188
- p[len-2] = '\0';
189
- }
190
- }
191
- /*************************************************************************/
192
- S_SHORT *e_is_in_the_slist( S_SHORT *pathAtom, S_SHORT nNextAtom, int nPathLen )
193
- {
194
- for ( ; nPathLen && *pathAtom != nNextAtom; nPathLen--, pathAtom++ )
195
- ;
196
- return nPathLen? pathAtom : NULL;
197
- }
198
- /************************************************/
199
- int e_is_element_a_metal( char szEl[] )
200
- {
201
- static char szMetals[] = "K;V;Y;W;U;"
202
- "Li;Be;Na;Mg;Al;Ca;Sc;Ti;Cr;Mn;Fe;Co;Ni;Cu;Zn;Ga;Rb;Sr;Zr;"
203
- "Nb;Mo;Tc;Ru;Rh;Pd;Ag;Cd;In;Sn;Sb;Cs;Ba;La;Ce;Pr;Nd;Pm;Sm;"
204
- "Eu;Gd;Tb;Dy;Ho;Er;Tm;Yb;Lu;Hf;Ta;Re;Os;Ir;Pt;Au;Hg;Tl;Pb;"
205
- "Bi;Po;Fr;Ra;Ac;Th;Pa;Np;Pu;Am;Cm;Bk;Cf;Es;Fm;Md;No;Lr;Rf;";
206
- int len = strlen(szEl);
207
- char *p;
208
-
209
- if ( 0 < len && len <= 2 &&
210
- isalpha( UCINT szEl[0] ) && isupper( szEl[0] ) &&
211
- (p = strstr(szMetals, szEl) ) && p[len] == ';' ) {
212
-
213
- return 1; /*return AtType_Metal;*/
214
- }
215
- return 0;
216
- }
217
-
218
- #ifdef INCHI_ANSI_ONLY
219
- /*************************************************************************/
220
- /************* non-ANSI functions ****************/
221
- /*************************************************************************/
222
- #define __MYTOLOWER(c) ( ((c) >= 'A') && ((c) <= 'Z') ? ((c) - 'A' + 'a') : (c) )
223
-
224
- #if ( !defined(_MSC_VER) || defined(__STDC__) && __STDC__ == 1 )
225
- /* support (VC++ Language extensions) = OFF && defined(INCHI_ANSI_ONLY) */
226
- #ifdef INCHI_LINK_AS_DLL
227
- /* the following code is enabled if linked as dll (ANSI C) */
228
- /* because the InChI library dll does not export it */
229
- int memicmp ( const void * p1, const void * p2, size_t length )
230
- {
231
- const U_CHAR *s1 = (const U_CHAR*)p1;
232
- const U_CHAR *s2 = (const U_CHAR*)p2;
233
- while ( length-- ) {
234
- if ( *s1 == *s2 ||
235
- __MYTOLOWER( (int)*s1 ) == __MYTOLOWER( (int)*s2 )) {
236
- s1 ++;
237
- s2 ++;
238
- } else {
239
- return __MYTOLOWER( (int)*s1 ) - __MYTOLOWER( (int)*s2 );
240
- }
241
- }
242
- return 0;
243
- }
244
- /*************************************************************************/
245
- int stricmp( const char *s1, const char *s2 )
246
- {
247
- while ( *s1 ) {
248
- if ( *s1 == *s2 ||
249
- __MYTOLOWER( (int)*s1 ) == __MYTOLOWER( (int)*s2 )) {
250
- s1 ++;
251
- s2 ++;
252
- } else {
253
- return __MYTOLOWER( (int)*s1 ) - __MYTOLOWER( (int)*s2 );
254
- }
255
- }
256
- if ( *s2 )
257
- return -1;
258
- return 0;
259
- }
260
- /*************************************************************************/
261
- char *_strnset( char *s, int val, size_t length )
262
- {
263
- char *ps = s;
264
- while (length-- && *ps)
265
- *ps++ = (char)val;
266
- return s;
267
- }
268
- /*************************************************************************/
269
- char *_strdup( const char *string )
270
- {
271
- char *p = NULL;
272
- if ( string ) {
273
- size_t length = strlen( string );
274
- p = e_inchi_malloc( length + 1 );
275
- if ( p ) {
276
- strcpy( p, string );
277
- }
278
- }
279
- return p;
280
- }
281
- #endif /* INCHI_LINK_AS_DLL */
282
- #endif /* !defined(_MSC_VER) || defined(__STDC__) && __STDC__ == 1 */
283
- #endif /* INCHI_ANSI_ONLY */
284
-