X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fiso2709a.c;h=a802328440fe6de7a993d1c75f6332ecc9819b54;hb=e1ec9d39463f431383547891f38e30f2ff17842c;hp=343cea2673863f6bb04f737fcba38b130cf8b7c9;hpb=d5632f532e0757b5c538da730a4afe0bb7de0c94;p=egate.git diff --git a/util/iso2709a.c b/util/iso2709a.c index 343cea2..a802328 100644 --- a/util/iso2709a.c +++ b/util/iso2709a.c @@ -1,10 +1,63 @@ /* + * Copyright (c) 1995, the EUROPAGATE consortium (see below). + * + * The EUROPAGATE consortium members are: + * + * University College Dublin + * Danmarks Teknologiske Videnscenter + * An Chomhairle Leabharlanna + * Consejo Superior de Investigaciones Cientificas + * + * Permission to use, copy, modify, distribute, and sell this software and + * its documentation, in whole or in part, for any purpose, is hereby granted, + * provided that: + * + * 1. This copyright and permission notice appear in all copies of the + * software and its documentation. Notices of copyright or attribution + * which appear at the beginning of any file must remain unchanged. + * + * 2. The names of EUROPAGATE or the project partners may not be used to + * endorse or promote products derived from this software without specific + * prior written permission. + * + * 3. Users of this software (implementors and gateway operators) agree to + * inform the EUROPAGATE consortium of their use of the software. This + * information will be used to evaluate the EUROPAGATE project and the + * software, and to plan further developments. The consortium may use + * the information in later publications. + * + * 4. Users of this software agree to make their best efforts, when + * documenting their use of the software, to acknowledge the EUROPAGATE + * consortium, and the role played by the software in their work. + * + * THIS SOFTWARE IS PROVIDED "AS IS" AND WITHOUT WARRANTY OF ANY KIND, + * EXPRESS, IMPLIED, OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY + * WARRANTY OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL THE EUROPAGATE CONSORTIUM OR ITS MEMBERS BE LIABLE + * FOR ANY SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF + * ANY KIND, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA + * OR PROFITS, WHETHER OR NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND + * ON ANY THEORY OF LIABILITY, ARISING OUT OF OR IN CONNECTION WITH THE + * USE OR PERFORMANCE OF THIS SOFTWARE. + * + */ +/* * Iso2709 record management - anchor utilities * * Europagate, 1995. * * $Log: iso2709a.c,v $ - * Revision 1.1 1995/03/29 11:44:29 adam + * Revision 1.4 1995/05/16 09:40:54 adam + * LICENSE. + * + * Revision 1.3 1995/03/30 14:22:18 adam + * More work on new MARC anchor functions. + * + * Revision 1.2 1995/03/30 07:33:35 adam + * New 2709 function: iso2709_mk. + * First implementation of iso2709_a_insert. + * + * Revision 1.1 1995/03/29 11:44:29 adam * New functions: iso2709_a_.. for record manipulation. * */ @@ -27,6 +80,8 @@ Iso2709Anchor iso2709_a_mk (Iso2709Rec rec) anchor->d0 = &rec->directory; if (*anchor->d0) anchor->f0 = &(*anchor->d0)->fields; + else + anchor->f0 = NULL; return anchor; } @@ -85,9 +140,17 @@ int iso2709_a_info_field (Iso2709Anchor anchor, if (tag) *tag = (*anchor->d0)->tag; if (indicator) + { *indicator = (*anchor->d0)->indicator; + if (*indicator && !**indicator) + *indicator = NULL; + } if (identifier) + { *identifier = (*anchor->f0)->identifier; + if (*identifier && !**identifier) + *identifier = NULL; + } if (data) *data = (*anchor->f0)->data; return 1; @@ -110,7 +173,6 @@ int iso2709_a_delete_field (Iso2709Anchor anchor) return 0; field = *anchor->f0; *anchor->f0 = field->next; - free (field->identifier); free (field->data); free (field); if (!*anchor->f0) @@ -171,10 +233,48 @@ int iso2709_a_search (Iso2709Anchor anchor, return 0; } -int iso2709_a_insert (Iso2709Anchor anchor, +int iso2709_a_insert (Iso2709Anchor a, const char *tag, const char *indicator, const char *identifier, const char *data) { - return 0; + struct iso2709_field *field; + + assert (data); + assert (tag); + assert (a->d0); + if (! *a->d0 || strcmp (tag, (*a->d0)->tag)) + { + struct iso2709_dir *dir; + + if (!(dir = malloc (sizeof(*dir)))) + return 0; + strcpy (dir->tag, tag); + if (indicator) + { + if (!(dir->indicator = malloc (strlen(indicator)+1))) + return 0; + strcpy (dir->indicator, indicator); + } + else + dir->indicator = NULL; + if (*a->d0) + a->d0 = &(*a->d0)->next; + dir->next = *a->d0; + *a->d0 = dir; + dir->fields = NULL; + a->f0 = &dir->fields; + } + if (!(field = malloc (sizeof(*field)))) + return 0; + if (identifier) + strcpy (field->identifier, identifier); + else + *field->identifier = '\0'; + if (!(field->data = malloc (strlen (data)+1))) + return 0; + strcpy (field->data, data); + field->next = *a->f0; + *a->f0 = field; + a->f0 = &field->next; + return 1; } -