1 /* mla2api.c
2 * ===========================================================================
3 *
4 * PUBLIC DOMAIN NOTICE
5 * National Center for Biotechnology Information (NCBI)
6 *
7 * This software/database is a "United States Government Work" under the
8 * terms of the United States Copyright Act. It was written as part of
9 * the author's official duties as a United States Government employee and
10 * thus cannot be copyrighted. This software/database is freely available
11 * to the public for use. The National Library of Medicine and the U.S.
12 * Government do not place any restriction on its use or reproduction.
13 * We would, however, appreciate having the NCBI and the author cited in
14 * any work or product based on this material
15 *
16 * Although all reasonable efforts have been taken to ensure the accuracy
17 * and reliability of the software and data, the NLM and the U.S.
18 * Government do not and cannot warrant the performance or results that
19 * may be obtained by using this software or data. The NLM and the U.S.
20 * Government disclaim all warranties, express or implied, including
21 * warranties of performance, merchantability or fitness for any particular
22 * purpose.
23 *
24 * ===========================================================================
25 *
26 * File Name: mla2api.c
27 *
28 * Author: Jonathan Kans
29 *
30 * Version Creation Date: 1/30/07
31 *
32 * $Revision: 1.21 $
33 *
34 * File Description:
35 *
36 * Modifications:
37 * --------------------------------------------------------------------------
38 *
39 * ==========================================================================
40 */
41
42 #include <mla2api.h>
43 #include <urlquery.h>
44 #include <ncbithr.h>
45
46 /* low-level connection functions */
47
Mla2OpenConnection(void)48 NLM_EXTERN CONN Mla2OpenConnection (void)
49
50 {
51 return QUERY_OpenServiceQuery ("MedArch", NULL, 30);
52 }
53
54 #ifdef OS_MAC
55 #include <Events.h>
56 #endif
57
Mla2WaitForReply(CONN conn)58 NLM_EXTERN MlaBackPtr Mla2WaitForReply (
59 CONN conn
60 )
61
62 {
63 AsnIoConnPtr aicp;
64 time_t currtime, starttime;
65 time_t max = 0;
66 MlaBackPtr mbp = NULL;
67 EIO_Status status;
68 STimeout timeout;
69 #ifdef OS_MAC
70 EventRecord currEvent;
71 #endif
72
73 if (conn == NULL) return NULL;
74
75 #ifdef OS_MAC
76 timeout.sec = 0;
77 timeout.usec = 0;
78 #else
79 timeout.sec = 100;
80 timeout.usec = 0;
81 #endif
82
83 starttime = GetSecs ();
84 while ((status = CONN_Wait (conn, eIO_Read, &timeout)) == eIO_Timeout && max < 300) {
85 currtime = GetSecs ();
86 max = currtime - starttime;
87 #ifdef OS_MAC
88 WaitNextEvent (0, &currEvent, 0, NULL);
89 #endif
90 }
91 if (status == eIO_Success) {
92 aicp = QUERY_AsnIoConnOpen ("rb", conn);
93 mbp = MlaBackAsnRead (aicp->aip, NULL);
94 QUERY_AsnIoConnClose (aicp);
95 }
96 CONN_Close (conn);
97
98 return mbp;
99 }
100
101 /* high-level connection functions */
102
Mla2SynchronousQuery(MlaRequestPtr mrp)103 NLM_EXTERN MlaBackPtr Mla2SynchronousQuery (
104 MlaRequestPtr mrp
105 )
106
107 {
108 AsnIoConnPtr aicp;
109 CONN conn;
110 MlaBackPtr mbp = NULL;
111
112 if (mrp == NULL) return NULL;
113
114 conn = Mla2OpenConnection ();
115
116 if (conn == NULL) return NULL;
117
118 aicp = QUERY_AsnIoConnOpen ("wb", conn);
119
120 MlaRequestAsnWrite (mrp, aicp->aip, NULL);
121
122 AsnIoFlush (aicp->aip);
123 QUERY_AsnIoConnClose (aicp);
124
125 QUERY_SendQuery (conn);
126
127 mbp = Mla2WaitForReply (conn);
128
129 return mbp;
130 }
131
Mla2AsynchronousQuery(MlaRequestPtr mrp,QUEUE * queue,QueryResultProc resultproc,VoidPtr userdata)132 NLM_EXTERN Boolean Mla2AsynchronousQuery (
133 MlaRequestPtr mrp,
134 QUEUE* queue,
135 QueryResultProc resultproc,
136 VoidPtr userdata
137 )
138
139 {
140 AsnIoConnPtr aicp;
141 CONN conn;
142
143 if (mrp == NULL) return FALSE;
144
145 conn = Mla2OpenConnection ();
146
147 if (conn == NULL) return FALSE;
148
149 aicp = QUERY_AsnIoConnOpen ("wb", conn);
150
151 Mla2RequestAsnWrite (mrp, aicp->aip, NULL);
152
153 AsnIoFlush (aicp->aip);
154 QUERY_AsnIoConnClose (aicp);
155
156 QUERY_SendQuery (conn);
157
158 QUERY_AddToQueue (queue, conn, resultproc, userdata, TRUE);
159
160 return TRUE;
161 }
162
Mla2CheckQueue(QUEUE * queue)163 NLM_EXTERN Int4 Mla2CheckQueue (
164 QUEUE* queue
165 )
166
167 {
168 return QUERY_CheckQueue (queue);
169 }
170
Mla2ReadReply(CONN conn,EIO_Status status)171 NLM_EXTERN MlaBackPtr Mla2ReadReply (
172 CONN conn,
173 EIO_Status status
174 )
175
176 {
177 AsnIoConnPtr aicp;
178 MlaBackPtr mbp = NULL;
179
180 if (conn != NULL && status == eIO_Success) {
181 aicp = QUERY_AsnIoConnOpen ("rb", conn);
182 mbp = Mla2BackAsnRead (aicp->aip, NULL);
183 QUERY_AsnIoConnClose (aicp);
184 }
185
186 return mbp;
187 }
188
189 /* request creation functions */
190
Mla2CreateJournalTitleRequest(CharPtr journal_name)191 NLM_EXTERN MlaRequestPtr Mla2CreateJournalTitleRequest (
192 CharPtr journal_name
193 )
194
195 {
196 ValNodePtr jta;
197 MlaRequestPtr mrp;
198 TitleMsgPtr tmp;
199
200 if (StringHasNoText (journal_name)) return NULL;
201
202 jta = ValNodeNew (NULL);
203 jta->choice = Title_type_name;
204 jta->data.ptrvalue = StringSave (journal_name);
205
206 tmp = TitleMsgNew ();
207 tmp->type = Title_type_all;
208 tmp->title = jta;
209
210 mrp = ValNodeNew (NULL);
211 mrp->choice = MlaRequest_gettitle;
212 mrp->data.ptrvalue = (Pointer) tmp;
213
214 return mrp;
215 }
216
Mla2CreateCitArtJournalRequest(CitArtPtr cap)217 NLM_EXTERN MlaRequestPtr Mla2CreateCitArtJournalRequest (
218 CitArtPtr cap
219 )
220
221 {
222 CitJourPtr cjp;
223 CharPtr str;
224 ValNodePtr ttl;
225
226 if (cap == NULL) return NULL;
227 if (cap->from != 1) return NULL;
228 cjp = (CitJourPtr) cap->fromptr;
229 if (cjp == NULL) return NULL;
230
231 for (ttl = cjp->title; ttl != NULL; ttl = ttl->next) {
232 if (ttl->choice == Cit_title_name ||
233 ttl->choice == Cit_title_trans ||
234 ttl->choice == Cit_title_jta ||
235 ttl->choice == Cit_title_iso_jta ||
236 ttl->choice == Cit_title_ml_jta ||
237 ttl->choice == Cit_title_coden ||
238 ttl->choice == Cit_title_issn) {
239 str = (CharPtr) ttl->data.ptrvalue;
240 if (StringHasNoText (str)) continue;
241 return Mla2CreateJournalTitleRequest (str);
242 }
243 }
244
245 return NULL;
246 }
247
Mla2CreateCitArtMatchRequest(CitArtPtr cap)248 NLM_EXTERN MlaRequestPtr Mla2CreateCitArtMatchRequest (
249 CitArtPtr cap
250 )
251
252 {
253 MlaRequestPtr mrp;
254 ValNodePtr pub;
255
256
257 if (cap == NULL) return NULL;
258 cap = AsnIoMemCopy ((Pointer) cap,
259 (AsnReadFunc) CitArtAsnRead,
260 (AsnWriteFunc) CitArtAsnWrite);
261
262 pub = ValNodeNew (NULL);
263 pub->choice = PUB_Article;
264 pub->data.ptrvalue = cap;
265
266 mrp = ValNodeNew (NULL);
267 mrp->choice = MlaRequest_citmatch;
268 mrp->data.ptrvalue = (Pointer) pub;
269
270 return mrp;
271 }
272
Mla2CreateCitationtMatchRequest(CharPtr author,CharPtr journal,CharPtr volume,CharPtr page,Int4 year,CharPtr title)273 NLM_EXTERN MlaRequestPtr Mla2CreateCitationtMatchRequest (
274 CharPtr author,
275 CharPtr journal,
276 CharPtr volume,
277 CharPtr page,
278 Int4 year,
279 CharPtr title
280 )
281
282 {
283 AuthListPtr alp;
284 AuthorPtr ap;
285 CitArtPtr cap;
286 CitJourPtr cjp;
287 DatePtr dp;
288 ImprintPtr imp;
289 ValNodePtr jta;
290 MlaRequestPtr mrp;
291 ValNodePtr names;
292 NameStdPtr nsp;
293 PersonIdPtr pid;
294 ValNodePtr pub;
295 ValNodePtr ttl;
296
297 if (StringHasNoText (author) || StringHasNoText (journal) || year < 1900) return NULL;
298
299 cap = CitArtNew ();
300 if (cap == NULL) return NULL;
301
302 nsp = NameStdNew ();
303 nsp->names [0] = StringSave (author);
304
305 pid = PersonIdNew ();
306 pid->choice = 2;
307 pid->data = nsp;
308
309 ap = AuthorNew ();
310 ap->name = pid;
311
312 names = ValNodeNew (NULL);
313 names->choice = 1;
314 names->data.ptrvalue = ap;
315
316 alp = AuthListNew ();
317 alp->choice = 1;
318 alp->names = names;
319
320 cap->authors = alp;
321
322 jta = ValNodeNew (NULL);
323 jta->choice = Title_type_name;
324 jta->data.ptrvalue = StringSave (journal);
325
326 cjp = CitJourNew ();
327 cjp->title = jta;
328
329 dp = DateNew ();
330 dp->data [0] = 1;
331 dp->data [1] = year - 1900;
332
333 imp = ImprintNew ();
334 imp->date = dp;
335 imp->volume = StringSaveNoNull (volume);
336 imp->pages = StringSaveNoNull (page);
337
338 cjp->imp = imp;
339
340 cap->from = 1;
341 cap->fromptr = cjp;
342
343 if (StringDoesHaveText (title))
344 {
345 ttl = ValNodeNew (NULL);
346 ttl->choice = Title_type_name;
347 ttl->data.ptrvalue = StringSave (title);
348
349 cap->title = ttl;
350 }
351
352 pub = ValNodeNew (NULL);
353 pub->choice = PUB_Article;
354 pub->data.ptrvalue = cap;
355
356 mrp = ValNodeNew (NULL);
357 mrp->choice = MlaRequest_citmatch;
358 mrp->data.ptrvalue = (Pointer) pub;
359
360 return mrp;
361 }
362
Mla2CreatePubFetchRequest(Int4 pmid)363 NLM_EXTERN MlaRequestPtr Mla2CreatePubFetchRequest (
364 Int4 pmid
365 )
366
367 {
368 MlaRequestPtr mrp;
369
370 if (pmid < 1) return NULL;
371
372 mrp = ValNodeNew (NULL);
373 mrp->choice = MlaRequest_getpub;
374 mrp->data.intvalue = pmid;
375
376 return mrp;
377 }
378
379 /* reply extraction functions */
380
Mla2ExtractJournalTitleReply(MlaBackPtr mbp)381 NLM_EXTERN TitleMsgListPtr Mla2ExtractJournalTitleReply (
382 MlaBackPtr mbp
383 )
384
385 {
386 TitleMsgListPtr tlp;
387
388 if (mbp == NULL || mbp->choice != MlaBack_gettitle) return NULL;
389 tlp = (TitleMsgListPtr) mbp->data.ptrvalue;
390 if (tlp == NULL) return NULL;
391 mbp->data.ptrvalue = NULL;
392
393 return tlp;
394 }
395
Mla2ExtractCitMatchReply(MlaBackPtr mbp)396 NLM_EXTERN Int4 Mla2ExtractCitMatchReply (
397 MlaBackPtr mbp
398 )
399
400 {
401 Int4 pmid;
402
403 if (mbp == NULL || mbp->choice != MlaBack_citmatch) return 0;
404 pmid = (Int4) mbp->data.intvalue;
405 if (pmid < 1) return 0;
406
407 return pmid;
408 }
409
Mla2ExtractPubFetchReply(MlaBackPtr mbp)410 NLM_EXTERN CitArtPtr Mla2ExtractPubFetchReply (
411 MlaBackPtr mbp
412 )
413
414 {
415 CitArtPtr cap;
416 ValNodePtr pub;
417
418 if (mbp == NULL || mbp->choice != MlaBack_getpub) return NULL;
419 pub = mbp->data.ptrvalue;
420 if (pub == NULL || pub->choice != PUB_Article) return NULL;
421 cap = (CitArtPtr) pub->data.ptrvalue;
422 if (cap == NULL) return NULL;
423 pub->data.ptrvalue = NULL;
424
425 return cap;
426 }
427
428 /* utility functions */
429
430 /* ml to std code modified from original in medutil.c and then in pmfapi.c */
431
StrIsAllUpperCase(CharPtr p)432 static Boolean StrIsAllUpperCase (
433 CharPtr p
434 )
435
436 {
437 Char ch;
438
439 if (p == NULL) return FALSE;
440 ch = *p;
441 while (ch != '\0') {
442 if (! IS_UPPER (ch)) return FALSE;
443 p++;
444 ch = *p;
445 }
446 return TRUE;
447 }
448
SplitMLAuthName(CharPtr name,CharPtr last,CharPtr initials,CharPtr suffix)449 static void SplitMLAuthName (
450 CharPtr name,
451 CharPtr last,
452 CharPtr initials,
453 CharPtr suffix
454 )
455
456 {
457 CharPtr p, p2;
458 Int2 i;
459 Char sbuf [40], ibuf [40];
460
461 /* Clear the ibuf field and transfer the entire name to 'last',
462 excluding leading and trailing spaces */
463
464 if (name == NULL) return;
465
466 ibuf [0] = '\0';
467 sbuf [0] = '\0';
468 last [0] = '\0';
469 initials [0] = '\0';
470 suffix [0] = '\0';
471 while (*name <= ' ') {
472 name++;
473 if (*name == '\0') return;
474 }
475 StringCpy( last, name );
476
477 for (i=StringLen (last) - 1; ((i >= 0) && (last [i] <= ' ')); i--) {
478 last[i] = '\0';
479 }
480
481 /* Strip off the last token (initials or name suffix (Jr, Sr, suffix.) */
482
483 p = StringRChr (last, (int) ' ');
484 if (p != NULL) { /* more than just last name */
485
486 /* Separate the token from the last name */
487
488 p2 = p + 1;
489 while ((p > last) && (*p == ' ')) {
490 *p = '\0';
491 p--;
492 }
493
494 /* If the last token is not all upper case, and there are more than
495 two tokens, see if the next to the last are initials (upper case) */
496
497 if (! StrIsAllUpperCase (p2) && (p = StringRChr (last, (int) ' ' )) != NULL) {
498
499 /* We have at least three tokens, is the next to last initials? */
500
501 if (StrIsAllUpperCase (p + 1)) {
502
503 /* Yes - concatenate the last two tokens as initials */
504
505 StringCpy (ibuf, p + 1);
506 StringCpy (sbuf, p2);
507 while (p > last && (*p == ' ')) {
508 *p = '\0';
509 p--;
510 }
511 }
512 }
513
514 if (ibuf [0] == '\0') { /* Only the last token goes in ibuf */
515 StringCpy (ibuf, p2);
516 }
517 }
518
519 /* now add periods to ibuf and convert suffix */
520
521 for (p = initials, p2 = ibuf; *p2 != '\0'; p2++, p++) {
522 *p = *p2;
523 if (! IS_LOWER(*(p2 + 1))) { /* watch out for foreign names */
524 p++;
525 *p = '.';
526 }
527 }
528 *p = '\0';
529
530 if (sbuf [0]) {
531 if (StringCmp (sbuf, "1d") == 0 || StringCmp (sbuf, "1st") == 0)
532 p = StringMove (suffix, "I");
533 else if (StringCmp (sbuf, "2d") == 0 || StringCmp (sbuf, "2nd") == 0)
534 p = StringMove (suffix, "II");
535 else if (StringCmp (sbuf, "3d") == 0 || StringCmp (sbuf, "3rd") == 0)
536 p = StringMove (suffix, "III");
537 else if (StringCmp (sbuf, "4th") == 0)
538 p = StringMove (suffix, "IV");
539 else if (StringCmp (sbuf, "5th") == 0)
540 p = StringMove (suffix, "V");
541 else if (StringCmp (sbuf, "6th") == 0)
542 p = StringMove (suffix, "VI");
543 else if (StringCmp (sbuf, "Sr") == 0)
544 p = StringMove (suffix, "Sr.");
545 else if (StringCmp (sbuf, "Jr") == 0)
546 p = StringMove (suffix, "Jr.");
547 else
548 p = StringMove (suffix, sbuf);
549 }
550 }
551
ChangeMLtoSTD(CharPtr token)552 static ValNodePtr ChangeMLtoSTD (
553 CharPtr token
554 )
555
556 {
557 AuthorPtr aup;
558 CharPtr eptr;
559 Char last [180], initials [40], suffix [40];
560 NameStdPtr nsp;
561 PersonIdPtr pid;
562 ValNodePtr vnp;
563
564 if (token == NULL) return NULL;
565 for (eptr = token + StringLen (token) - 1;
566 eptr > token && *eptr == ' ';
567 eptr--) continue;
568
569 SplitMLAuthName (token, last, initials, suffix);
570
571 nsp = NameStdNew ();
572 if (nsp == NULL) return NULL;
573 nsp->names [0] = StringSave (last);
574 if (initials [0] != '\0') {
575 nsp->names[4] = StringSave (initials);
576 }
577 if (suffix[0] != '\0') {
578 nsp->names[5] = StringSave (suffix);
579 }
580 if (nsp->names[0] != NULL) {
581 pid = PersonIdNew ();
582 pid->choice = 2; /* name */
583 pid->data = nsp;
584 aup = AuthorNew ();
585 aup->name = pid;
586 vnp = ValNodeNew (NULL);
587 vnp->data.ptrvalue = (Pointer) aup;
588 return vnp;
589 }
590 return NULL;
591 }
592
ChangeCitArtMLAuthorsToSTD(CitArtPtr cap)593 NLM_EXTERN void ChangeCitArtMLAuthorsToSTD (
594 CitArtPtr cap
595 )
596
597 {
598 AuthListPtr alp;
599 AuthorPtr ap;
600 ValNodePtr curr, last = NULL, names, oldnames, tmp;
601 PersonIdPtr pid;
602 CharPtr str;
603
604 if (cap == NULL) return;
605 alp = cap->authors;
606 if (alp == NULL) return;
607
608 if (alp->choice == 1) {
609 for (names = alp->names; names != NULL; names = names->next) {
610 ap = names->data.ptrvalue;
611 if (ap == NULL) continue;
612 pid = ap->name;
613 if (pid == NULL) continue;
614 if (pid->choice != 3) continue;
615 str = (CharPtr) pid->data;
616 if (StringHasNoText (str)) continue;
617 curr = ChangeMLtoSTD (str);
618 if (curr == NULL) continue;
619 names->data.ptrvalue = AuthorFree (ap);
620 names->data.ptrvalue = curr->data.ptrvalue;
621 /* do not ValNodeFreeData, since data has been switched to old author */
622 ValNodeFree (curr);
623 }
624 }
625
626 if (alp->choice == 2) {
627
628 /* do not convert if too big for buffers */
629
630 for (tmp = alp->names; tmp != NULL; tmp = tmp->next) {
631 if (StringLen ((CharPtr) tmp->data.ptrvalue) > 170) return;
632 }
633
634 oldnames = alp->names;
635 alp->names = NULL;
636 alp->choice = 1; /* make std names */
637
638 for (tmp = oldnames; tmp != NULL; tmp = tmp->next) {
639 curr = ChangeMLtoSTD ((CharPtr) tmp->data.ptrvalue);
640 if (alp->names == NULL) {
641 alp->names = curr;
642 }
643 if (last != NULL) {
644 last->next = curr;
645 }
646 last = curr;
647 }
648
649 ValNodeFreeData (oldnames);
650 }
651 }
652
ChangeMlaBackMLAuthorsToSTD(MlaBackPtr mbp)653 NLM_EXTERN void ChangeMlaBackMLAuthorsToSTD (
654 MlaBackPtr mbp
655 )
656
657 {
658 CitArtPtr cap;
659 ValNodePtr pub;
660
661 if (mbp == NULL || mbp->choice != MlaBack_getpub) return;
662 pub = mbp->data.ptrvalue;
663 if (pub == NULL || pub->choice != PUB_Article) return;
664 cap = (CitArtPtr) pub->data.ptrvalue;
665 if (cap == NULL) return;
666 ChangeCitArtMLAuthorsToSTD (cap);
667 }
668
669 typedef struct ejour {
670 CharPtr journal_name;
671 Int2 starting_year;
672 } EjourData, PNTR EjourDataPtr;
673
674 static EjourData mla2_ejour_list [] = {
675 {"Acta Crystallograph. Sect. F Struct. Biol. Cryst. Commun.", 0 },
676 {"Acta Vet. Scand.", 2006 },
677 {"Afr. J. Biotechnol.", 0 },
678 {"Ambul. Surg.", 2005 },
679 {"Ann. Clin. Microbiol. Antimicrob.", 0 },
680 {"Appl Plant Sci", 0 },
681 {"Biol. Direct", 0 },
682 {"Biotecnol. Apl.", 2002 },
683 {"BMC Biochem.", 0 },
684 {"BMC Bioinformatics", 0 },
685 {"BMC Biotechnol.", 0 },
686 {"BMC Cancer", 0 },
687 {"BMC Cell Biol.", 0 },
688 {"BMC Dermatol.", 0 },
689 {"BMC Dev. Biol.", 0 },
690 {"BMC Ecol.", 0 },
691 {"BMC Evol. Biol.", 0 },
692 {"BMC Genet.", 0 },
693 {"BMC Genomics", 0 },
694 {"BMC Immunol.", 0 },
695 {"BMC Infect. Dis.", 0 },
696 {"BMC Med. Genet.", 0 },
697 {"BMC Microbiol.", 0 },
698 {"BMC Mol. Biol.", 0 },
699 {"BMC Pharmacol.", 0 },
700 {"BMC Physiol.", 0 },
701 {"BMC Plant Biol.", 0 },
702 {"BMC Struct. Biol.", 0 },
703 {"BMC Vet. Res.", 0 },
704 {"Breast Cancer Res.", 2005 },
705 {"Cancer Cell Int.", 0 },
706 {"Cancer Immun.", 0 },
707 {"Cell Commun. Signal", 0 },
708 {"Cell Struct. Funct.", 2005 },
709 {"Cell. Mol. Biol. (Noisy-le-grand)", 2004 },
710 {"Colomb. Med.", 1998 },
711 {"Crit. Rev. Oral Biol. Med.", 2002 },
712 {"Dermatol. Online J.", 0 },
713 {"Electron. J. Biotechnol.", 0 },
714 {"Eur. J. Genet. Mol. Toxicol.", 0 },
715 {"Evol. Bioinform. Online", 0 },
716 {"Front. Zool.", 0 },
717 {"Fungal Planet", 0 },
718 {"Genome Announcements", 0 },
719 {"Genome Biol.", 2005 },
720 {"Geochem. Trans.", 0 },
721 {"Hereditas", 2004 },
722 {"Hum. Genomics", 2004 },
723 {"ISRN Genetics", 0 },
724 {"Infect. Agents Cancer", 0 },
725 {"J Clin Exp Cardiolog", 0 },
726 {"J Oral Microbiol", 0 },
727 {"J. Exp. Clin. Assist. Reprod.", 0 },
728 {"JOP", 0 },
729 {"Kinetoplastid Biol Dis", 0 },
730 {"Malar. J.", 0 },
731 {"MBio", 0 },
732 {"Microb. Cell Fact.", 0 },
733 {"Mol. Syst. Biol.", 0 },
734 {"Mol. Vis.", 0 },
735 {"Nat Commun", 0 },
736 {"Neoplasia", 2005 },
737 {"Nucl. Recept.", 0 },
738 {"Pharmacologyonline", 0 },
739 {"Plant Methods", 0 },
740 {"PLoS Biol.", 2006 },
741 {"PLoS Comput. Biol.", 0 },
742 {"PLoS Genet.", 0 },
743 {"PLoS Med.", 0 },
744 {"PLoS Negl Trop Dis", 0 },
745 {"PLoS ONE", 0 },
746 {"PLoS Pathog.", 0 },
747 {"Redox Rep.", 2004 },
748 {"Reprod. Biol. Endocrinol.", 0 },
749 {"Retrovirology", 0 },
750 {"Saline Syst.", 0 },
751 {"Sci. STKE", 0 },
752 {"ScientificWorldJournal", 0 },
753 {"Tech. Tips Online", 0 },
754 {"Virol. J.", 0 },
755 {NULL, 0 }
756 };
757
Mla2IsEPubOnlyJournal(CharPtr jta,Int2Ptr starting_yearP)758 NLM_EXTERN Boolean Mla2IsEPubOnlyJournal (
759 CharPtr jta,
760 Int2Ptr starting_yearP
761 )
762
763 {
764 EjourDataPtr ejp;
765 Int2 L, R, mid;
766
767 if (starting_yearP != NULL) {
768 *starting_yearP = 0;
769 }
770
771 if (StringHasNoText (jta)) return FALSE;
772
773 L = 0;
774 R = sizeof (mla2_ejour_list) / sizeof (mla2_ejour_list [0]) - 1; /* -1 because now NULL terminated */
775
776 while (L < R) {
777 mid = (L + R) / 2;
778 ejp = &(mla2_ejour_list [mid]);
779 if (ejp != NULL && StringICmp (ejp->journal_name, jta) < 0) {
780 L = mid + 1;
781 } else {
782 R = mid;
783 }
784 }
785
786 ejp = &(mla2_ejour_list [R]);
787 if (ejp != NULL && StringICmp (ejp->journal_name, jta) == 0) {
788 if (starting_yearP != NULL) {
789 *starting_yearP = ejp->starting_year;
790 }
791 return TRUE;
792 }
793
794 return FALSE;
795 }
796
Mla2CorrectCitArt(CitArtPtr newcap,CitArtPtr oldcap)797 NLM_EXTERN Int2 Mla2CorrectCitArt (
798 CitArtPtr newcap,
799 CitArtPtr oldcap
800 )
801
802 {
803 if (newcap == NULL) return 0;
804
805 ChangeCitArtMLAuthorsToSTD (newcap);
806
807 return 0;
808 }
809
810