sasa_c_f90.c

Go to the documentation of this file.
00001 /* ---------------------------------------------------- */
00002 /* Copyright 2006-2010, CERFACS, Toulouse, France. */
00003 /* Copyright 2006-2010, Centre National de la Recherche Scientifique, Paris, France. */
00004 /* All rights reserved. Use is subject to OASIS4 license terms. */
00005 /* ---------------------------------------------------- */
00006 /*
00007    file sasa_c_f90.c
00008    C source file for sasa
00009 */
00010 
00011 
00012 #include <string.h>
00013 #include <stdlib.h>
00014 #include <stdio.h>
00015 #include <stdarg.h>
00016 #include "sasa_c_f90.h"
00017 #include "sasa_c_xml.h"
00018 
00019 /*
00020  
00021   !DESCRIPTION:
00022  
00023    This files gathers the c routines called by the fortran that extract the 
00024    xml informations. 
00025    The extraction is done using the 'xpath' technics. 
00026    3 types of extractions are given: 
00027    - the extraction of the number of elements,
00028    - the extraction of the attributes,
00029    - the extraction of the elements (could be char, int or double).
00030    A convertion routine is also given to convert char to parameter integers.
00031 
00032          <stdio.h>
00033          <string.h>
00034          <stdlib.h>
00035          "sasa_c_f90.h"
00036 
00037   !REVISION HISTORY:
00038 
00039     Date      Programmer   Description
00040   ----------  ----------   -----------
00041    ??.??.??   P. Bourcier  Creation of sasa_c_read_file and sasa_c_close
00042    30.01.04   D. Declat    Creation of all the generic routines that extract
00043                              the attributes, the numbers and the elements
00044    14.01.08   I.Henderson  Replaced generic routines that extract the
00045                            attributes, elements and number of elements with
00046                            modified versions that can process an arbitrary
00047                            (rather than fixed) number of XPath nodes and 
00048                            support >99 elements (e.g. 100 transients).
00049                            New functions are: sasa_c_get_number,
00050                            sasa_c_get_attribute, sasa_c_get_element_c,
00051                            sasa_c_get_element_i, sasa_c_get_element_d,
00052                            sasa_c_build_xpath_str.
00053    22.03.10   JM Epitalon  Simultaneous access to multiple documents :
00054                            sasa_c_read_file() returns a pointer to doc tree
00055 
00056     Not yet implemented :  Assume that all XML elements refer to a default namespace:
00057                            add prefix "default:" to every XML elements 
00058                            when building XPaths
00059  
00060 //EOP
00061 
00062  ----------------------------------------------------------------------
00063   $Id: sasa_c_f90.c 3246 2011-06-23 12:43:21Z coquart $
00064   $Author: coquart $
00065  ---------------------------------------------------------------------- */
00066 
00067 
00068 /* Size of buffer for xpath strings */
00069 #define XPATH_STR_LEN_MAX (1023)
00070 
00071 #define PSMILE_UNDEF (-280177)
00072 
00073 /* Whether an XPath starts with "/", "//" or a nodename */
00074 typedef enum
00075 {
00076     XPATH_START_INVALID = -1,
00077 
00078     XPATH_START_FIRST,
00079   XPATH_START_CHILD_OF_ROOT_NODE = XPATH_START_FIRST,
00080   XPATH_START_DESCENDANT_OF_ROOT_NODE,
00081   XPATH_START_CHILD_OF_CURRENT_NODE,
00082     XPATH_START_LAST = XPATH_START_CHILD_OF_CURRENT_NODE,
00083 
00084     XPATH_START_COUNT
00085 
00086 } XPathStartType;
00087 
00088 
00089 /* XML node types (elements, attributes...) */
00090 typedef enum
00091 {
00092     XPATH_NODE_TYPE_INVALID = -1,
00093 
00094     XPATH_NODE_TYPE_FIRST,
00095   XPATH_NODE_TYPE_ELEMENT = XPATH_NODE_TYPE_FIRST,
00096   XPATH_NODE_TYPE_ATTRIBUTE,
00097     XPATH_NODE_TYPE_LAST = XPATH_NODE_TYPE_ATTRIBUTE,
00098 
00099     XPATH_NODE_TYPE_COUNT
00100 
00101 } XPathNodeType;
00102 
00103 
00104 /* - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = */
00105 
00106 
00107 static int sasa_c_get_number(      int *, int, size_t, ... );
00108 static int sasa_c_get_attribute(   char *, int *, int, size_t, ... );
00109 static int sasa_c_get_element_c(   char *, int *, int, size_t, ... );
00110 static int sasa_c_get_element_i(   int *, int, size_t, ... );
00111 static int sasa_c_get_element_d(   double *, int, size_t, ... );
00112 static int sasa_c_build_xpath_str( char *, XPathStartType, XPathNodeType,
00113                                    size_t, va_list );
00114 
00115 
00116 /* - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = */
00117 
00118 int
00119 __sasa_c_convert_char2int  (char *charcode, int len_charcode)
00120 {
00121     struct pair
00122     {
00123         char *keyword;
00124         int code;
00125     };
00126     struct pair *p_pair;
00127     int nb_pairs;
00128     int result;
00129 
00130     size_t len = len_charcode;
00131 
00132 #ifdef DEBUG
00133     (void)printf("sasa_c_convert_char2int : charcode: %s\n", charcode);
00134     (void)printf("sasa_c_convert_char2int : len_charcode: %d\n", len);
00135 #endif
00136 
00137     result = -280177;
00138 
00139 /*************************************************************************
00140 
00141    List of keywords (in XML element attributes) and their corresponding value in OASIS4
00142    ====================================================================================
00143      
00144     first    = 1;
00145     second   = 2;
00146     third    = 3;
00147     fourth   = 4;
00148 
00149     not_spawn = 1;
00150     spawn     = 2;
00151 
00152     false    = 0;
00153     true     = 1;
00154 
00155     meters   = 3000;
00156     bar      = 3001;
00157     millibar = 3002;
00158     decibar  = 3003;
00159     atmosphere  = 3004;
00160     pascal   = 3005;
00161     hPa      = 3006;
00162     unitless = 3007;
00163 
00164     degrees_east    = 3008;
00165     degrees_north   = 3009;
00166 
00167     single   = 3500;
00168     vector   = 3501;
00169     bundle   = 3502;
00170 
00171     mean     = 3530;
00172     max      = 3531;
00173     min      = 3532;
00174     median   = 3533;
00175     variance = 3534;
00176     integral = 3535;
00177     average  = 3536;
00178     wgt_ave  = 3537;
00179     subgrid_ave = 3538;
00180 
00181     file     = 3810;
00182     component_name   = 3800;
00183 
00184     mpp_ascii   = 3821;
00185     mpp_ieee32  = 3822;
00186     mpp_native  = 3823;
00187     mpp_netcdf  = 3824;
00188 
00189     taverage   = 3600;
00190     accumul    = 3601;
00191     tmin       = 3602;
00192     tmax       = 3603;
00193 
00194     up     = 1;
00195     down   = 2;
00196 
00197     PRISM_reglonlatvrt     = 0;
00198     PRISM_irrlonlat_regvrt = 1;
00199     PRISM_irrlonlatvrt     = 2;
00200     PRISM_irrlonlat_sigmavrt = 3;
00201     PRISM_reglonlat_sigmavrt = 4;
00202     PRISM_unstructlonlat_regvrt = 5;
00203     PRISM_unstructlonlat_sigmavrt = 6;
00204     PRISM_unstructlonlatvrt     = 7;
00205     PRISM_gridless              = 8;
00206     PRISM_gaussreduced_regvrt   = 9;
00207     PRISM_gaussreduced_sigmavrt = 10;
00208 
00209     xs:real    = 4;
00210     xs:double  = 5;
00211     xs:string  = 1;
00212     xs:integer = 2;
00213     xs:nonPositiveInteger = 2;
00214     xs:negativeInteger    = 2;
00215     xs:positiveInteger    = 2;
00216 
00217     smooth   = 3685;
00218     raw      = 3686;
00219 
00220     sinus    = 3680;
00221     cosinus  = 3681;
00222     log      = 3682;
00223 
00224     time_nneighbour = 3604;
00225     time_linear     = 3605;
00226 
00227     conserv_global    = 3675;
00228 
00229     global    = 3711;
00230     local     = 3710;
00231 
00232     iosingle    = 3825;
00233     parallel    = 3826;
00234     distributed = 3827;
00235 
00236     latitude  = 3648;
00237     latlon    = 3647;
00238 
00239     approximate  = 3657;
00240     precise      = 3658;
00241 
00242     novalue    = 3643;
00243     tneighbour = 3644;
00244     nneighbour = 3645;
00245     vneighbour = 3646;
00246 
00247 
00248     gradient   = 3660;
00249     sixteen    = -280177;
00250     fracarea   = 3665;
00251     destarea   = 3666;
00252     none       = -1;
00253     " "        = -280177;
00254 
00255     on     = 1;
00256     off    = 0;
00257 
00258 *****************************************************************************/
00259 
00260     /* Sort keywords by length */
00261     /* ----------------------- */
00262     
00263     switch (len)
00264     {
00265     case 2:
00266     {
00267         static struct pair tab2[] = { {"up", 1}, {"on", 1} };
00268         p_pair = tab2;
00269         nb_pairs = 2;
00270         break;
00271     }   
00272     case 3:
00273     {
00274         static struct pair tab3[] = {
00275             {"bar", 3001}, {"hPa", 3006}, {"max", 3531}, {"min", 3532}, {"raw", 3686}, {"log", 3682}, {"off", 0}
00276         };
00277         p_pair = tab3;
00278         nb_pairs = 7;
00279         break;
00280     }   
00281     case 4:
00282     {
00283         static struct pair tab4[] = {
00284             {"true", 1}, {"mean", 3530}, {"file", 3810}, {"tmin", 3602}, {"tmax", 3603}, {"down", 2}, {"none", -1},
00285         };
00286         p_pair = tab4;
00287         nb_pairs = 7;
00288         break;
00289     }   
00290         break;
00291     case 5:
00292     {
00293         static struct pair tab5[] = {
00294             {"first", 1}, {"third", 3}, {"spawn", 2}, {"false", 0}, {"sinus", 3680}, {"local", 3710},
00295         };
00296 
00297         p_pair = tab5;
00298         nb_pairs = 6;
00299         break;
00300     }   
00301     case 6:
00302     {
00303         static struct pair tab6[] = {
00304             {"second", 2}, {"fourth", 4}, {"meters", 3000}, {"pascal", 3005}, {"single", 3500}, {"vector", 3501},
00305             {"bundle", 3502}, {"median", 3533}, {"smooth", 3685}, {"global", 3711}, {"latlon", 3647},
00306         };
00307         p_pair = tab6;
00308         nb_pairs = 11;
00309         break;
00310     }   
00311     case 7:
00312     {
00313         static struct pair tab7[] = {
00314             {"decibar", 3003}, {"average", 3536}, {"wgt_ave", 3537}, {"accumul", 3601}, {"xs:real", 4}, {"cosinus", 3681}, 
00315             {"precise", 3658}, {"novalue", 3643}, {"sixteen", -280177},
00316         };
00317         p_pair = tab7;
00318         nb_pairs = 9;
00319         break;
00320     }   
00321     case 8:
00322     {
00323         static struct pair tab8[] = {
00324             {"millibar", 3002}, {"unitless", 3007}, {"variance", 3534}, {"integral", 3535}, {"taverage", 3600}, {"iosingle", 3825},
00325             {"parallel", 3826}, {"latitude", 3648}, {"gradient", 3660}, {"fracarea", 3665}, {"destarea", 3666},
00326         };
00327         p_pair = tab8;
00328         nb_pairs = 11;
00329         break;
00330     }   
00331     case 9:
00332     {
00333         static struct pair tab9[] = {
00334             {"not_spawn", 1}, {"mpp_ascii", 3821}, {"xs:double", 5}, {"xs:string", 1},
00335         };
00336         p_pair = tab9;
00337         nb_pairs = 4;
00338         break;
00339     }   
00340     case 10:
00341     {
00342         static struct pair tab10[] = {
00343             {"atmosphere", 3004}, {"mpp_ieee32", 3822}, {"mpp_native", 3823}, {"mpp_netcdf", 3824}, {"xs:integer", 2},
00344             {"tneighbour", 3644}, {"nneighbour", 3645}, {"vneighbour", 3646},
00345         };
00346         p_pair = tab10;
00347         nb_pairs = 8;
00348         break;
00349     }   
00350     case 11:
00351     {
00352         static struct pair tab11[] = {
00353             {"subgrid_ave", 3538}, {"time_linear", 3605}, {"distributed", 3827}, {"approximate", 3657},
00354         };
00355         p_pair = tab11;
00356         nb_pairs = 4;
00357         break;
00358     }   
00359     case 12:
00360         /* One single choice : {"degrees_east", 3008}, */
00361         result = 3008;
00362         nb_pairs = 0;
00363         break;
00364     case 13:
00365         /* One single choice : {"degrees_north", 3009}, */
00366         result = 3009;
00367         nb_pairs = 0;
00368         break;
00369     case 14:
00370     {
00371         static struct pair tab14[] = {
00372             {"component_name", 3800}, {"PRISM_gridless", 8}, {"conserv_global", 3675},
00373         };
00374         p_pair = tab14;
00375         nb_pairs = 3;
00376         break;
00377     }   
00378     case 15:
00379         /* One single choice : {"time_nneighbour", 3604}, */
00380         result = 3004;
00381         nb_pairs = 0;
00382         break;
00383     case 16:
00384     {
00385         static struct pair tab16[] = {
00386             {"PRISM_reglonlatvrt", 0}, {"PRISM_irrlonlatvrt", 2}, {"xs:negativeInteger", 2}, {"xs:positiveInteger", 2},
00387         };
00388         p_pair = tab16;
00389         nb_pairs = 4;
00390         break;
00391     }   
00392     case 17:
00393         /* One single choice : {"xs:nonPositiveInteger", 2}, */
00394         result = 2;
00395         nb_pairs = 0;
00396         break;
00397     case 18:
00398         /* One single choice : {"PRISM_irrlonlat_regvrt", 1}, */
00399         result = 1;
00400         nb_pairs = 0;
00401         break;
00402     case 19:
00403         /* One single choice : {"PRISM_unstructlonlatvrt", 7}, */
00404         result = 7;
00405         nb_pairs = 0;
00406         break;
00407     case 20:
00408     {
00409         static struct pair tab20[] = {
00410             {"PRISM_irrlonlat_sigmavrt", 3}, {"PRISM_reglonlat_sigmavrt", 4},
00411         };
00412         p_pair = tab20;
00413         nb_pairs = 2;
00414         break;
00415     }   
00416     case 21:
00417         /* One single choice : {"PRISM_gaussreduced_regvrt", 9}, */
00418         result = 9;
00419         nb_pairs = 0;
00420         break;
00421     case 22:
00422     {
00423         static struct pair tab22[] = {
00424             {"PRISM_unstructlonlat_regvrt", 5}, {"PRISM_gaussreduced_sigmavrt", 10},
00425         };
00426         p_pair = tab22;
00427         nb_pairs = 2;
00428         break;
00429     }   
00430     case 23:
00431         /* One single choice : {"PRISM_unstructlonlat_sigmavrt", 6}, */
00432         result = 6;
00433         nb_pairs = 0;
00434         break;
00435     
00436     default:
00437         /* no match */
00438         result = -280177;
00439         nb_pairs = 0;
00440         break;
00441     
00442     } /* end switch (len) */
00443 
00444    /* Compare keywords with given character string */
00445 
00446     /* For all keywords of length 'len' */
00447     while (nb_pairs -- > 0 && result == -280177)
00448     {
00449         /* if keyword matches */
00450         if (strncmp(charcode, p_pair->keyword, len) == 0)
00451             result = p_pair->code;
00452         else
00453             /* test next keyword */
00454             p_pair += 1;
00455     }
00456 
00457     /* if not empty string */
00458     if (! (charcode[0] == ' '))
00459     {
00460         /* if no match */
00461         if (result == -280177)
00462         {
00463             printf("\n");
00464             printf("sasa_c_convert_char2int : There is no corresponding parameter to char %s\n",charcode);
00465         }
00466     }
00467 
00468 #ifdef DEBUG
00469     (void)printf("sasa_c_convert_char2int : result code : %d\n",result);
00470     (void)printf("--------------------------------------------------\n");
00471 #endif
00472 
00473     return (result);
00474 }
00475 
00476 /* - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = */
00477 
00478 /*
00479 
00480 //BOP
00481 
00482   !ROUTINE: sasa_c_read_file
00483 
00484   !DESCRIPTION:
00485 
00486    Open an XML file and load its content (the XML tree) into memory.
00487    Return a handle to the XML content, that must be susequently 
00488    passed as a parameter to querying functions.
00489 
00490   !INPUT PARAMETERS:
00491   
00492    xml_file_name = Pointer to Fortran string containing the file name
00493 
00494    len_file_name = length of file name
00495    
00496    len_declared  = length of Fortran string containing the file name
00497                    (unused)
00498    
00499   !OUTPUT PARAMETERS:
00500 
00501    returned    = handle to XML document tree of open file (positive integer)
00502 
00503   !FILES USED:
00504 
00505          <stdlib.h>
00506          <stdio.h>
00507          "sasa_c_f90.h"
00508          "sasa_c_xml.h"
00509 
00510   !REVISION HISTORY:
00511 
00512     Date      Programmer   Description
00513   ----------  ----------   -----------
00514   ??.??.??    P. Bourcier  Creation
00515   22.03.10    JM Epitalon  Simultaneous access to multiple documents
00516 
00517 //EOP
00518 
00519  ----------------------------------------------------------------------
00520   $Id
00521   $Author
00522  ----------------------------------------------------------------------
00523 */
00524 int sasa_c_read_file  (char *xml_file_name,
00525                int  *len_file_name,
00526                int len_declared)
00527 {
00528   int doc;
00529 /*   Variant : int doc=EXIT_SUCCESS;  */
00530 
00531   char *file_name;
00532 
00533   file_name = (char *) calloc(*len_file_name+1, sizeof(char));
00534   strncpy(file_name,xml_file_name,*len_file_name);
00535   file_name[*len_file_name] = 0;
00536 
00537 #ifdef DEBUG
00538   (void)printf("sasa_c_read_file : open file : %s\n", file_name);
00539 #endif
00540 
00541   doc = sasaOpenXml ((const char*)file_name);
00542 
00543   free(file_name);
00544 
00545   return(doc);
00546 
00547 }
00548 
00549 
00550 /* - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = */
00551 
00552 
00553 /*
00554 
00555 //BOP
00556 
00557   !ROUTINE: sasa_c_get_number
00558 
00559   !INTERFACE:
00560 
00561   !INPUT PARAMETERS:
00562   
00563    num_doc     = Handle to document tree as returned by sasa_c_read_file()
00564 
00565    nodes_count = Number of nodes in the given XPath *including* the element
00566                  that we're looking for.
00567 
00568    ...         = The XPath, expressed as a variable length list of triplets
00569                  describing each node in the path.  The triplets take the form: 
00570 
00571                    char *nodeName, int nodeNameLen, int nodeNum
00572 
00573                    E.g. the arguments:   "prismcomponent", 14, 0,
00574                                          "transient", 9, 5,
00575                                          "intent", 6, 0
00576 
00577                    represent the XPath:  prismcomponent/transient[5]/intent
00578    
00579   !OUTPUT PARAMETERS:
00580 
00581    xml_number  = Number of instances of the element referenced by the given
00582                  XPath.
00583 
00584    rc          = Return code
00585                = EXIT_SUCCESS (0) : No error
00586                = EXIT_FAILURE (1) : Error building XPath
00587 
00588   !DESCRIPTION:
00589 
00590    Get the number of instances of the XML element specified by the given XPath 
00591    in the given open XML document (e.g. SMIOC, SCC, ...).
00592 
00593   !FILES USED:
00594 
00595          <stdarg.h>
00596          <stdlib.h>
00597          <stdio.h>
00598          "sasa_c_f90.h"
00599          "sasa_c_xml.h"
00600 
00601   !REVISION HISTORY:
00602 
00603     Date      Programmer   Description
00604   ----------  ----------   -----------
00605   14.01.08    I.Henderson  created
00606   22.03.10    JM Epitalon  Simultaneous access to multiple documents
00607 
00608 //EOP
00609 
00610  ----------------------------------------------------------------------
00611   $Id
00612   $Author
00613  ----------------------------------------------------------------------
00614 */
00615 static int sasa_c_get_number( int    *xml_number,
00616                               int    num_doc,
00617                               size_t nodes_count,
00618                               ... )
00619 {
00620   va_list nodes;
00621   int     rc=EXIT_SUCCESS;  /* return code */
00622   char    xpath_str[ XPATH_STR_LEN_MAX + 1 ];
00623   int     xpath_str_len;
00624   int     number;
00625  
00626   ASSERT( xml_number != NULL );
00627   ASSERT( nodes_count > 0 );
00628 
00629   va_start( nodes, nodes_count );
00630 
00631   /* Build the xpath string (-1 to get number of parent nodes) */
00632   xpath_str_len = sasa_c_build_xpath_str(  
00633     xpath_str,
00634     XPATH_START_CHILD_OF_CURRENT_NODE,
00635     XPATH_NODE_TYPE_ELEMENT,
00636     nodes_count - 1,
00637     nodes );
00638 
00639   va_end( nodes );
00640 
00641   if ( xpath_str_len > 0 )
00642   {
00643 #ifdef DEBUG
00644     printf("sasa_c_get_number (level %d) : xpath input : %s\n",
00645       nodes_count, xpath_str);
00646     fflush(stdout);
00647 #endif
00648     /* get the number with xpath input */
00649     rc=getXmlNodeCount (num_doc, xpath_str, &number);
00650     /* if returned value is EXIT_FOUND or EXIT_NOTFOUND */
00651     if (rc != EXIT_FAILURE)
00652        rc = EXIT_SUCCESS;
00653 
00654     *xml_number=number;
00655 
00656 #ifdef DEBUG
00657     printf("sasa_c_get_number (level %d) : number : %d\n",
00658       nodes_count, *xml_number);
00659     puts("--------------------------------------------------------");
00660 #endif
00661   }
00662   else
00663   {
00664     rc = EXIT_FAILURE;
00665 
00666 #ifdef DEBUG
00667     printf("sasa_c_get_number (level %d) : ERROR : building xpath string\n",
00668       nodes_count );
00669     printf("sasa_c_get_number (level %d) : return code %d\n",
00670       nodes_count, xpath_str_len );
00671     puts("--------------------------------------------------------");
00672 #endif
00673   }
00674 
00675   return (rc);
00676 
00677 } /* sasa_c_get_number */  
00678 
00679 
00680 /*
00681 
00682 //BOP
00683 
00684   !ROUTINE: sasa_c_get_attribute
00685 
00686   !INTERFACE:
00687 
00688   !INPUT PARAMETERS:
00689 
00690    num_doc     = Handle to document tree as returned by sasa_c_read_file()
00691 
00692    parent_nodes_count = Number of nodes in the given XPath *excluding* the
00693                         attribute that we're looking for.
00694 
00695    ...         = The XPath, expressed as a variable length list of triplets
00696                  describing each node in the path.  The triplets take the form: 
00697 
00698                  char *nodeName, int nodeNameLen, int nodeNum
00699 
00700                  E.g. the arguments:   "prismcomponent", 14, 0,
00701                                        "transient", 9, 5,
00702                                        "local_name", 10, (0)
00703 
00704                  represent the XPath:  //prismcomponent/transient[5]/@local_name
00705 
00706                  Note that the '0' at the end of the "local_name" triplet is
00707                  ignored and can therefore be omitted: XML attributes can't
00708                  have multiple instances.
00709    
00710   !OUTPUT PARAMETERS:
00711 
00712    xml_attribute = The value of the attribute referenced by the XPath,
00713                    expressed as a string.
00714 
00715    xml_attribute_length = The length of the xml_attribute string.
00716 
00717    rc          = Return code
00718                = EXIT_SUCCESS (0) : No error
00719                = EXIT_FAILURE (1) : Error building XPath
00720 
00721   !DESCRIPTION:
00722 
00723    Get the value of the XML attribute specified by the given XPath 
00724    in the given open XML document (e.g. SMIOC, SCC, ...).
00725 
00726   !FILES USED:
00727 
00728          <stdarg.h>
00729          <stdlib.h>
00730          <string.h>
00731          <stdio.h>
00732          "sasa_c_f90.h"
00733          "sasa_c_xml.h"
00734 
00735   !REVISION HISTORY:
00736 
00737     Date      Programmer   Description
00738   ----------  ----------   -----------
00739   14.01.08    I.Henderson  created
00740   22.03.10    JM Epitalon  Simultaneous access to multiple documents
00741 
00742 //EOP
00743 
00744  ----------------------------------------------------------------------
00745   $Id
00746   $Author
00747  ----------------------------------------------------------------------
00748 */
00749 static int sasa_c_get_attribute( char    *xml_attribute,
00750                                  int     *xml_attribute_length,
00751                                  int     num_doc,
00752                                  size_t  parent_nodes_count,
00753                                  ... )
00754 {
00755   va_list nodes;
00756   int     rc=EXIT_SUCCESS;  /* return code */
00757   char    xpath_str[ XPATH_STR_LEN_MAX + 1 ];
00758   int     xpath_str_len;
00759   char    *att=NULL;
00760 
00761   ASSERT( xml_attribute != NULL );
00762   ASSERT( xml_attribute_length != NULL );
00763   ASSERT( parent_nodes_count >= 0 );
00764   
00765   va_start( nodes, parent_nodes_count );
00766 
00767   /* Build the xpath string */
00768   xpath_str_len = sasa_c_build_xpath_str(  
00769     xpath_str,
00770     XPATH_START_DESCENDANT_OF_ROOT_NODE,
00771     XPATH_NODE_TYPE_ATTRIBUTE,
00772     parent_nodes_count,
00773     nodes );
00774 
00775   va_end( nodes );
00776 
00777 
00778 #ifdef DEBUG
00779     printf("sasa_c_get_attribute (level %d) : xpath input : %s\n",
00780       parent_nodes_count, xpath_str); 
00781 #endif
00782 
00783   if ( xpath_str_len > 0 )
00784   {
00785     /* get the attribute with xpath input */
00786     rc = getXmlInfo(num_doc, xpath_str, &att);
00787     if (rc == EXIT_FOUND)
00788       {
00789         (void)strcpy (xml_attribute, (const char*)att );
00790         /* since the string passed to Fortran is blank-terminated,
00791           the Fortran procedure can use the trim_len */
00792         *xml_attribute_length = strlen(xml_attribute);
00793         xml_attribute[strlen (xml_attribute)]=' '; /* the '\0' */
00794         rc = EXIT_SUCCESS;
00795 
00796 #ifdef DEBUG
00797     printf("sasa_c_get_attribute (level %d) : xml_attribute : %s\n",
00798       parent_nodes_count, att);
00799 #endif
00800       }
00801     else if (rc == EXIT_NOTFOUND)
00802       {
00803         int i;
00804         for(i=0;i < 256; i++) *(xml_attribute+i)=' ';
00805         *xml_attribute_length = 0;
00806         rc = EXIT_SUCCESS;
00807 #ifdef DEBUG
00808     printf("sasa_c_get_attribute (level %d) : not found\n",
00809       parent_nodes_count);
00810 #endif
00811       }
00812     if (att != NULL) free ((void*)att); 
00813   }
00814   else
00815   {
00816     rc = EXIT_FAILURE;
00817 
00818 #ifdef DEBUG
00819     printf("sasa_c_get_attribute (level %d) : ERROR : building xpath string\n",
00820       parent_nodes_count );
00821     printf("sasa_c_get_attribute (level %d) : return code %d\n",
00822       parent_nodes_count, xpath_str_len );
00823 #endif
00824   }
00825 
00826 #ifdef DEBUG
00827   puts("--------------------------------------------------------");
00828 #endif
00829 
00830   return (rc);
00831 
00832 } /* sasa_c_get_attribute */  
00833 
00834 
00835 /*
00836 
00837 //BOP
00838 
00839   !ROUTINE: sasa_c_get_element_c
00840 
00841   !INTERFACE:
00842 
00843   !INPUT PARAMETERS:
00844 
00845    num_doc         = Handle to document tree as returned by sasa_c_read_file()
00846 
00847    parent_nodes_count = Number of nodes in the given XPath *excluding* the
00848                         element that we're looking for.
00849                       = or if equal -1, XPath is given litteraly, as a Fortran character tring
00850 
00851    ...         = The XPath
00852                  
00853                  - if parent_nodes_count >= 0, the XPath is expressed as a variable length list
00854                    of triplets describing each node in the path.  The triplets take the form: 
00855 
00856                    char *nodeName, int nodeNameLen, int nodeNum
00857 
00858                    E.g. the arguments:   "prismcomponent", 14, 0,
00859                                          "transient", 9, 5,
00860                                          "transient_standard_name", 23, 0
00861                       represent the XPath: 
00862                       //prismcomponent/transient[5]/transient_standard_name
00863                       
00864                  - if parent_nodes_count == -1, the XPath is expressed as a Fortran character tring
00865    
00866   !OUTPUT PARAMETERS:
00867 
00868    xml_element = The value of the element referenced by the XPath,
00869                  expressed as a character string.
00870 
00871    xml_element_length = The length of the xml_element string.
00872 
00873    rc          = Return code
00874                = EXIT_SUCCESS (0) : No error
00875                = EXIT_FAILURE (1) : Error building XPath
00876 
00877   !DESCRIPTION:
00878 
00879    Get the string value of the XML element specified by the given XPath 
00880    in the given open XML document (e.g. SMIOC, SCC, ...).
00881    Note: sasa_c_get_element_c - c = character string.
00882    
00883    XPath is specified in either of two ways :
00884      - the list of nodes of the XPath
00885      - the character string of the XPath
00886 
00887   !FILES USED:
00888 
00889          <stdarg.h>
00890          <stdlib.h>
00891          <string.h>
00892          <stdio.h>
00893          "sasa_c_f90.h"
00894          "sasa_c_xml.h"
00895 
00896   !REVISION HISTORY:
00897 
00898     Date      Programmer   Description
00899   ----------  ----------   -----------
00900   14.01.08    I.Henderson  created
00901   22.03.10    JM Epitalon  Simultaneous access to multiple documents
00902   30.07.10    JM Epitalon  Add second interface where XPath is given litteraly
00903 //EOP
00904 
00905  ----------------------------------------------------------------------
00906   $Id
00907   $Author
00908  ----------------------------------------------------------------------
00909 */
00910 static int sasa_c_get_element_c( char   *xml_element,
00911                                  int    *xml_element_length,
00912                                  int    num_doc,
00913                                  size_t parent_nodes_count,
00914                                  ... )
00915 {
00916   va_list nodes;
00917   int     rc=EXIT_SUCCESS;  /* return code */
00918   char    xpath_str[ XPATH_STR_LEN_MAX + 1 ];
00919   int     xpath_str_len;
00920   char    *elt=NULL;
00921 
00922   ASSERT( xml_element != NULL );
00923   ASSERT( xml_element_length != NULL );
00924 
00925   va_start( nodes, parent_nodes_count );
00926 
00927   if (parent_nodes_count == (size_t)(-1))
00928   {
00929     /* xpath string is given */
00930     const char *given_xpath = va_arg( nodes, char * ); 
00931     int given_xpath_len = va_arg( nodes, int ); 
00932     
00933     xpath_str_len = (XPATH_STR_LEN_MAX < given_xpath_len) ? XPATH_STR_LEN_MAX : given_xpath_len ;
00934     strncpy (xpath_str, given_xpath, xpath_str_len);
00935     xpath_str[xpath_str_len] = 0;
00936   }
00937   else
00938   {
00939     /* Build the xpath string */
00940     xpath_str_len = sasa_c_build_xpath_str(
00941         xpath_str,
00942         XPATH_START_DESCENDANT_OF_ROOT_NODE,
00943         XPATH_NODE_TYPE_ELEMENT,
00944         parent_nodes_count,
00945         nodes );
00946   }
00947 
00948   va_end( nodes );
00949 
00950   if ( xpath_str_len > 0 )
00951   {
00952 #ifdef DEBUG
00953     printf("sasa_c_get_element_c (level %d) : xpath input : %s\n",
00954       parent_nodes_count, xpath_str);
00955 #endif
00956     /* get the string with xpath input */
00957     rc=getXmlInfo (num_doc, xpath_str, &elt);
00958     if (rc == EXIT_FOUND)
00959       {
00960         int length = 0;
00961         
00962         if (elt != NULL)
00963         {
00964           /* copy all characters except non-printing ones */
00965           char *target = xml_element;
00966           char *source; 
00967           for (source = elt; *source != 0; source += 1)
00968           {
00969             /* Filter out non-printing characters (like new-line) */
00970             if (*source >= 0x20 && *source < 0x7F)
00971             {
00972                 *target++ = *source;
00973                 length += 1;
00974             }
00975           }
00976         }
00977         else
00978         {
00979           length = 0;
00980         }
00981 #ifdef DEBUG
00982         xml_element[length] = 0;
00983         printf("sasa_c_get_element_c (level %d) : xml_element : %s\n",
00984            parent_nodes_count, xml_element);
00985 #endif
00986         *xml_element_length = length;
00987         xml_element[length]=' '; /* the '\0' */
00988         rc = EXIT_SUCCESS;
00989       }
00990     else if (rc == EXIT_NOTFOUND)
00991       {
00992 #ifdef DEBUG
00993         printf("sasa_c_get_element_c (level %d) : element NOT found\n",
00994            parent_nodes_count);
00995 #endif
00996         xml_element[0] = ' ';
00997         *xml_element_length = 0;
00998         rc = EXIT_SUCCESS;
00999       }
01000     if (elt != NULL) free ((void*)elt); 
01001 #ifdef DEBUG
01002     puts("--------------------------------------------------------");
01003 #endif
01004 
01005   }
01006   else
01007   {
01008     rc = EXIT_FAILURE;
01009 
01010 #ifdef DEBUG
01011     printf("sasa_c_get_element_c (level %d) : ERROR : building xpath string\n",
01012       parent_nodes_count );
01013     printf("sasa_c_get_element_c (level %d) : return code %d\n",
01014       parent_nodes_count, xpath_str_len );
01015     puts("--------------------------------------------------------");
01016 #endif
01017   }
01018 
01019   return (rc);
01020 
01021 } /* sasa_c_get_element_c */  
01022 
01023 
01024 /*
01025 
01026 //BOP
01027 
01028   !ROUTINE: sasa_c_get_element_i
01029 
01030   !INTERFACE:
01031 
01032   !INPUT PARAMETERS:
01033 
01034    num_doc         = Handle to document tree as returned by sasa_c_read_file()
01035 
01036    parent_nodes_count = Number of nodes in the given XPath *excluding* the
01037                         element that we're looking for.
01038 
01039    parent_nodes_count = Number of nodes in the given XPath *excluding* the
01040                         element that we're looking for.
01041                       = or if equal -1, XPath is given litteraly, as a Fortran character tring
01042 
01043    ...         = The XPath
01044                  
01045                  - if parent_nodes_count >= 0, the XPath is expressed as a variable length list
01046                    of triplets describing each node in the path.  The triplets take the form: 
01047 
01048                    char *nodeName, int nodeNameLen, int nodeNum
01049 
01050                    E.g. the arguments:   "prismcomponent", 14, 0,
01051                                          "transient", 9, 5,
01052                                          "transient_standard_name", 23, 0
01053                       represent the XPath: 
01054                       //prismcomponent/transient[5]/transient_standard_name
01055                       
01056                  - if parent_nodes_count == -1, the XPath is expressed as a Fortran character tring
01057    
01058   !OUTPUT PARAMETERS:
01059 
01060    xml_element = The value of the element referenced by the XPath,
01061                  expressed as an integer.
01062 
01063    rc          = Return code
01064                = EXIT_SUCCESS (0) : No error
01065                = EXIT_FAILURE (1) : Error building XPath
01066 
01067   !DESCRIPTION:
01068 
01069    Get the integer value of the XML element specified by the given XPath 
01070    in the given open XML document (e.g. SMIOC, SCC, ...).
01071    Note: sasa_c_get_element_i - i = integer.
01072 
01073    XPath is specified in either of two ways :
01074      - the list of nodes of the XPath
01075      - the character string of the XPath
01076   
01077   !FILES USED:
01078 
01079          <stdarg.h>
01080          <stdlib.h>
01081          <stdio.h>
01082          "sasa_c_f90.h"
01083          "sasa_c_xml.h"
01084 
01085   !REVISION HISTORY:
01086 
01087     Date      Programmer   Description
01088   ----------  ----------   -----------
01089   14.01.08    I.Henderson  created
01090   22.03.10    JM Epitalon  Simultaneous access to multiple documents
01091   30.07.10    JM Epitalon  Add second interface where XPath is given litteraly
01092 
01093 //EOP
01094 
01095  ----------------------------------------------------------------------
01096   $Id
01097   $Author
01098  ----------------------------------------------------------------------
01099 */
01100 static int sasa_c_get_element_i( int    *xml_element,
01101                                  int    num_doc,
01102                                  size_t parent_nodes_count,
01103                                  ... )
01104 {
01105   va_list nodes;
01106   int     rc=EXIT_SUCCESS;  /* return code */
01107   char    xpath_str[ XPATH_STR_LEN_MAX + 1 ];
01108   int     xpath_str_len;
01109   char    *elt=NULL;
01110   
01111   ASSERT( xml_element != NULL );
01112 
01113   va_start( nodes, parent_nodes_count );
01114 
01115   if (parent_nodes_count == (size_t)(-1))
01116   {
01117     /* xpath string is given */
01118     const char *given_xpath = va_arg( nodes, char * ); 
01119     int given_xpath_len = va_arg( nodes, int ); 
01120     
01121     xpath_str_len = (XPATH_STR_LEN_MAX < given_xpath_len) ? XPATH_STR_LEN_MAX : given_xpath_len ;
01122     strncpy (xpath_str, given_xpath, xpath_str_len);
01123     xpath_str[xpath_str_len] = 0;
01124   }
01125   else
01126   {
01127     /* Build the xpath string */
01128     xpath_str_len = sasa_c_build_xpath_str(
01129         xpath_str,
01130         XPATH_START_DESCENDANT_OF_ROOT_NODE,
01131         XPATH_NODE_TYPE_ELEMENT,
01132         parent_nodes_count,
01133         nodes );
01134   }
01135 
01136   va_end( nodes );
01137 
01138   if ( xpath_str_len > 0 )
01139   {
01140     /* get the integer with xpath input */
01141     rc=getXmlInfo (num_doc, xpath_str, &elt);
01142     if (rc == EXIT_FOUND) 
01143       {
01144         *xml_element = atoi(elt);
01145         rc = EXIT_SUCCESS;
01146       }
01147     else if (rc == EXIT_NOTFOUND)
01148       {
01149         *xml_element = PSMILE_UNDEF;
01150         rc = EXIT_SUCCESS;
01151       }    
01152     free ((void*)elt); 
01153 
01154 #ifdef DEBUG
01155     printf("sasa_c_get_element_i (level %d) : xpath input : %s\n",
01156       parent_nodes_count, xpath_str);
01157     printf("sasa_c_get_element_i (level %d) : xml_element : %d\n",
01158       parent_nodes_count, *xml_element);
01159     puts("--------------------------------------------------------");
01160 #endif
01161   }
01162   else
01163   {
01164     rc = EXIT_FAILURE;
01165 
01166 #ifdef DEBUG
01167     printf("sasa_c_get_element_i (level %d) : ERROR : building xpath string\n",
01168       parent_nodes_count );
01169     printf("sasa_c_get_element_i (level %d) : return code %d\n",
01170       parent_nodes_count, xpath_str_len );
01171     puts("--------------------------------------------------------");
01172 #endif
01173   }
01174 
01175   return (rc);
01176 
01177 } /* sasa_c_get_element_i */  
01178 
01179 
01180 /*
01181 
01182 //BOP
01183 
01184   !ROUTINE: sasa_c_get_element_d
01185 
01186   !INTERFACE:
01187 
01188   !INPUT PARAMETERS:
01189 
01190    num_doc         = Handle to document tree as returned by sasa_c_read_file()
01191 
01192    parent_nodes_count = Number of nodes in the given XPath *excluding* the
01193                         element that we're looking for.
01194 
01195    ...         = The XPath, expressed as a variable length list of triplets
01196                  describing each node in the path.  The triplets take the form: 
01197 
01198                  char *nodeName, int nodeNameLen, int nodeNum
01199 
01200                  E.g. the arguments:   "prismcomponent", 14, 0,
01201                                        "transient", 9, 5
01202                                        "physics", 7, 0,
01203                                        "valid_min", 9, 0
01204                  represent the XPath: 
01205 
01206                    //prismcomponent/transient[5]/physics/valid_min
01207    
01208   !OUTPUT PARAMETERS:
01209 
01210    xml_element = The value of the element referenced by the XPath,
01211                  expressed as a double.
01212 
01213    rc          = Return code
01214                = EXIT_SUCCESS (0) : No error
01215                = EXIT_FAILURE (1) : Error building XPath
01216 
01217   !DESCRIPTION:
01218 
01219    Get the double value of the XML element specified by the given XPath 
01220    in the given open XML document (e.g. SMIOC, SCC, ...).
01221    Note: sasa_c_get_element_d - d = double.
01222 
01223   !FILES USED:
01224 
01225          <stdarg.h>
01226          <stdlib.h>
01227          <stdio.h>
01228          "sasa_c_f90.h"
01229          "sasa_c_xml.h"
01230 
01231   !REVISION HISTORY:
01232 
01233     Date      Programmer   Description
01234   ----------  ----------   -----------
01235   14.01.08    I.Henderson  created
01236   22.03.10    JM Epitalon  Simultaneous access to multiple documents
01237 
01238 //EOP
01239 
01240  ----------------------------------------------------------------------
01241   $Id
01242   $Author
01243  ----------------------------------------------------------------------
01244 */
01245 static int sasa_c_get_element_d( double *xml_element,
01246                                  int    num_doc,
01247                                  size_t parent_nodes_count,
01248                                  ... )
01249 {
01250   va_list nodes;
01251   int     rc=EXIT_SUCCESS;  /* return code */
01252   char    xpath_str[ XPATH_STR_LEN_MAX + 1 ];
01253   int     xpath_str_len;
01254   char    *elt=NULL;
01255 
01256   ASSERT( xml_element != NULL );
01257   ASSERT( parent_nodes_count >= 0 );
01258 
01259   va_start( nodes, parent_nodes_count );
01260 
01261   /* Build the xpath string */
01262   xpath_str_len = sasa_c_build_xpath_str(  
01263     xpath_str,
01264     XPATH_START_DESCENDANT_OF_ROOT_NODE,
01265     XPATH_NODE_TYPE_ELEMENT,
01266     parent_nodes_count,
01267     nodes );
01268 
01269   va_end( nodes );
01270 
01271   if ( xpath_str_len > 0 )
01272   {
01273     /* get the double with xpath input */
01274     rc=getXmlInfo (num_doc, xpath_str, &elt);
01275     if (rc == EXIT_FOUND) 
01276       {
01277         sscanf(elt,"%lf",xml_element);
01278         rc = EXIT_SUCCESS;
01279       }
01280     else if (rc == EXIT_NOTFOUND)
01281       {
01282         *xml_element = PSMILE_UNDEF;
01283         rc = EXIT_SUCCESS;
01284       }    
01285     free ((void*)elt); 
01286 
01287 #ifdef DEBUG
01288     printf("sasa_c_get_element_d (level %d) : xpath input : %s\n",
01289       parent_nodes_count, xpath_str);
01290     printf("sasa_c_get_element_d (level %d) : xml_element : %lf\n",
01291       parent_nodes_count, *xml_element);
01292     puts("--------------------------------------------------------");
01293 #endif
01294   }
01295   else
01296   {
01297     rc = EXIT_FAILURE;
01298 
01299 #ifdef DEBUG
01300     printf("sasa_c_get_element_d (level %d) : ERROR : building xpath string\n",
01301       parent_nodes_count );
01302     printf("sasa_c_get_element_d (level %d) : return code %d\n",
01303       parent_nodes_count, xpath_str_len );
01304     puts("--------------------------------------------------------");
01305 #endif
01306   }
01307 
01308   return (rc);
01309 
01310 } /* sasa_c_get_element_d */  
01311 
01312 
01313 /*
01314 
01315 //BOP
01316 
01317   !ROUTINE: sasa_c_build_xpath_str
01318 
01319   !INTERFACE:
01320 
01321   !INPUT PARAMETERS:
01322 
01323    xpath_start_type = A constant indicating how the XPath string should start
01324                       e.g. "//" - see XPathStartType enum for options.
01325 
01326    xpath_target_node_type = A constant indicating the type of the "target" node
01327                             referenced by the XPath (i.e. whether it's an
01328                             attribute or element).
01329 
01330    parent_nodes_count = Number of nodes in the given XPath *excluding* the
01331                         node (attribute or element) that we're looking for.
01332 
01333    xpath_nodes = The XPath, expressed as a variable length list of triplets
01334                  describing each node in the path.  The triplets take the form: 
01335 
01336                  char *nodeName, int nodeNameLen, int nodeNum
01337 
01338                  E.g. the arguments:   "prismcomponent", 14, 0,
01339                                        "transient", 9, 5
01340                                        "intent", 6, 0
01341 
01342                  represent the XPath: //prismcomponent/transient[5]/intent
01343    
01344   !OUTPUT PARAMETERS:
01345 
01346    xpath_str = The XPath, expressed as a character string. It is the caller's
01347                responsibility to ensure that this buffer is big enough to hold
01348                the XPath string.
01349 
01350                Note: sasa_c_build_xpath_str uses the C standard library 
01351                function sprintf().  To make sasa_c_build_xpath_str safe from
01352                the risk of buffer overflows, snprintf() could be used instead.
01353                snprintf() was part of the recent C99 standard and therefore
01354                may not be available on all platforms where OASIS is built. 
01355                This, combined with the fact that XPaths are not
01356                user-specified, makes me think that sprintf() is acceptable
01357                providing a large buffer is used. 
01358 
01359    return value = The length of the xpath_str or -1 if an error occurred.
01360 
01361   !DESCRIPTION:
01362 
01363    Builds a character string representation of the given XPath.
01364    Add prefix "default:" to all XML elements included in the XPath
01365 
01366   !FILES USED:
01367 
01368          <stdarg.h>
01369          <string.h>
01370          <stdio.h>
01371          "sasa_c_f90.h"
01372 
01373   !REVISION HISTORY:
01374 
01375     Date      Programmer   Description
01376   ----------  ----------   -----------
01377   14.01.08    I.Henderson  created
01378 
01379 //EOP
01380 
01381  ----------------------------------------------------------------------
01382   $Id
01383   $Author
01384  ----------------------------------------------------------------------
01385 */
01386 static int sasa_c_build_xpath_str( char           *xpath_str,
01387                                    XPathStartType xpath_start_type,
01388                                    XPathNodeType  xpath_target_node_type,
01389                                    size_t         parent_nodes_count,
01390                                    va_list        xpath_nodes )
01391 {
01392   size_t elements_loop;
01393   int    xpath_str_len, chars_count;
01394   char   format_str[ 32 ];
01395 
01396   ASSERT( xpath_str != NULL );
01397   ASSERT( xpath_start_type >= XPATH_START_FIRST
01398        && xpath_start_type <= XPATH_START_LAST );
01399   ASSERT( xpath_target_node_type >= XPATH_NODE_TYPE_FIRST
01400        && xpath_target_node_type <= XPATH_NODE_TYPE_LAST );
01401   ASSERT( parent_nodes_count >= 0 );
01402 
01403 
01404   /* Start the XPath string appropriately */
01405   switch ( xpath_start_type )
01406   {
01407     case XPATH_START_CHILD_OF_ROOT_NODE:
01408     {
01409       strcpy( xpath_str, "/" );
01410     }
01411     break;
01412     case XPATH_START_DESCENDANT_OF_ROOT_NODE:
01413     {
01414       strcpy( xpath_str, "//" );
01415     }
01416     break;
01417     case XPATH_START_CHILD_OF_CURRENT_NODE:
01418     {
01419       xpath_str[ 0 ] = '\0';
01420     }
01421     break;
01422     default:
01423     {
01424       ASSERT( 0 );
01425     }
01426     break;
01427   }
01428   xpath_str_len = chars_count = strlen( xpath_str );
01429 
01430 
01431   /* Add successive parent elements to the XPath string */
01432   elements_loop = 0;
01433   while ( elements_loop < parent_nodes_count && chars_count != -1 )
01434   {
01435     const char *element_name = va_arg( xpath_nodes, char * ); 
01436     int element_name_len = va_arg( xpath_nodes, int ); 
01437     int element_count = va_arg( xpath_nodes, int ); 
01438 
01439     /* Since Fortran strings aren't null-terminated, we must copy an exact
01440     number of chars from element_name (given by element_name_len) to the
01441     xpath input string - e.g. we must use %.9s instead of %s for "transient". */
01442     if ( element_count == 0 )
01443     {
01444       sprintf( format_str, "%%.%ds/", element_name_len );
01445       chars_count = sprintf( xpath_str + xpath_str_len, format_str,
01446                              element_name );
01447     }
01448     else
01449     {
01450       sprintf( format_str, "%%.%ds[%%d]/", element_name_len );
01451       chars_count = sprintf( xpath_str + xpath_str_len, format_str,
01452                              element_name, element_count );
01453     }
01454 
01455     xpath_str_len += chars_count;
01456     elements_loop++;
01457   }
01458 
01459 
01460   /* Finally, add the element or attribute we want to the end of the xpath */
01461   if ( chars_count != -1 )
01462   {
01463     switch ( xpath_target_node_type )
01464     {
01465       case XPATH_NODE_TYPE_ATTRIBUTE:
01466       {
01467         const char *attribute_name = va_arg( xpath_nodes, char * ); 
01468         int attribute_name_len = va_arg( xpath_nodes, int ); 
01469         /* Ignore the last value in the node triplet (if any) -
01470         there can only be one instance of an attribute. */
01471 
01472         sprintf( format_str, "@%%.%ds", attribute_name_len );
01473         chars_count = sprintf( xpath_str + xpath_str_len, format_str,
01474                               attribute_name );
01475       }
01476       break;
01477       case XPATH_NODE_TYPE_ELEMENT:
01478       {
01479         const char *element_name = va_arg( xpath_nodes, char * ); 
01480         int element_name_len = va_arg( xpath_nodes, int ); 
01481         int element_count = va_arg( xpath_nodes, int ); 
01482 
01483         if ( element_count == 0 )
01484         {
01485           sprintf( format_str, "%%.%ds", element_name_len );
01486           chars_count = sprintf( xpath_str + xpath_str_len, format_str,
01487                                 element_name );
01488         }
01489         else
01490         {
01491           sprintf( format_str, "%%.%ds[%%d]", element_name_len );
01492           chars_count = sprintf( xpath_str + xpath_str_len, format_str,
01493                                 element_name, element_count );
01494         }
01495       }
01496       break;
01497       default:
01498       {
01499         ASSERT( 0 );
01500       }
01501       break;
01502     }
01503 
01504     xpath_str_len += chars_count;
01505   }
01506 
01507   return ( chars_count != -1 ? xpath_str_len : chars_count );
01508 
01509 } /* sasa_c_build_xpath_str */
01510 
01511 
01512 /* - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = */
01513 
01514 /*
01515 
01516 //BOP
01517 
01518   !ROUTINE: sasa_c_close
01519 
01520   !DESCRIPTION:
01521 
01522    Close an XML file and free memory form its content (the XML tree).
01523 
01524   !INPUT PARAMETERS:
01525   
01526    num_doc  =  handle to XML document tree of open file (positive integer)
01527 
01528   !OUTPUT PARAMETERS:
01529 
01530    returned    = handle to XML document tree of open file (positive integer)
01531 
01532   !FILES USED:
01533 
01534   !REVISION HISTORY:
01535 
01536     Date      Programmer   Description
01537   ----------  ----------   -----------
01538   ??.??.??    P. Bourcier  Creation
01539   22.03.10    JM Epitalon  Simultaneous access to multiple documents
01540 
01541 //EOP
01542 
01543  ----------------------------------------------------------------------
01544   $Id
01545   $Author
01546  ----------------------------------------------------------------------
01547 */
01548 int
01549 sasa_c_close  (int *num_doc)
01550 {
01551 
01552   return (sasaCloseXml (*num_doc));
01553 
01554 }
01555 
01556 
01557 /* - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = */
01558 /*                      Fortran interface                      */
01559 /* - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = */
01560 
01561 int sasa_c_convert_char2int  (char *charcode, int len_charcode) 
01562 {
01563   int result;
01564   char *name;
01565 
01566   name = (char *) calloc(len_charcode+1, sizeof(char));
01567   strncpy(name,charcode,len_charcode);
01568 
01569   result = __sasa_c_convert_char2int  (name, len_charcode);
01570 
01571   free(name);
01572 
01573   return(result);
01574 }
01575 
01576 /* - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = */
01577 
01578 int sasa_c_get_number_1st_level ( int  *num_doc,
01579                   char *firstlevel, 
01580                   int  *xml_number,
01581                   int  len_firstlevel)
01582 {
01583   int result;
01584 
01585   result = sasa_c_get_number(
01586     xml_number, *num_doc, 1,
01587     firstlevel, len_firstlevel, 0 );
01588 
01589   return(result);
01590 }
01591 
01592 
01593 int sasa_c_get_number_2nd_level  (int  *num_doc,
01594                   char *firstlevel, 
01595                   int  *firstno, 
01596                   char *secondlevel,
01597                   int  *xml_number, 
01598                   int  len_firstlevel,
01599                   int  len_secondlevel)
01600 {
01601   int result;
01602 
01603   result = sasa_c_get_number(
01604     xml_number, *num_doc, 2,
01605     firstlevel,  len_firstlevel,  *firstno,
01606     secondlevel, len_secondlevel, 0 );
01607 
01608   return(result);
01609 }
01610 
01611 
01612 int sasa_c_get_number_3rd_level  (int  *num_doc,
01613                   char *firstlevel, 
01614                   int  *firstno, 
01615                   char *secondlevel,
01616                   int  *secondno, 
01617                   char *thirdlevel,
01618                   int  *xml_number, 
01619                   int  len_firstlevel,
01620                   int  len_secondlevel,
01621                   int  len_thirdlevel)
01622 {
01623   int result;
01624 
01625   result = sasa_c_get_number(
01626     xml_number, *num_doc, 3,
01627     firstlevel,  len_firstlevel,  *firstno,
01628     secondlevel, len_secondlevel, *secondno,
01629     thirdlevel,  len_thirdlevel,  0 );
01630 
01631   return(result);
01632 }
01633 
01634 
01635 int sasa_c_get_number_4th_level  (int  *num_doc,
01636                   char *firstlevel, 
01637                   int  *firstno, 
01638                   char *secondlevel, 
01639                   int  *secondno, 
01640                   char *thirdlevel, 
01641                   int  *thirdno, 
01642                   char *fourthlevel, 
01643                   int  *xml_number,
01644                   int  len_firstlevel,
01645                   int  len_secondlevel,
01646                   int  len_thirdlevel,
01647                   int  len_fourthlevel)
01648 {
01649   int result;
01650 
01651   result = sasa_c_get_number(
01652     xml_number, *num_doc, 4,
01653     firstlevel,  len_firstlevel,  *firstno,
01654     secondlevel, len_secondlevel, *secondno,
01655     thirdlevel,  len_thirdlevel,  *thirdno,
01656     fourthlevel, len_fourthlevel, 0 );
01657 
01658   return(result);
01659 }
01660 
01661 
01662 int sasa_c_get_number_5th_level  (int  *num_doc,
01663                   char *firstlevel, 
01664                   int  *firstno, 
01665                   char *secondlevel, 
01666                   int  *secondno, 
01667                   char *thirdlevel, 
01668                   int  *thirdno, 
01669                   char *fourthlevel, 
01670                   int  *fourthno, 
01671                   char *fifthlevel, 
01672                   int  *xml_number,
01673                   int  len_firstlevel,
01674                   int  len_secondlevel,
01675                   int  len_thirdlevel,
01676                   int  len_fourthlevel,
01677                   int  len_fifthlevel)
01678 {
01679   int result;
01680 
01681   result = sasa_c_get_number(
01682     xml_number, *num_doc, 5,
01683     firstlevel,  len_firstlevel,  *firstno,
01684     secondlevel, len_secondlevel, *secondno,
01685     thirdlevel,  len_thirdlevel,  *thirdno,
01686     fourthlevel, len_fourthlevel, *fourthno,
01687     fifthlevel,  len_fifthlevel,  0 );
01688 
01689   return(result);
01690 }
01691 
01692 
01693 int sasa_c_get_number_6th_level  (int  *num_doc,
01694                   char *firstlevel, 
01695                   int  *firstno, 
01696                   char *secondlevel, 
01697                   int  *secondno, 
01698                   char *thirdlevel, 
01699                   int  *thirdno, 
01700                   char *fourthlevel, 
01701                   int  *fourthno, 
01702                   char *fifthlevel, 
01703                   int  *fifthno, 
01704                   char *sixthlevel, 
01705                   int  *xml_number,
01706                   int  len_firstlevel,
01707                   int  len_secondlevel,
01708                   int  len_thirdlevel,
01709                   int  len_fourthlevel,
01710                   int  len_fifthlevel,
01711                   int  len_sixthlevel)
01712 {
01713   int result;
01714 
01715   result = sasa_c_get_number(
01716     xml_number, *num_doc, 6,
01717     firstlevel,  len_firstlevel,  *firstno,
01718     secondlevel, len_secondlevel, *secondno,
01719     thirdlevel,  len_thirdlevel,  *thirdno,
01720     fourthlevel, len_fourthlevel, *fourthno,
01721     fifthlevel,  len_fifthlevel,  *fifthno,
01722     sixthlevel,  len_sixthlevel,  0 );
01723 
01724   return(result);
01725 }
01726 
01727 
01728 int sasa_c_get_number_7th_level  (int  *num_doc,
01729                   char *firstlevel, 
01730                   int  *firstno, 
01731                   char *secondlevel, 
01732                   int  *secondno, 
01733                   char *thirdlevel, 
01734                   int  *thirdno, 
01735                   char *fourthlevel, 
01736                   int  *fourthno, 
01737                   char *fifthlevel, 
01738                   int  *fifthno, 
01739                   char *sixthlevel, 
01740                   int  *sixthno, 
01741                   char *seventhlevel, 
01742                   int  *xml_number,
01743                   int  len_firstlevel,
01744                   int  len_secondlevel,
01745                   int  len_thirdlevel,
01746                   int  len_fourthlevel,
01747                   int  len_fifthlevel,
01748                   int  len_sixthlevel,
01749                   int  len_seventhlevel)
01750 {
01751   int result;
01752 
01753   result = sasa_c_get_number(
01754     xml_number,   *num_doc,  7,
01755     firstlevel,   len_firstlevel,   *firstno,
01756     secondlevel,  len_secondlevel,  *secondno,
01757     thirdlevel,   len_thirdlevel,   *thirdno,
01758     fourthlevel,  len_fourthlevel,  *fourthno,
01759     fifthlevel,   len_fifthlevel,   *fifthno,
01760     sixthlevel,   len_sixthlevel,   *sixthno,
01761     seventhlevel, len_seventhlevel, 0 );
01762 
01763   return(result);
01764 }
01765 
01766 
01767 int sasa_c_get_number_8th_level  (int  *num_doc,
01768                   char *firstlevel, 
01769                   int  *firstno, 
01770                   char *secondlevel, 
01771                   int  *secondno, 
01772                   char *thirdlevel, 
01773                   int  *thirdno, 
01774                   char *fourthlevel, 
01775                   int  *fourthno, 
01776                   char *fifthlevel, 
01777                   int  *fifthno, 
01778                   char *sixthlevel, 
01779                   int  *sixthno, 
01780                   char *seventhlevel, 
01781                   int  *seventhno, 
01782                   char *eighthlevel, 
01783                   int  *xml_number,
01784                   int  len_firstlevel,
01785                   int  len_secondlevel,
01786                   int  len_thirdlevel,
01787                   int  len_fourthlevel,
01788                   int  len_fifthlevel,
01789                   int  len_sixthlevel,
01790                   int  len_seventhlevel,
01791                   int  len_eighthlevel)
01792 {
01793   int result;
01794 
01795   result = sasa_c_get_number(
01796     xml_number,   *num_doc,  8,
01797     firstlevel,   len_firstlevel,   *firstno,
01798     secondlevel,  len_secondlevel,  *secondno,
01799     thirdlevel,   len_thirdlevel,   *thirdno,
01800     fourthlevel,  len_fourthlevel,  *fourthno,
01801     fifthlevel,   len_fifthlevel,   *fifthno,
01802     sixthlevel,   len_sixthlevel,   *sixthno,
01803     seventhlevel, len_seventhlevel, *seventhno,
01804     eighthlevel,  len_eighthlevel,  0 );
01805 
01806   return(result);
01807 }
01808 
01809 
01810 int sasa_c_get_number_9th_level  (int  *num_doc,
01811                   char *firstlevel, 
01812                   int  *firstno, 
01813                   char *secondlevel, 
01814                   int  *secondno, 
01815                   char *thirdlevel, 
01816                   int  *thirdno, 
01817                   char *fourthlevel, 
01818                   int  *fourthno, 
01819                   char *fifthlevel, 
01820                   int  *fifthno, 
01821                   char *sixthlevel, 
01822                   int  *sixthno, 
01823                   char *seventhlevel, 
01824                   int  *seventhno, 
01825                   char *eighthlevel, 
01826                   int  *eighthno, 
01827                   char *ninthlevel, 
01828                   int  *xml_number,
01829                   int  len_firstlevel,
01830                   int  len_secondlevel,
01831                   int  len_thirdlevel,
01832                   int  len_fourthlevel,
01833                   int  len_fifthlevel,
01834                   int  len_sixthlevel,
01835                   int  len_seventhlevel,
01836                   int  len_eighthlevel,
01837                   int  len_ninthlevel)
01838 {
01839   int result;
01840 
01841   result = sasa_c_get_number(
01842     xml_number,   *num_doc,  9,
01843     firstlevel,   len_firstlevel,   *firstno,
01844     secondlevel,  len_secondlevel,  *secondno,
01845     thirdlevel,   len_thirdlevel,   *thirdno,
01846     fourthlevel,  len_fourthlevel,  *fourthno,
01847     fifthlevel,   len_fifthlevel,   *fifthno,
01848     sixthlevel,   len_sixthlevel,   *sixthno,
01849     seventhlevel, len_seventhlevel, *seventhno,
01850     eighthlevel,  len_eighthlevel,  *eighthno,
01851     ninthlevel,   len_ninthlevel,   0 );
01852 
01853   return(result);
01854 }
01855 
01856 int sasa_c_get_number_10th_level (int  *num_doc,
01857                   char *firstlevel, 
01858                   int  *firstno, 
01859                   char *secondlevel, 
01860                   int  *secondno, 
01861                   char *thirdlevel, 
01862                   int  *thirdno, 
01863                   char *fourthlevel, 
01864                   int  *fourthno, 
01865                   char *fifthlevel, 
01866                   int  *fifthno, 
01867                   char *sixthlevel, 
01868                   int  *sixthno, 
01869                   char *seventhlevel, 
01870                   int  *seventhno, 
01871                   char *eighthlevel, 
01872                   int  *eighthno, 
01873                   char *ninthlevel,
01874                   int  *ninthno, 
01875                   char *tenthlevel, 
01876                   int  *xml_number,
01877                   int  len_firstlevel,
01878                   int  len_secondlevel,
01879                   int  len_thirdlevel,
01880                   int  len_fourthlevel,
01881                   int  len_fifthlevel,
01882                   int  len_sixthlevel,
01883                   int  len_seventhlevel,
01884                   int  len_eighthlevel,
01885                   int  len_ninthlevel,
01886                   int  len_tenthlevel)
01887 {
01888   int result;
01889 
01890   result = sasa_c_get_number(
01891     xml_number,   *num_doc,  10,
01892     firstlevel,   len_firstlevel,   *firstno,
01893     secondlevel,  len_secondlevel,  *secondno,
01894     thirdlevel,   len_thirdlevel,   *thirdno,
01895     fourthlevel,  len_fourthlevel,  *fourthno,
01896     fifthlevel,   len_fifthlevel,   *fifthno,
01897     sixthlevel,   len_sixthlevel,   *sixthno,
01898     seventhlevel, len_seventhlevel, *seventhno,
01899     eighthlevel,  len_eighthlevel,  *eighthno,
01900     ninthlevel,   len_ninthlevel,   *ninthno,
01901     tenthlevel,   len_tenthlevel,   0 );
01902 
01903   return(result);
01904 }
01905 
01906 int sasa_c_get_number_11th_level (int  *num_doc,
01907                   char *firstlevel, 
01908                   int  *firstno, 
01909                   char *secondlevel, 
01910                   int  *secondno, 
01911                   char *thirdlevel, 
01912                   int  *thirdno, 
01913                   char *fourthlevel, 
01914                   int  *fourthno, 
01915                   char *fifthlevel, 
01916                   int  *fifthno, 
01917                   char *sixthlevel, 
01918                   int  *sixthno, 
01919                   char *seventhlevel, 
01920                   int  *seventhno, 
01921                   char *eighthlevel, 
01922                   int  *eighthno, 
01923                   char *ninthlevel,
01924                   int  *ninthno, 
01925                   char *tenthlevel,
01926                   int  *tenthno, 
01927                   char *elethlevel, 
01928                   int  *xml_number,
01929                   int  len_firstlevel,
01930                   int  len_secondlevel,
01931                   int  len_thirdlevel,
01932                   int  len_fourthlevel,
01933                   int  len_fifthlevel,
01934                   int  len_sixthlevel,
01935                   int  len_seventhlevel,
01936                   int  len_eighthlevel,
01937                   int  len_ninthlevel,
01938                   int  len_tenthlevel,
01939                   int  len_elethlevel )
01940 {
01941   int result;
01942 
01943   result = sasa_c_get_number(
01944     xml_number,   *num_doc,  11,
01945     firstlevel,   len_firstlevel,   *firstno,
01946     secondlevel,  len_secondlevel,  *secondno,
01947     thirdlevel,   len_thirdlevel,   *thirdno,
01948     fourthlevel,  len_fourthlevel,  *fourthno,
01949     fifthlevel,   len_fifthlevel,   *fifthno,
01950     sixthlevel,   len_sixthlevel,   *sixthno,
01951     seventhlevel, len_seventhlevel, *seventhno,
01952     eighthlevel,  len_eighthlevel,  *eighthno,
01953     ninthlevel,   len_ninthlevel,   *ninthno,
01954     tenthlevel,   len_tenthlevel,   *tenthno,
01955     elethlevel,   len_elethlevel,   0 );
01956 
01957   return(result);
01958 }
01959 
01960 /* - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = */
01961 
01962 int sasa_c_get_attri_1st_level  (int  *num_doc,
01963                  char *firstlevel, 
01964                  int  *firstno, 
01965                  char *attribute,
01966                  char *xml_attribute,
01967                  int  *xml_attribute_length,
01968                  int  len_firstlevel,
01969                  int  len_attribute,
01970                  int  len_xml_attribute)
01971 {
01972   int result;
01973 
01974   result = sasa_c_get_attribute(
01975     xml_attribute, xml_attribute_length, *num_doc, 1,
01976     firstlevel,    len_firstlevel,       *firstno,
01977     attribute,     len_attribute );
01978 
01979   return(result);
01980 }
01981 
01982 
01983 int sasa_c_get_attri_2nd_level  (int  *num_doc,
01984                  char *firstlevel, 
01985                  int  *firstno, 
01986                  char *secondlevel, 
01987                  int  *secondno, 
01988                  char *attribute,
01989                  char *xml_attribute,
01990                  int  *xml_attribute_length,
01991                  int  len_firstlevel,
01992                  int  len_secondlevel,
01993                  int  len_attribute,
01994                  int  len_xml_attribute)
01995 {
01996   int result;
01997 
01998   result = sasa_c_get_attribute(
01999     xml_attribute, xml_attribute_length, *num_doc, 2,
02000     firstlevel,    len_firstlevel,       *firstno,
02001     secondlevel,   len_secondlevel,      *secondno,
02002     attribute,     len_attribute );
02003 
02004   return(result);
02005 }
02006 
02007 
02008 int sasa_c_get_attri_3rd_level  (int  *num_doc,
02009                  char *firstlevel, 
02010                  int  *firstno, 
02011                  char *secondlevel, 
02012                  int  *secondno, 
02013                  char *thirdlevel, 
02014                  int  *thirdno, 
02015                  char *attribute,
02016                  char *xml_attribute,
02017                  int  *xml_attribute_length,
02018                  int  len_firstlevel,
02019                  int  len_secondlevel,
02020                  int  len_thirdlevel,
02021                  int  len_attribute,
02022                  int  len_xml_attribute)
02023 {
02024   int result;
02025 
02026   result = sasa_c_get_attribute(
02027     xml_attribute, xml_attribute_length, *num_doc, 3,
02028     firstlevel,    len_firstlevel,       *firstno,
02029     secondlevel,   len_secondlevel,      *secondno,
02030     thirdlevel,    len_thirdlevel,       *thirdno,
02031     attribute,     len_attribute );
02032 
02033   return(result);
02034 }
02035 
02036 
02037 int sasa_c_get_attri_4th_level  (int  *num_doc,
02038                  char *firstlevel, 
02039                  int  *firstno, 
02040                  char *secondlevel, 
02041                  int  *secondno, 
02042                  char *thirdlevel, 
02043                  int  *thirdno, 
02044                  char *fourthlevel, 
02045                  int  *fourthno, 
02046                  char *attribute,
02047                  char *xml_attribute,
02048                  int  *xml_attribute_length,
02049                  int  len_firstlevel,
02050                  int  len_secondlevel,
02051                  int  len_thirdlevel,
02052                  int  len_fourthlevel,
02053                  int  len_attribute,
02054                  int  len_xml_attribute)
02055 {
02056   int result;
02057 
02058   result = sasa_c_get_attribute(
02059     xml_attribute, xml_attribute_length, *num_doc, 4,
02060     firstlevel,    len_firstlevel,       *firstno,
02061     secondlevel,   len_secondlevel,      *secondno,
02062     thirdlevel,    len_thirdlevel,       *thirdno,
02063     fourthlevel,   len_fourthlevel,      *fourthno,
02064     attribute,     len_attribute );
02065 
02066   return(result);
02067 }
02068 
02069 
02070 int sasa_c_get_attri_5th_level  (int  *num_doc,
02071                  char *firstlevel, 
02072                  int  *firstno, 
02073                  char *secondlevel, 
02074                  int  *secondno, 
02075                  char *thirdlevel, 
02076                  int  *thirdno, 
02077                  char *fourthlevel, 
02078                  int  *fourthno, 
02079                  char *fifthlevel, 
02080                  int  *fifthno, 
02081                  char *attribute,
02082                  char *xml_attribute,
02083                  int  *xml_attribute_length,
02084                  int  len_firstlevel,
02085                  int  len_secondlevel,
02086                  int  len_thirdlevel,
02087                  int  len_fourthlevel,
02088                  int  len_fifthlevel,
02089                  int  len_attribute,
02090                  int  len_xml_attribute)
02091 {
02092   int result;
02093 
02094   result = sasa_c_get_attribute(
02095     xml_attribute, xml_attribute_length, *num_doc, 5,
02096     firstlevel,    len_firstlevel,       *firstno,
02097     secondlevel,   len_secondlevel,      *secondno,
02098     thirdlevel,    len_thirdlevel,       *thirdno,
02099     fourthlevel,   len_fourthlevel,      *fourthno,
02100     fifthlevel,    len_fifthlevel,       *fifthno,
02101     attribute,     len_attribute );
02102 
02103   return(result);
02104 }
02105 
02106 
02107 int sasa_c_get_attri_6th_level  (int  *num_doc,
02108                  char *firstlevel, 
02109                  int  *firstno, 
02110                  char *secondlevel, 
02111                  int  *secondno, 
02112                  char *thirdlevel, 
02113                  int  *thirdno, 
02114                  char *fourthlevel, 
02115                  int  *fourthno, 
02116                  char *fifthlevel, 
02117                  int  *fifthno, 
02118                  char *sixthlevel, 
02119                  int  *sixthno, 
02120                  char *attribute, 
02121                  char *xml_attribute,
02122                  int  *xml_attribute_length,
02123                  int  len_firstlevel,
02124                  int  len_secondlevel,
02125                  int  len_thirdlevel,
02126                  int  len_fourthlevel,
02127                  int  len_fifthlevel,
02128                  int  len_sixthlevel,
02129                  int  len_attribute,
02130                  int  len_xml_attribute)
02131 {
02132   int result;
02133 
02134   result = sasa_c_get_attribute(
02135     xml_attribute, xml_attribute_length, *num_doc, 6,
02136     firstlevel,    len_firstlevel,       *firstno,
02137     secondlevel,   len_secondlevel,      *secondno,
02138     thirdlevel,    len_thirdlevel,       *thirdno,
02139     fourthlevel,   len_fourthlevel,      *fourthno,
02140     fifthlevel,    len_fifthlevel,       *fifthno,
02141     sixthlevel,    len_sixthlevel,       *sixthno, 
02142     attribute,     len_attribute );
02143 
02144   return(result);
02145 }
02146 
02147 
02148 int sasa_c_get_attri_8th_level  (int  *num_doc,
02149                  char *firstlevel, 
02150                  int  *firstno, 
02151                  char *secondlevel, 
02152                  int  *secondno, 
02153                  char *thirdlevel, 
02154                  int  *thirdno, 
02155                  char *fourthlevel, 
02156                  int  *fourthno, 
02157                  char *fifthlevel, 
02158                  int  *fifthno, 
02159                  char *sixthlevel, 
02160                  int  *sixthno, 
02161                  char *seventhlevel, 
02162                  int  *seventhno, 
02163                  char *eighthlevel, 
02164                  int  *eighthno, 
02165                  char *attribute, 
02166                  char *xml_attribute,
02167                  int  *xml_attribute_length,
02168                  int  len_firstlevel,
02169                  int  len_secondlevel,
02170                  int  len_thirdlevel,
02171                  int  len_fourthlevel,
02172                  int  len_fifthlevel,
02173                  int  len_sixthlevel,
02174                  int  len_seventhlevel,
02175                  int  len_eighthlevel,
02176                  int  len_attribute,
02177                  int  len_xml_attribute)
02178 {
02179   int result;
02180 
02181   result = sasa_c_get_attribute(
02182     xml_attribute, xml_attribute_length, *num_doc, 8,
02183     firstlevel,    len_firstlevel,       *firstno,
02184     secondlevel,   len_secondlevel,      *secondno,
02185     thirdlevel,    len_thirdlevel,       *thirdno,
02186     fourthlevel,   len_fourthlevel,      *fourthno,
02187     fifthlevel,    len_fifthlevel,       *fifthno,
02188     sixthlevel,    len_sixthlevel,       *sixthno, 
02189     seventhlevel,  len_seventhlevel,     *seventhno, 
02190     eighthlevel,   len_eighthlevel,      *eighthno, 
02191     attribute,     len_attribute );
02192 
02193   return(result);
02194 }
02195 
02196 
02197 int sasa_c_get_attri_10th_level  (int  *num_doc,
02198                  char *firstlevel, 
02199                  int  *firstno, 
02200                  char *secondlevel, 
02201                  int  *secondno, 
02202                  char *thirdlevel, 
02203                  int  *thirdno, 
02204                  char *fourthlevel, 
02205                  int  *fourthno, 
02206                  char *fifthlevel, 
02207                  int  *fifthno, 
02208                  char *sixthlevel, 
02209                  int  *sixthno, 
02210                  char *seventhlevel, 
02211                  int  *seventhno, 
02212                  char *eighthlevel, 
02213                  int  *eighthno, 
02214                  char *ninthlevel, 
02215                  int  *ninthno,
02216                  char *tenthlevel, 
02217                  int  *tenthno,
02218                  char *attribute, 
02219                  char *xml_attribute,
02220                  int  *xml_attribute_length,
02221                  int  len_firstlevel,
02222                  int  len_secondlevel,
02223                  int  len_thirdlevel,
02224                  int  len_fourthlevel,
02225                  int  len_fifthlevel,
02226                  int  len_sixthlevel,
02227                  int  len_seventhlevel,
02228                  int  len_eighthlevel,
02229                  int  len_ninthlevel,
02230                  int  len_tenthlevel,
02231                  int  len_attribute,
02232                  int  len_xml_attribute)
02233 {
02234   int result;
02235 
02236   result = sasa_c_get_attribute(
02237     xml_attribute, xml_attribute_length, *num_doc, 10,
02238     firstlevel,    len_firstlevel,       *firstno,
02239     secondlevel,   len_secondlevel,      *secondno,
02240     thirdlevel,    len_thirdlevel,       *thirdno,
02241     fourthlevel,   len_fourthlevel,      *fourthno,
02242     fifthlevel,    len_fifthlevel,       *fifthno,
02243     sixthlevel,    len_sixthlevel,       *sixthno, 
02244     seventhlevel,  len_seventhlevel,     *seventhno, 
02245     eighthlevel,   len_eighthlevel,      *eighthno, 
02246     ninthlevel,    len_ninthlevel,       *ninthno, 
02247     tenthlevel,    len_tenthlevel,       *tenthno, 
02248     attribute,     len_attribute );
02249 
02250   return(result);
02251 }
02252 
02253 /* - = - = - = - = - = - = - = - = - = - = - = - = - = - = - = */
02254 
02255 int sasa_c_get_element_xpath_c  (int  *num_doc,
02256                  char *xpath, 
02257                  char *xml_element,
02258                  int  *xml_element_length,
02259                  int  len_xpath,
02260                  int  len_xml_element)
02261 {
02262   int result;
02263 
02264   result = sasa_c_get_element_c(
02265     xml_element, xml_element_length, *num_doc, -1,
02266     xpath, len_xpath);
02267 
02268   return(result);
02269 }
02270 
02271 
02272 int sasa_c_get_element_1st_level_c  (int  *num_doc,
02273                      char *firstlevel, 
02274                      int  *firstno, 
02275                      char *element, 
02276                      int  *elementno,
02277                      char *xml_element,
02278                      int  *xml_element_length,
02279                      int  len_firstlevel,
02280                      int  len_element,
02281                      int  len_xml_element)
02282 {
02283   int result;
02284 
02285   result = sasa_c_get_element_c(
02286     xml_element, xml_element_length, *num_doc, 1,
02287     firstlevel,  len_firstlevel,     *firstno, 
02288     element,     len_element,        *elementno );
02289 
02290   return(result);
02291 }
02292 
02293 
02294 int sasa_c_get_element_xpath_i  (int  *num_doc,
02295                  char *xpath, 
02296                  int  *xml_element,
02297                  int  len_xpath)
02298 {
02299   int result;
02300 
02301   result = sasa_c_get_element_i(
02302     xml_element, *num_doc, -1, xpath, len_xpath);
02303 
02304   return(result);
02305 }
02306 
02307 
02308 int sasa_c_get_element_1st_level_i  (int  *num_doc,
02309                      char *firstlevel, 
02310                      int  *firstno, 
02311                      char *element, 
02312                      int  *elementno,
02313                      int  *xml_element,
02314                      int  len_firstlevel,
02315                      int  len_element)
02316 {
02317   int result;
02318 
02319   result = sasa_c_get_element_i(
02320     xml_element, *num_doc, 1,
02321     firstlevel,  len_firstlevel,     *firstno, 
02322     element,     len_element,        *elementno );
02323 
02324   return(result);
02325 }
02326 
02327 
02328 int sasa_c_get_element_1st_level_d  (int  *num_doc,
02329                      char *firstlevel, 
02330                      int  *firstno, 
02331                      char *element, 
02332                      int  *elementno,
02333                      double  *xml_element,
02334                      int  len_firstlevel,
02335                      int  len_element)
02336 {
02337   int result;
02338 
02339   result = sasa_c_get_element_d(
02340     xml_element, *num_doc, 1,
02341     firstlevel,  len_firstlevel,     *firstno, 
02342     element,     len_element,        *elementno );
02343 
02344   return(result);
02345 }
02346 
02347 
02348 int sasa_c_get_element_2nd_level_c  (int  *num_doc,
02349                      char *firstlevel, 
02350                      int  *firstno, 
02351                      char *secondlevel, 
02352                      int  *secondno, 
02353                      char *element, 
02354                      int  *elementno,
02355                      char *xml_element,
02356                      int  *xml_element_length,
02357                      int  len_firstlevel,
02358                      int  len_secondlevel,
02359                      int  len_element,
02360                      int  len_xml_element)
02361 {
02362   int result;
02363 
02364   result = sasa_c_get_element_c(
02365     xml_element, xml_element_length, *num_doc, 2,
02366     firstlevel,  len_firstlevel,     *firstno, 
02367     secondlevel, len_secondlevel,    *secondno, 
02368     element,     len_element,        *elementno );
02369 
02370   return(result);
02371 }
02372 
02373 
02374 int sasa_c_get_element_2nd_level_i  (int  *num_doc,
02375                      char *firstlevel, 
02376                      int  *firstno, 
02377                      char *secondlevel, 
02378                      int  *secondno, 
02379                      char *element, 
02380                      int  *elementno,
02381                      int  *xml_element,
02382                      int  len_firstlevel,
02383                      int  len_secondlevel,
02384                      int  len_element)
02385 {
02386   int result;
02387 
02388   result = sasa_c_get_element_i(
02389     xml_element, *num_doc, 2,
02390     firstlevel,  len_firstlevel,     *firstno, 
02391     secondlevel, len_secondlevel,    *secondno, 
02392     element,     len_element,        *elementno );
02393 
02394   return(result);
02395 }
02396 
02397 
02398 int sasa_c_get_element_2nd_level_d  (int  *num_doc,
02399                      char *firstlevel, 
02400                      int  *firstno, 
02401                      char *secondlevel, 
02402                      int  *secondno, 
02403                      char *element, 
02404                      int  *elementno,
02405                      double  *xml_element,
02406                      int  len_firstlevel,
02407                      int  len_secondlevel,
02408                      int  len_element)
02409 {
02410   int result;
02411 
02412   result = sasa_c_get_element_d(
02413     xml_element, *num_doc, 2,
02414     firstlevel,  len_firstlevel,     *firstno, 
02415     secondlevel, len_secondlevel,    *secondno, 
02416     element,     len_element,        *elementno );
02417 
02418   return(result);
02419 }
02420 
02421 
02422 int sasa_c_get_element_3rd_level_c  (int  *num_doc,
02423                      char *firstlevel, 
02424                      int  *firstno, 
02425                      char *secondlevel, 
02426                      int  *secondno, 
02427                      char *thirdlevel, 
02428                      int  *thirdno, 
02429                      char *element, 
02430                      int  *elementno,
02431                      char *xml_element,
02432                      int  *xml_element_length,
02433                      int  len_firstlevel,
02434                      int  len_secondlevel,
02435                      int  len_thirdlevel,
02436                      int  len_element,
02437                      int  len_xml_element)
02438 {
02439   int result;
02440 
02441   result = sasa_c_get_element_c(
02442     xml_element, xml_element_length, *num_doc, 3,
02443     firstlevel,  len_firstlevel,     *firstno, 
02444     secondlevel, len_secondlevel,    *secondno, 
02445     thirdlevel,  len_thirdlevel,     *thirdno, 
02446     element,     len_element,        *elementno );
02447 
02448   return(result);
02449 }
02450 
02451 
02452 int sasa_c_get_element_3rd_level_i  (int  *num_doc,
02453                      char *firstlevel, 
02454                      int  *firstno, 
02455                      char *secondlevel, 
02456                      int  *secondno, 
02457                      char *thirdlevel, 
02458                      int  *thirdno, 
02459                      char *element, 
02460                      int  *elementno,
02461                      int  *xml_element,
02462                      int  len_firstlevel,
02463                      int  len_secondlevel,
02464                      int  len_thirdlevel,
02465                      int  len_element)
02466 {
02467   int result;
02468 
02469   result = sasa_c_get_element_i(
02470     xml_element, *num_doc, 3,
02471     firstlevel,  len_firstlevel,     *firstno, 
02472     secondlevel, len_secondlevel,    *secondno, 
02473     thirdlevel,  len_thirdlevel,     *thirdno, 
02474     element,     len_element,        *elementno );
02475 
02476   return(result);
02477 }
02478 
02479 
02480 int sasa_c_get_element_3rd_level_d  (int  *num_doc,
02481                      char *firstlevel, 
02482                      int  *firstno, 
02483                      char *secondlevel, 
02484                      int  *secondno, 
02485                      char *thirdlevel, 
02486                      int  *thirdno, 
02487                      char *element, 
02488                      int  *elementno,
02489                      double  *xml_element,
02490                      int  len_firstlevel,
02491                      int  len_secondlevel,
02492                      int  len_thirdlevel,
02493                      int  len_element)
02494 {
02495   int result;
02496 
02497   result = sasa_c_get_element_d(
02498     xml_element, *num_doc, 3,
02499     firstlevel,  len_firstlevel,     *firstno, 
02500     secondlevel, len_secondlevel,    *secondno, 
02501     thirdlevel,  len_thirdlevel,     *thirdno, 
02502     element,     len_element,        *elementno );
02503 
02504   return(result);
02505 }
02506 
02507 
02508 int sasa_c_get_element_4th_level_c  (int  *num_doc,
02509                      char *firstlevel, 
02510                      int  *firstno, 
02511                      char *secondlevel, 
02512                      int  *secondno, 
02513                      char *thirdlevel, 
02514                      int  *thirdno, 
02515                      char *fourthlevel, 
02516                      int  *fourthno, 
02517                      char *element, 
02518                      int  *elementno,
02519                      char *xml_element,
02520                      int  *xml_element_length,
02521                      int  len_firstlevel,
02522                      int  len_secondlevel,
02523                      int  len_thirdlevel,
02524                      int  len_fourthlevel,
02525                      int  len_element,
02526                      int  len_xml_element)
02527 {
02528   int result;
02529 
02530   result = sasa_c_get_element_c(
02531     xml_element, xml_element_length, *num_doc, 4,
02532     firstlevel,  len_firstlevel,     *firstno, 
02533     secondlevel, len_secondlevel,    *secondno, 
02534     thirdlevel,  len_thirdlevel,     *thirdno, 
02535     fourthlevel, len_fourthlevel,    *fourthno, 
02536     element,     len_element,        *elementno );
02537 
02538   return(result);
02539 }
02540 
02541 
02542 int sasa_c_get_element_4th_level_i  (int  *num_doc,
02543                      char *firstlevel, 
02544                      int  *firstno, 
02545                      char *secondlevel, 
02546                      int  *secondno, 
02547                      char *thirdlevel, 
02548                      int  *thirdno, 
02549                      char *fourthlevel, 
02550                      int  *fourthno, 
02551                      char *element, 
02552                      int  *elementno,
02553                      int  *xml_element,
02554                      int  len_firstlevel,
02555                      int  len_secondlevel,
02556                      int  len_thirdlevel,
02557                      int  len_fourthlevel,
02558                      int  len_element)
02559 {
02560   int result;
02561 
02562   result = sasa_c_get_element_i(
02563     xml_element, *num_doc, 4,
02564     firstlevel,  len_firstlevel,     *firstno, 
02565     secondlevel, len_secondlevel,    *secondno, 
02566     thirdlevel,  len_thirdlevel,     *thirdno, 
02567     fourthlevel, len_fourthlevel,    *fourthno, 
02568     element,     len_element,        *elementno );
02569 
02570   return(result);
02571 }
02572 
02573 
02574 int sasa_c_get_element_4th_level_d  (int  *num_doc,
02575                      char *firstlevel, 
02576                      int  *firstno, 
02577                      char *secondlevel, 
02578                      int  *secondno, 
02579                      char *thirdlevel, 
02580                      int  *thirdno, 
02581                      char *fourthlevel, 
02582                      int  *fourthno, 
02583                      char *element, 
02584                      int  *elementno,
02585                      double  *xml_element,
02586                      int  len_firstlevel,
02587                      int  len_secondlevel,
02588                      int  len_thirdlevel,
02589                      int  len_fourthlevel,
02590                      int  len_element)
02591 {
02592   int result;
02593 
02594   result = sasa_c_get_element_d(
02595     xml_element, *num_doc, 4,
02596     firstlevel,  len_firstlevel,     *firstno, 
02597     secondlevel, len_secondlevel,    *secondno, 
02598     thirdlevel,  len_thirdlevel,     *thirdno, 
02599     fourthlevel, len_fourthlevel,    *fourthno, 
02600     element,     len_element,        *elementno );
02601 
02602   return(result);
02603 }
02604 
02605 
02606 int sasa_c_get_element_5th_level_c  (int  *num_doc,
02607                      char *firstlevel, 
02608                      int  *firstno, 
02609                      char *secondlevel, 
02610                      int  *secondno, 
02611                      char *thirdlevel, 
02612                      int  *thirdno, 
02613                      char *fourthlevel, 
02614                      int  *fourthno, 
02615                      char *fifthlevel, 
02616                      int  *fifthno, 
02617                      char *element, 
02618                      int  *elementno,
02619                      char *xml_element,
02620                      int  *xml_element_length,
02621                      int  len_firstlevel,
02622                      int  len_secondlevel,
02623                      int  len_thirdlevel,
02624                      int  len_fourthlevel,
02625                      int  len_fifthlevel,
02626                      int  len_element,
02627                      int  len_xml_element)
02628 {
02629   int result;
02630 
02631   result = sasa_c_get_element_c(
02632     xml_element, xml_element_length, *num_doc, 5,
02633     firstlevel,  len_firstlevel,     *firstno, 
02634     secondlevel, len_secondlevel,    *secondno, 
02635     thirdlevel,  len_thirdlevel,     *thirdno, 
02636     fourthlevel, len_fourthlevel,    *fourthno, 
02637     fifthlevel,  len_fifthlevel,     *fifthno, 
02638     element,     len_element,        *elementno );
02639 
02640   return(result);
02641 }
02642 
02643 
02644 int sasa_c_get_element_5th_level_i  (int  *num_doc,
02645                      char *firstlevel, 
02646                      int  *firstno, 
02647                      char *secondlevel, 
02648                      int  *secondno, 
02649                      char *thirdlevel, 
02650                      int  *thirdno, 
02651                      char *fourthlevel, 
02652                      int  *fourthno, 
02653                      char *fifthlevel, 
02654                      int  *fifthno, 
02655                      char *element, 
02656                      int  *elementno,
02657                      int  *xml_element,
02658                      int  len_firstlevel,
02659                      int  len_secondlevel,
02660                      int  len_thirdlevel,
02661                      int  len_fourthlevel,
02662                      int  len_fifthlevel,
02663                      int  len_element)
02664 {
02665   int result;
02666 
02667   result = sasa_c_get_element_i(
02668     xml_element, *num_doc, 5,
02669     firstlevel,  len_firstlevel,     *firstno, 
02670     secondlevel, len_secondlevel,    *secondno, 
02671     thirdlevel,  len_thirdlevel,     *thirdno, 
02672     fourthlevel, len_fourthlevel,    *fourthno, 
02673     fifthlevel,  len_fifthlevel,     *fifthno, 
02674     element,     len_element,        *elementno );
02675 
02676   return(result);
02677 }
02678 
02679 
02680 int sasa_c_get_element_5th_level_d  (int  *num_doc,
02681                      char *firstlevel, 
02682                      int  *firstno, 
02683                      char *secondlevel, 
02684                      int  *secondno, 
02685                      char *thirdlevel, 
02686                      int  *thirdno, 
02687                      char *fourthlevel, 
02688                      int  *fourthno, 
02689                      char *fifthlevel, 
02690                      int  *fifthno, 
02691                      char *element, 
02692                      int  *elementno,
02693                      double  *xml_element,
02694                      int  len_firstlevel,
02695                      int  len_secondlevel,
02696                      int  len_thirdlevel,
02697                      int  len_fourthlevel,
02698                      int  len_fifthlevel,
02699                      int  len_element)
02700 {
02701   int result;
02702 
02703   result = sasa_c_get_element_d(
02704     xml_element, *num_doc, 5,
02705     firstlevel,  len_firstlevel,     *firstno, 
02706     secondlevel, len_secondlevel,    *secondno, 
02707     thirdlevel,  len_thirdlevel,     *thirdno, 
02708     fourthlevel, len_fourthlevel,    *fourthno, 
02709     fifthlevel,  len_fifthlevel,     *fifthno, 
02710     element,     len_element,        *elementno );
02711 
02712   return(result);
02713 }
02714 
02715 
02716 int sasa_c_get_element_6th_level_c  (int  *num_doc,
02717                      char *firstlevel, 
02718                      int  *firstno, 
02719                      char *secondlevel, 
02720                      int  *secondno, 
02721                      char *thirdlevel, 
02722                      int  *thirdno, 
02723                      char *fourthlevel, 
02724                      int  *fourthno, 
02725                      char *fifthlevel, 
02726                      int  *fifthno, 
02727                      char *sixthlevel, 
02728                      int  *sixthno, 
02729                      char *element, 
02730                      int  *elementno,
02731                      char *xml_element,
02732                      int  *xml_element_length,
02733                      int  len_firstlevel,
02734                      int  len_secondlevel,
02735                      int  len_thirdlevel,
02736                      int  len_fourthlevel,
02737                      int  len_fifthlevel,
02738                      int  len_sixthlevel,
02739                      int  len_element,
02740                      int  len_xml_element)
02741 {
02742   int result;
02743 
02744   result = sasa_c_get_element_c(
02745     xml_element, xml_element_length, *num_doc, 6,
02746     firstlevel,  len_firstlevel,     *firstno, 
02747     secondlevel, len_secondlevel,    *secondno, 
02748     thirdlevel,  len_thirdlevel,     *thirdno, 
02749     fourthlevel, len_fourthlevel,    *fourthno, 
02750     fifthlevel,  len_fifthlevel,     *fifthno, 
02751     sixthlevel,  len_sixthlevel,     *sixthno, 
02752     element,     len_element,        *elementno );
02753 
02754   return(result);
02755 }
02756 
02757 
02758 int sasa_c_get_element_6th_level_i  (int  *num_doc,
02759                      char *firstlevel, 
02760                      int  *firstno, 
02761                      char *secondlevel, 
02762                      int  *secondno, 
02763                      char *thirdlevel, 
02764                      int  *thirdno, 
02765                      char *fourthlevel, 
02766                      int  *fourthno, 
02767                      char *fifthlevel, 
02768                      int  *fifthno, 
02769                      char *sixthlevel, 
02770                      int  *sixthno, 
02771                      char *element, 
02772                      int  *elementno,
02773                      int  *xml_element,
02774                      int  len_firstlevel,
02775                      int  len_secondlevel,
02776                      int  len_thirdlevel,
02777                      int  len_fourthlevel,
02778                      int  len_fifthlevel,
02779                      int  len_sixthlevel,
02780                      int  len_element)
02781 {
02782   int result;
02783 
02784   result = sasa_c_get_element_i(
02785     xml_element, *num_doc, 6,
02786     firstlevel,  len_firstlevel,     *firstno, 
02787     secondlevel, len_secondlevel,    *secondno, 
02788     thirdlevel,  len_thirdlevel,     *thirdno, 
02789     fourthlevel, len_fourthlevel,    *fourthno, 
02790     fifthlevel,  len_fifthlevel,     *fifthno, 
02791     sixthlevel,  len_sixthlevel,     *sixthno, 
02792     element,     len_element,        *elementno );
02793 
02794   return(result);
02795 }
02796 
02797 
02798 int sasa_c_get_element_6th_level_d  (int  *num_doc,
02799                      char *firstlevel, 
02800                      int  *firstno, 
02801                      char *secondlevel, 
02802                      int  *secondno, 
02803                      char *thirdlevel, 
02804                      int  *thirdno, 
02805                      char *fourthlevel, 
02806                      int  *fourthno, 
02807                      char *fifthlevel, 
02808                      int  *fifthno, 
02809                      char *sixthlevel, 
02810                      int  *sixthno, 
02811                      char *element, 
02812                      int  *elementno,
02813                      double  *xml_element,
02814                      int  len_firstlevel,
02815                      int  len_secondlevel,
02816                      int  len_thirdlevel,
02817                      int  len_fourthlevel,
02818                      int  len_fifthlevel,
02819                      int  len_sixthlevel,
02820                      int  len_element)
02821 {
02822   int result;
02823 
02824   result = sasa_c_get_element_d(
02825     xml_element, *num_doc, 6,
02826     firstlevel,  len_firstlevel,     *firstno, 
02827     secondlevel, len_secondlevel,    *secondno, 
02828     thirdlevel,  len_thirdlevel,     *thirdno, 
02829     fourthlevel, len_fourthlevel,    *fourthno, 
02830     fifthlevel,  len_fifthlevel,     *fifthno, 
02831     sixthlevel,  len_sixthlevel,     *sixthno, 
02832     element,     len_element,        *elementno );
02833 
02834   return(result);
02835 }
02836 
02837 
02838 int sasa_c_get_element_7th_level_c  (int  *num_doc,
02839                      char *firstlevel, 
02840                      int  *firstno, 
02841                      char *secondlevel, 
02842                      int  *secondno, 
02843                      char *thirdlevel, 
02844                      int  *thirdno, 
02845                      char *fourthlevel, 
02846                      int  *fourthno, 
02847                      char *fifthlevel, 
02848                      int  *fifthno, 
02849                      char *sixthlevel, 
02850                      int  *sixthno, 
02851                      char *seventhlevel, 
02852                      int  *seventhno, 
02853                      char *element, 
02854                      int  *elementno,
02855                      char *xml_element,
02856                      int  *xml_element_length,
02857                      int  len_firstlevel,
02858                      int  len_secondlevel,
02859                      int  len_thirdlevel,
02860                      int  len_fourthlevel,
02861                      int  len_fifthlevel,
02862                      int  len_sixthlevel,
02863                      int  len_seventhlevel,
02864                      int  len_element,
02865                      int  len_xml_element)
02866 {
02867   int result;
02868 
02869   result = sasa_c_get_element_c(
02870     xml_element,  xml_element_length, *num_doc, 7,
02871     firstlevel,   len_firstlevel,     *firstno, 
02872     secondlevel,  len_secondlevel,    *secondno, 
02873     thirdlevel,   len_thirdlevel,     *thirdno, 
02874     fourthlevel,  len_fourthlevel,    *fourthno, 
02875     fifthlevel,   len_fifthlevel,     *fifthno, 
02876     sixthlevel,   len_sixthlevel,     *sixthno, 
02877     seventhlevel, len_seventhlevel,   *seventhno, 
02878     element,      len_element,        *elementno );
02879 
02880   return(result);
02881 }
02882 
02883 
02884 int sasa_c_get_element_7th_level_i  (int  *num_doc,
02885                      char *firstlevel, 
02886                      int  *firstno, 
02887                      char *secondlevel, 
02888                      int  *secondno, 
02889                      char *thirdlevel, 
02890                      int  *thirdno, 
02891                      char *fourthlevel, 
02892                      int  *fourthno, 
02893                      char *fifthlevel, 
02894                      int  *fifthno, 
02895                      char *sixthlevel, 
02896                      int  *sixthno, 
02897                      char *seventhlevel, 
02898                      int  *seventhno, 
02899                      char *element, 
02900                      int  *elementno,
02901                      int  *xml_element,
02902                      int  len_firstlevel,
02903                      int  len_secondlevel,
02904                      int  len_thirdlevel,
02905                      int  len_fourthlevel,
02906                      int  len_fifthlevel,
02907                      int  len_sixthlevel,
02908                      int  len_seventhlevel,
02909                      int  len_element)
02910 {
02911   int result;
02912 
02913   result = sasa_c_get_element_i(
02914     xml_element,  *num_doc, 7,
02915     firstlevel,   len_firstlevel,     *firstno, 
02916     secondlevel,  len_secondlevel,    *secondno, 
02917     thirdlevel,   len_thirdlevel,     *thirdno, 
02918     fourthlevel,  len_fourthlevel,    *fourthno, 
02919     fifthlevel,   len_fifthlevel,     *fifthno, 
02920     sixthlevel,   len_sixthlevel,     *sixthno, 
02921     seventhlevel, len_seventhlevel,   *seventhno, 
02922     element,      len_element,        *elementno );
02923 
02924   return(result);
02925 }
02926 
02927 int sasa_c_get_element_7th_level_d  (int  *num_doc,
02928                      char *firstlevel, 
02929                      int  *firstno, 
02930                      char *secondlevel, 
02931                      int  *secondno, 
02932                      char *thirdlevel, 
02933                      int  *thirdno, 
02934                      char *fourthlevel, 
02935                      int  *fourthno, 
02936                      char *fifthlevel, 
02937                      int  *fifthno, 
02938                      char *sixthlevel, 
02939                      int  *sixthno,
02940                      char *seventhlevel, 
02941                      int  *seventhno, 
02942                      char *element, 
02943                      int  *elementno,
02944                      double  *xml_element,
02945                      int  len_firstlevel,
02946                      int  len_secondlevel,
02947                      int  len_thirdlevel,
02948                      int  len_fourthlevel,
02949                      int  len_fifthlevel,
02950                      int  len_sixthlevel,
02951                      int  len_seventhlevel,
02952                      int  len_element)
02953 {
02954   int result;
02955 
02956   result = sasa_c_get_element_d(
02957     xml_element,  *num_doc, 7,
02958     firstlevel,   len_firstlevel,     *firstno, 
02959     secondlevel,  len_secondlevel,    *secondno, 
02960     thirdlevel,   len_thirdlevel,     *thirdno, 
02961     fourthlevel,  len_fourthlevel,    *fourthno, 
02962     fifthlevel,   len_fifthlevel,     *fifthno, 
02963     sixthlevel,   len_sixthlevel,     *sixthno, 
02964     seventhlevel, len_seventhlevel,   *seventhno, 
02965     element,      len_element,        *elementno );
02966 
02967   return(result);
02968 }
02969 
02970 int sasa_c_get_element_8th_level_c  (int  *num_doc,
02971                      char *firstlevel, 
02972                      int  *firstno, 
02973                      char *secondlevel, 
02974                      int  *secondno, 
02975                      char *thirdlevel, 
02976                      int  *thirdno, 
02977                      char *fourthlevel, 
02978                      int  *fourthno, 
02979                      char *fifthlevel, 
02980                      int  *fifthno, 
02981                      char *sixthlevel, 
02982                      int  *sixthno, 
02983                      char *seventhlevel, 
02984                      int  *seventhno, 
02985                      char *eighthlevel, 
02986                      int  *eighthno, 
02987                      char *element, 
02988                      int  *elementno,
02989                      char *xml_element,
02990                      int  *xml_element_length,
02991                      int  len_firstlevel,
02992                      int  len_secondlevel,
02993                      int  len_thirdlevel,
02994                      int  len_fourthlevel,
02995                      int  len_fifthlevel,
02996                      int  len_sixthlevel,
02997                      int  len_seventhlevel,
02998                      int  len_eighthlevel,
02999                      int  len_element,
03000                      int  len_xml_element)
03001 {
03002   int result;
03003 
03004   result = sasa_c_get_element_c(
03005     xml_element,  xml_element_length, *num_doc, 8,
03006     firstlevel,   len_firstlevel,     *firstno, 
03007     secondlevel,  len_secondlevel,    *secondno, 
03008     thirdlevel,   len_thirdlevel,     *thirdno, 
03009     fourthlevel,  len_fourthlevel,    *fourthno, 
03010     fifthlevel,   len_fifthlevel,     *fifthno, 
03011     sixthlevel,   len_sixthlevel,     *sixthno, 
03012     seventhlevel, len_seventhlevel,   *seventhno, 
03013     eighthlevel,  len_eighthlevel,    *eighthno, 
03014     element,      len_element,        *elementno );
03015 
03016   return(result);
03017 }
03018 
03019 
03020 int sasa_c_get_element_8th_level_i  (int  *num_doc,
03021                      char *firstlevel, 
03022                      int  *firstno, 
03023                      char *secondlevel, 
03024                      int  *secondno, 
03025                      char *thirdlevel, 
03026                      int  *thirdno, 
03027                      char *fourthlevel, 
03028                      int  *fourthno, 
03029                      char *fifthlevel, 
03030                      int  *fifthno, 
03031                      char *sixthlevel, 
03032                      int  *sixthno, 
03033                      char *seventhlevel, 
03034                      int  *seventhno, 
03035                      char *eighthlevel, 
03036                      int  *eighthno, 
03037                      char *element, 
03038                      int  *elementno,
03039                      int  *xml_element,
03040                      int  len_firstlevel,
03041                      int  len_secondlevel,
03042                      int  len_thirdlevel,
03043                      int  len_fourthlevel,
03044                      int  len_fifthlevel,
03045                      int  len_sixthlevel,
03046                      int  len_seventhlevel,
03047                      int  len_eighthlevel,
03048                      int  len_element)
03049 {
03050   int result;
03051 
03052   result = sasa_c_get_element_i(
03053     xml_element,  *num_doc, 8,
03054     firstlevel,   len_firstlevel,     *firstno, 
03055     secondlevel,  len_secondlevel,    *secondno, 
03056     thirdlevel,   len_thirdlevel,     *thirdno, 
03057     fourthlevel,  len_fourthlevel,    *fourthno, 
03058     fifthlevel,   len_fifthlevel,     *fifthno, 
03059     sixthlevel,   len_sixthlevel,     *sixthno, 
03060     seventhlevel, len_seventhlevel,   *seventhno, 
03061     eighthlevel,  len_eighthlevel,    *eighthno, 
03062     element,      len_element,        *elementno );
03063 
03064   return(result);
03065 }
03066 
03067 int sasa_c_get_element_8th_level_d  (int  *num_doc,
03068                      char *firstlevel, 
03069                      int  *firstno, 
03070                      char *secondlevel, 
03071                      int  *secondno, 
03072                      char *thirdlevel, 
03073                      int  *thirdno, 
03074                      char *fourthlevel, 
03075                      int  *fourthno, 
03076                      char *fifthlevel, 
03077                      int  *fifthno, 
03078                      char *sixthlevel, 
03079                      int  *sixthno,
03080                      char *seventhlevel, 
03081                      int  *seventhno,
03082                      char *eighthlevel, 
03083                      int  *eighthno, 
03084                      char *element, 
03085                      int  *elementno,
03086                      double  *xml_element,
03087                      int  len_firstlevel,
03088                      int  len_secondlevel,
03089                      int  len_thirdlevel,
03090                      int  len_fourthlevel,
03091                      int  len_fifthlevel,
03092                      int  len_sixthlevel,
03093                      int  len_seventhlevel,
03094                      int  len_eighthlevel,
03095                      int  len_element)
03096 {
03097   int result;
03098 
03099   result = sasa_c_get_element_d(
03100     xml_element,  *num_doc, 8,
03101     firstlevel,   len_firstlevel,     *firstno, 
03102     secondlevel,  len_secondlevel,    *secondno, 
03103     thirdlevel,   len_thirdlevel,     *thirdno, 
03104     fourthlevel,  len_fourthlevel,    *fourthno, 
03105     fifthlevel,   len_fifthlevel,     *fifthno, 
03106     sixthlevel,   len_sixthlevel,     *sixthno, 
03107     seventhlevel, len_seventhlevel,   *seventhno, 
03108     eighthlevel,  len_eighthlevel,    *eighthno, 
03109     element,      len_element,        *elementno );
03110 
03111   return(result);
03112 }
03113 
03114 int sasa_c_get_element_9th_level_c  (int  *num_doc,
03115                      char *firstlevel, 
03116                      int  *firstno, 
03117                      char *secondlevel, 
03118                      int  *secondno, 
03119                      char *thirdlevel, 
03120                      int  *thirdno, 
03121                      char *fourthlevel, 
03122                      int  *fourthno, 
03123                      char *fifthlevel, 
03124                      int  *fifthno, 
03125                      char *sixthlevel, 
03126                      int  *sixthno, 
03127                      char *seventhlevel, 
03128                      int  *seventhno, 
03129                      char *eighthlevel, 
03130                      int  *eighthno, 
03131                      char *ninthlevel, 
03132                      int  *ninthno, 
03133                      char *element, 
03134                      int  *elementno,
03135                      char *xml_element,
03136                      int  *xml_element_length,
03137                      int  len_firstlevel,
03138                      int  len_secondlevel,
03139                      int  len_thirdlevel,
03140                      int  len_fourthlevel,
03141                      int  len_fifthlevel,
03142                      int  len_sixthlevel,
03143                      int  len_seventhlevel,
03144                      int  len_eighthlevel,
03145                      int  len_ninthlevel,
03146                      int  len_element,
03147                      int  len_xml_element)
03148 {
03149   int result;
03150 
03151   result = sasa_c_get_element_c(
03152     xml_element,  xml_element_length, *num_doc, 9,
03153     firstlevel,   len_firstlevel,     *firstno, 
03154     secondlevel,  len_secondlevel,    *secondno, 
03155     thirdlevel,   len_thirdlevel,     *thirdno, 
03156     fourthlevel,  len_fourthlevel,    *fourthno, 
03157     fifthlevel,   len_fifthlevel,     *fifthno, 
03158     sixthlevel,   len_sixthlevel,     *sixthno, 
03159     seventhlevel, len_seventhlevel,   *seventhno, 
03160     eighthlevel,  len_eighthlevel,    *eighthno, 
03161     ninthlevel,   len_ninthlevel,     *ninthno, 
03162     element,      len_element,        *elementno );
03163 
03164   return(result);
03165 }
03166 
03167 
03168 int sasa_c_get_element_9th_level_i  (int  *num_doc,
03169                      char *firstlevel, 
03170                      int  *firstno, 
03171                      char *secondlevel, 
03172                      int  *secondno, 
03173                      char *thirdlevel, 
03174                      int  *thirdno, 
03175                      char *fourthlevel, 
03176                      int  *fourthno, 
03177                      char *fifthlevel, 
03178                      int  *fifthno, 
03179                      char *sixthlevel, 
03180                      int  *sixthno, 
03181                      char *seventhlevel, 
03182                      int  *seventhno, 
03183                      char *eighthlevel, 
03184                      int  *eighthno, 
03185                      char *ninthlevel, 
03186                      int  *ninthno, 
03187                      char *element, 
03188                      int  *elementno,
03189                      int  *xml_element,
03190                      int  len_firstlevel,
03191                      int  len_secondlevel,
03192                      int  len_thirdlevel,
03193                      int  len_fourthlevel,
03194                      int  len_fifthlevel,
03195                      int  len_sixthlevel,
03196                      int  len_seventhlevel,
03197                      int  len_eighthlevel,
03198                      int  len_ninthlevel,
03199                      int  len_element)
03200 {
03201   int result;
03202 
03203   result = sasa_c_get_element_i(
03204     xml_element,  *num_doc, 9,
03205     firstlevel,   len_firstlevel,     *firstno, 
03206     secondlevel,  len_secondlevel,    *secondno, 
03207     thirdlevel,   len_thirdlevel,     *thirdno, 
03208     fourthlevel,  len_fourthlevel,    *fourthno, 
03209     fifthlevel,   len_fifthlevel,     *fifthno, 
03210     sixthlevel,   len_sixthlevel,     *sixthno, 
03211     seventhlevel, len_seventhlevel,   *seventhno, 
03212     eighthlevel,  len_eighthlevel,    *eighthno, 
03213     ninthlevel,   len_ninthlevel,     *ninthno, 
03214     element,      len_element,        *elementno );
03215 
03216   return(result);
03217 }
03218 
03219 
03220 int sasa_c_get_element_9th_level_d  (int  *num_doc,
03221                      char *firstlevel, 
03222                      int  *firstno, 
03223                      char *secondlevel, 
03224                      int  *secondno, 
03225                      char *thirdlevel, 
03226                      int  *thirdno, 
03227                      char *fourthlevel, 
03228                      int  *fourthno, 
03229                      char *fifthlevel, 
03230                      int  *fifthno, 
03231                      char *sixthlevel, 
03232                      int  *sixthno, 
03233                      char *seventhlevel, 
03234                      int  *seventhno, 
03235                      char *eighthlevel, 
03236                      int  *eighthno, 
03237                      char *ninthlevel, 
03238                      int  *ninthno, 
03239                      char *element, 
03240                      int  *elementno,
03241                      double  *xml_element,
03242                      int  len_firstlevel,
03243                      int  len_secondlevel,
03244                      int  len_thirdlevel,
03245                      int  len_fourthlevel,
03246                      int  len_fifthlevel,
03247                      int  len_sixthlevel,
03248                      int  len_seventhlevel,
03249                      int  len_eighthlevel,
03250                      int  len_ninthlevel,
03251                      int  len_element)
03252 {
03253   int result;
03254 
03255   result = sasa_c_get_element_d(
03256     xml_element,  *num_doc, 9,
03257     firstlevel,   len_firstlevel,     *firstno, 
03258     secondlevel,  len_secondlevel,    *secondno, 
03259     thirdlevel,   len_thirdlevel,     *thirdno, 
03260     fourthlevel,  len_fourthlevel,    *fourthno, 
03261     fifthlevel,   len_fifthlevel,     *fifthno, 
03262     sixthlevel,   len_sixthlevel,     *sixthno, 
03263     seventhlevel, len_seventhlevel,   *seventhno, 
03264     eighthlevel,  len_eighthlevel,    *eighthno, 
03265     ninthlevel,   len_ninthlevel,     *ninthno, 
03266     element,      len_element,        *elementno );
03267 
03268   return(result);
03269 }
03270 
03271 int sasa_c_get_element_10th_level_c (int  *num_doc,
03272                      char *firstlevel, 
03273                      int  *firstno, 
03274                      char *secondlevel, 
03275                      int  *secondno, 
03276                      char *thirdlevel, 
03277                      int  *thirdno, 
03278                      char *fourthlevel, 
03279                      int  *fourthno, 
03280                      char *fifthlevel, 
03281                      int  *fifthno, 
03282                      char *sixthlevel, 
03283                      int  *sixthno, 
03284                      char *seventhlevel, 
03285                      int  *seventhno, 
03286                      char *eighthlevel, 
03287                      int  *eighthno, 
03288                      char *ninthlevel, 
03289                      int  *ninthno,
03290                      char *tenthlevel, 
03291                      int  *tenthno, 
03292                      char *element, 
03293                      int  *elementno,
03294                      char *xml_element,
03295                      int  *xml_element_length,
03296                      int  len_firstlevel,
03297                      int  len_secondlevel,
03298                      int  len_thirdlevel,
03299                      int  len_fourthlevel,
03300                      int  len_fifthlevel,
03301                      int  len_sixthlevel,
03302                      int  len_seventhlevel,
03303                      int  len_eighthlevel,
03304                      int  len_ninthlevel,
03305                      int  len_tenthlevel,
03306                      int  len_element,
03307                      int  len_xml_element)
03308 {
03309   int result;
03310 
03311   result = sasa_c_get_element_c(
03312     xml_element,  xml_element_length, *num_doc, 10,
03313     firstlevel,   len_firstlevel,     *firstno, 
03314     secondlevel,  len_secondlevel,    *secondno, 
03315     thirdlevel,   len_thirdlevel,     *thirdno, 
03316     fourthlevel,  len_fourthlevel,    *fourthno, 
03317     fifthlevel,   len_fifthlevel,     *fifthno, 
03318     sixthlevel,   len_sixthlevel,     *sixthno, 
03319     seventhlevel, len_seventhlevel,   *seventhno, 
03320     eighthlevel,  len_eighthlevel,    *eighthno, 
03321     ninthlevel,   len_ninthlevel,     *ninthno, 
03322     tenthlevel,   len_tenthlevel,     *tenthno, 
03323     element,      len_element,        *elementno );
03324 
03325   return(result);
03326 }
03327 
03328 
03329 int sasa_c_get_element_10th_level_i (int  *num_doc,
03330                      char *firstlevel, 
03331                      int  *firstno, 
03332                      char *secondlevel, 
03333                      int  *secondno, 
03334                      char *thirdlevel, 
03335                      int  *thirdno, 
03336                      char *fourthlevel, 
03337                      int  *fourthno, 
03338                      char *fifthlevel, 
03339                      int  *fifthno, 
03340                      char *sixthlevel, 
03341                      int  *sixthno, 
03342                      char *seventhlevel, 
03343                      int  *seventhno, 
03344                      char *eighthlevel, 
03345                      int  *eighthno, 
03346                      char *ninthlevel, 
03347                      int  *ninthno,
03348                      char *tenthlevel, 
03349                      int  *tenthno, 
03350                      char *element, 
03351                      int  *elementno,
03352                      int  *xml_element,
03353                      int  len_firstlevel,
03354                      int  len_secondlevel,
03355                      int  len_thirdlevel,
03356                      int  len_fourthlevel,
03357                      int  len_fifthlevel,
03358                      int  len_sixthlevel,
03359                      int  len_seventhlevel,
03360                      int  len_eighthlevel,
03361                      int  len_ninthlevel,
03362                      int  len_tenthlevel,
03363                      int  len_element)
03364 {
03365   int result;
03366 
03367   result = sasa_c_get_element_i(
03368     xml_element,  *num_doc, 10,
03369     firstlevel,   len_firstlevel,     *firstno, 
03370     secondlevel,  len_secondlevel,    *secondno, 
03371     thirdlevel,   len_thirdlevel,     *thirdno, 
03372     fourthlevel,  len_fourthlevel,    *fourthno, 
03373     fifthlevel,   len_fifthlevel,     *fifthno, 
03374     sixthlevel,   len_sixthlevel,     *sixthno, 
03375     seventhlevel, len_seventhlevel,   *seventhno, 
03376     eighthlevel,  len_eighthlevel,    *eighthno, 
03377     ninthlevel,   len_ninthlevel,     *ninthno, 
03378     tenthlevel,   len_tenthlevel,     *tenthno, 
03379     element,      len_element,        *elementno );
03380 
03381   return(result);
03382 }
03383 
03384 
03385 int sasa_c_get_element_10th_level_d (int  *num_doc,
03386                      char *firstlevel, 
03387                      int  *firstno, 
03388                      char *secondlevel, 
03389                      int  *secondno, 
03390                      char *thirdlevel, 
03391                      int  *thirdno, 
03392                      char *fourthlevel, 
03393                      int  *fourthno, 
03394                      char *fifthlevel, 
03395                      int  *fifthno, 
03396                      char *sixthlevel, 
03397                      int  *sixthno, 
03398                      char *seventhlevel, 
03399                      int  *seventhno, 
03400                      char *eighthlevel, 
03401                      int  *eighthno, 
03402                      char *ninthlevel, 
03403                      int  *ninthno,
03404                      char *tenthlevel, 
03405                      int  *tenthno,
03406                      char *element, 
03407                      int  *elementno,
03408                      double  *xml_element,
03409                      int  len_firstlevel,
03410                      int  len_secondlevel,
03411                      int  len_thirdlevel,
03412                      int  len_fourthlevel,
03413                      int  len_fifthlevel,
03414                      int  len_sixthlevel,
03415                      int  len_seventhlevel,
03416                      int  len_eighthlevel,
03417                      int  len_ninthlevel,
03418                      int  len_tenthlevel,
03419                      int  len_element)
03420 {
03421   int result;
03422 
03423   result = sasa_c_get_element_d(
03424     xml_element,  *num_doc, 10,
03425     firstlevel,   len_firstlevel,     *firstno, 
03426     secondlevel,  len_secondlevel,    *secondno, 
03427     thirdlevel,   len_thirdlevel,     *thirdno, 
03428     fourthlevel,  len_fourthlevel,    *fourthno, 
03429     fifthlevel,   len_fifthlevel,     *fifthno, 
03430     sixthlevel,   len_sixthlevel,     *sixthno, 
03431     seventhlevel, len_seventhlevel,   *seventhno, 
03432     eighthlevel,  len_eighthlevel,    *eighthno, 
03433     ninthlevel,   len_ninthlevel,     *ninthno, 
03434     tenthlevel,   len_tenthlevel,     *tenthno, 
03435     element,      len_element,        *elementno );
03436 
03437   return(result);
03438 }

Generated on 1 Dec 2011 for Oasis4 by  doxygen 1.6.1