Ignore:
Timestamp:
Jul 26, 2012, 5:43:08 PM (12 years ago)
Author:
karaoui
Message:

new version of map.xml supporting the routage and the coproc.
the xml_parser/xml_driver are also updated aproprietly.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • soft/giet_vm/xml/xml_parser.c

    r175 r181  
    11///////////////////////////////////////////////////////////////////////////////////////
    22// File     : xml_parser.c
    3 // Date     : 04/04/2012
     3// Date     : 14/04/2012
    44// Author   : alain greiner
    55// Copyright (c) UPMC-LIP6
     
    1717#include  <stdio.h>
    1818#include  <string.h>
     19#include  <assert.h>
    1920#include  <libxml/xmlreader.h>
    2021#include  <mapping_info.h>
     
    2728#define MAX_VSEGS               4096
    2829#define MAX_VOBJS               8192
    29 
    30 #define XML_PARSER_DEBUG        0
     30#define MAX_PROCS               1024
     31#define MAX_IRQS                8192
     32#define MAX_COPROCS             4096
     33#define MAX_CP_PORTS    8192
     34#define MAX_CP_REGS             8192
     35
     36#define XML_PARSER_DEBUG        1
    3137
    3238///////////////////////////////////////////////////////////////////////////////////
     
    3440///////////////////////////////////////////////////////////////////////////////////
    3541
    36 mapping_header_t*       header;
    37 mapping_cluster_t*      cluster[MAX_CLUSTERS];          // cluster array
    38 mapping_pseg_t*         pseg[MAX_PSEGS];                // pseg array
    39 mapping_vspace_t*       vspace[MAX_VSPACES];            // vspace array
    40 mapping_vseg_t*         vseg[MAX_VSEGS];                // vseg array
    41 mapping_vobj_t*         vobj[MAX_VOBJS];                // vobj array
    42 mapping_task_t*         task[MAX_TASKS];                // task array
     42mapping_header_t*       header;
     43mapping_cluster_t*      cluster[MAX_CLUSTERS];  // cluster array
     44mapping_pseg_t*         pseg[MAX_PSEGS];                // pseg array
     45mapping_vspace_t*       vspace[MAX_VSPACES];    // vspace array
     46mapping_vseg_t*         vseg[MAX_VSEGS];                // vseg array
     47mapping_vobj_t*         vobj[MAX_VOBJS];                // vobj array
     48mapping_task_t*         task[MAX_TASKS];                // task array
     49mapping_proc_t*         proc[MAX_PROCS];                // proc array
     50mapping_irq_t*          irq[MAX_IRQS];                  // irq array
     51mapping_coproc_t*       coproc[MAX_COPROCS];            // coproc array
     52mapping_coproc_port_t*  cp_port[MAX_CP_PORTS];  // coproc port array
     53mapping_coproc_reg_t*   cp_reg[MAX_CP_REGS];     // coproc reg array
     54
     55typedef struct vobj_ref_s
     56{
     57    char vspace_name[32];
     58    char vobj_name[32];
     59}vobj_ref_t;
     60
     61// This arrray is useful to temporary save the a vobj referece
     62// formed by a vspace_name and a vobj_name (struct vobj_ref_s).
     63// This arry will be used to set the attribute vobj_id of coproc_port
     64// once all the vspace have been parsed.
     65vobj_ref_t*                 cp_port_vobj_ref[MAX_CP_PORTS];     
    4366
    4467unsigned int            cluster_index  = 0;
    4568unsigned int            vspace_index   = 0;
    4669unsigned int            global_index   = 0;
    47 unsigned int            pseg_index     = 0;
     70unsigned int            pseg_index     = 0;             
     71
     72unsigned int            proc_index     = 0;
     73unsigned int            proc_loc_index = 0;
     74
     75unsigned int            irq_index      = 0;
     76unsigned int            irq_loc_index  = 0;
     77
     78unsigned int            coproc_index     = 0;
     79unsigned int            coproc_loc_index = 0;
     80
     81unsigned int            cp_port_index     = 0;
     82unsigned int            cp_port_loc_index = 0;
     83
     84unsigned int            cp_reg_index     = 0;
     85unsigned int            cp_reg_loc_index = 0;
     86
    4887unsigned int            vseg_index     = 0;
    4988unsigned int            vseg_loc_index = 0;
     
    127166} // end getStringValue()
    128167
    129 //////////////////////////
    130 int getPsegId( char* str )
     168///////////////////////////////////////
     169int getPsegId( unsigned int     cluster_id,
     170               char*        pseg_name )
    131171{
    132172    unsigned int pseg_id;
    133 
    134     for ( pseg_id = 0 ; pseg_id < header->psegs ; pseg_id++ )
    135     {
    136         if ( strcmp(pseg[pseg_id]->name, str) == 0 ) return pseg_id;
     173    unsigned int pseg_min = cluster[cluster_id]->pseg_offset;
     174    unsigned int pseg_max = pseg_min + cluster[cluster_id]->psegs;
     175
     176    for ( pseg_id = pseg_min ; pseg_id < pseg_max ; pseg_id++ )
     177    {
     178        if ( strcmp(pseg[pseg_id]->name, pseg_name) == 0 ) return pseg_id;
    137179    }
    138180    return -1;
    139181}
    140182
    141 //////////////////////////////////////////
     183////////////////////////////////////////////
     184int getVspaceId( char*         vspace_name)
     185////////////////////////////////////////////
     186{
     187    unsigned int vspace_id;
     188
     189    for( vspace_id = 0; vspace_id < vspace_index ; vspace_id++)
     190    {
     191        if( !strcmp(vspace[vspace_id]->name, vspace_name))
     192        {
     193            return vspace_id;
     194        }
     195    }
     196    return -1;
     197}
     198
     199////////////////////////////////////////////
    142200int getVobjLocId( unsigned int  vspace_id,
    143                   char*         str )
     201                  char*             vobj_name,
     202                  unsigned int  vspace_max)
     203////////////////////////////////////////////
    144204{
    145205    unsigned int vobj_id;
    146206    unsigned int vobj_min = vspace[vspace_id]->vobj_offset;
    147     unsigned int vobj_max = vobj_min + vobj_loc_index;
     207    unsigned int vobj_max = vobj_min + vspace_max;
    148208
    149209    for ( vobj_id = vobj_min ; vobj_id < vobj_max ; vobj_id++ )
    150210    {
    151         if ( strcmp(vobj[vobj_id]->name, str) == 0 )
     211        if ( strcmp(vobj[vobj_id]->name, vobj_name) == 0 )
    152212        {
    153213             return (vobj_id - vobj_min);
     
    157217}
    158218
    159 //////////////////////////////////////////
    160 void  taskNode ( xmlTextReaderPtr reader )
     219///////////////////////////////////////////
     220void cpPortNode ( xmlTextReaderPtr reader )
     221///////////////////////////////////////////
     222{
     223    char*           str;
     224    unsigned int    ok;
     225
     226    if ( xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT ) return;
     227
     228    if ( cp_port_index >= MAX_CP_PORTS )
     229    {
     230        printf("[XML ERROR] The number of ports (for coprocs) is larger than %d\n", MAX_CP_PORTS);
     231    }
     232
     233#if XML_PARSER_DEBUG
     234printf("\n  port %d\n", cp_port_index);
     235#endif
     236
     237    cp_port[cp_port_index] = (mapping_coproc_port_t*)malloc(sizeof(mapping_coproc_port_t));
     238    cp_port_vobj_ref[cp_port_index] = (vobj_ref_t*)malloc(sizeof(vobj_ref_t));
     239
     240
     241   
     242    ///////// get direction attribute
     243    str = getStringValue( reader, "direction", &ok );
     244    if ( ok )
     245    {
     246#if XML_PARSER_DEBUG
     247printf("      direction = %s\n", str);
     248#endif
     249        if      ( strcmp(str, "TO_COPROC")   ) cp_port[cp_port_index]->direction = PORT_TO_COPROC;
     250        else if ( strcmp(str, "FROM_COPROC") ) cp_port[cp_port_index]->direction = PORT_FROM_COPROC;
     251        else
     252        {
     253            printf("[XML ERROR] illegal <direction> for coproc_port %d in cluster %d\n",
     254                   cp_port_index, cluster_index);
     255            exit(1);
     256        }
     257    } 
     258    else
     259    {
     260        printf("[XML ERROR] missing <direction> for coproc_port %d in cluster %d\n",
     261               cp_port_index, cluster_index);
     262        exit(1);
     263    }
     264   
     265    /////////// get vspacename attribute
     266    str = getStringValue( reader, "vspacename", &ok );
     267#if XML_PARSER_DEBUG
     268printf("      vspacename = %s\n", str);
     269#endif
     270    if ( ok )
     271    {
     272        strncpy(cp_port_vobj_ref[cp_port_index]->vspace_name, str, 31);
     273    }
     274    else
     275    {
     276        printf("[XML ERROR] missing <vspacename> for coproc_port %d in cluster %d\n",
     277               cp_port_index, cluster_index);
     278        exit(1);
     279    }
     280
     281    /////////// get vobjname attribute
     282    str = getStringValue( reader, "vobjname", &ok );
     283#if XML_PARSER_DEBUG
     284printf("      vobjname = %s\n", str);
     285#endif
     286    if ( ok )
     287    {
     288        strncpy(cp_port_vobj_ref[cp_port_index]->vobj_name, str, 31);
     289    }
     290    else
     291    {
     292        printf("[XML ERROR] missing <vobjname> for coproc_port %d in cluster %d\n",
     293               cp_port_index, cluster_index);
     294        exit(1);
     295    }
     296   
     297    cp_port_index++;
     298    cp_port_loc_index++;
     299
     300} // end cpPortNode()
     301
     302/////////////////////////////////////////
     303void cpRegNode ( xmlTextReaderPtr reader )
     304/////////////////////////////////////////
     305{
     306    char*           str;
     307    unsigned int    value;
     308    unsigned int    ok;
     309
     310    if ( xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT ) return;
     311
     312    /* TWO: check source file consistency if possible */
     313    if ( cp_reg_index >= MAX_CP_REGS )
     314    {
     315        printf("[XML ERROR] The number of regs (for coprocs) is larger than %d\n", MAX_CP_REGS);
     316    }
     317
     318#if XML_PARSER_DEBUG
     319printf("\n  reg %d\n", cp_reg_index);
     320#endif
     321
     322    /* THIRD*/
     323    cp_reg[cp_reg_index] = (mapping_coproc_reg_t*)malloc(sizeof(mapping_coproc_reg_t));
     324
     325    /* FOURTH: read all attribute*/
     326
     327    /////////// get name attribute
     328    str = getStringValue( reader, "name", &ok );
     329#if XML_PARSER_DEBUG
     330printf("      name = %s\n", str);
     331#endif
     332    if ( ok )
     333    {
     334        strncpy(cp_reg[cp_reg_index]->name, str, 31);
     335    }
     336    else
     337    {
     338        printf("[XML ERROR] illegal or missing <name> for coproc_reg %d in cluster %d\n",
     339               cp_reg_index, cluster_index);
     340        exit(1);
     341    }
     342   
     343    ///////// get type attribute
     344    str = getStringValue( reader, "type", &ok );
     345    if ( ok )
     346    {
     347#if XML_PARSER_DEBUG
     348printf("      type = %s\n", str);
     349#endif
     350        if      ( strcmp(str, "STATUS")   ) cp_reg[cp_reg_index]->type = REG_TYPE_STATUS;
     351        else if ( strcmp(str, "CONFIG")   ) cp_reg[cp_reg_index]->type = REG_TYPE_CONFIG;
     352        else
     353        {
     354            printf("[XML ERROR] illegal <type> for coproc_reg %d in cluster %d\n",
     355                   cp_reg_index, cluster_index);
     356            exit(1);
     357        }
     358    } 
     359    else
     360    {
     361        printf("[XML ERROR] missing <type> for coproc_reg %d in cluster %d\n",
     362               cp_reg_index, cluster_index);
     363        exit(1);
     364    }
     365
     366    ///////// get value attribute
     367    value = getIntValue(reader, "value", &ok);
     368    if ( ok )
     369    {
     370#if XML_PARSER_DEBUG
     371printf("        value   = %d\n", value);
     372#endif
     373        cp_reg[cp_reg_index]->value = value;
     374    }
     375    else
     376    {
     377        printf("[XML ERROR] illegal or missing <value> for coproc_reg %d in cluster %d\n",
     378               cp_reg_index, cluster_index);
     379        exit(1);
     380    }
     381
     382    ///////// get channel attribute
     383    value = getIntValue(reader, "channel", &ok);
     384    if ( ok )
     385    {
     386#if XML_PARSER_DEBUG
     387printf("        channel   = %d\n", value);
     388#endif
     389        cp_reg[cp_reg_index]->channel_id = value;
     390    }
     391    else
     392    {
     393        printf("[XML ERROR] illegal or missing <channel> for coproc_reg %d in cluster %d\n",
     394               cp_reg_index, cluster_index);
     395        exit(1);
     396    }
     397
     398    ///////// get index attribute
     399    value = getIntValue(reader, "index", &ok);
     400    if ( ok )
     401    {
     402#if XML_PARSER_DEBUG
     403printf("        index   = %d\n", value);
     404#endif
     405        cp_reg[cp_reg_index]->loc_id = value;
     406    }
     407    else
     408    {
     409        printf("[XML ERROR] illegal or missing <index> for coproc_reg %d in cluster %d\n",
     410               cp_reg_index, cluster_index);
     411        exit(1);
     412    }
     413   
     414    cp_reg_index++;
     415    cp_reg_loc_index++;
     416
     417} // end cpRegNode()
     418
     419/////////////////////////////////////////
     420void coprocNode ( xmlTextReaderPtr reader )
     421/////////////////////////////////////////
     422{
     423    char*           str;
     424    unsigned int        ok;
     425
     426    cp_port_loc_index = 0;
     427    cp_reg_loc_index = 0;
     428
     429    if ( xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT ) return;
     430
     431    if ( coproc_index >= MAX_COPROCS )
     432    {
     433        printf("[XML ERROR] The number of coprocs is larger than %d\n", MAX_COPROCS);
     434    }
     435
     436#if XML_PARSER_DEBUG
     437printf("\n  coproc %d\n", coproc_index);
     438#endif
     439
     440    coproc[coproc_index] = (mapping_coproc_t*)malloc(sizeof(mapping_coproc_t));
     441
     442
     443    /////////// get name attribute
     444    str = getStringValue( reader, "name", &ok );
     445    if ( ok )
     446    {
     447#if XML_PARSER_DEBUG
     448printf("      name = %s\n", str);
     449#endif
     450        strncpy(coproc[coproc_index]->name, str, 31);
     451    }
     452    else
     453    {
     454        printf("[XML ERROR] illegal or missing <name> for coproc %d in cluster %d\n",
     455               coproc_index, cluster_index);
     456        exit(1);
     457    }
     458
     459    /////////// get psegname attribute
     460    str = getStringValue(reader,"psegname", &ok);
     461    if ( ok == 0 )
     462    {
     463        printf("[XML ERROR] illegal or missing <psegname> for coproc %d in cluster %d\n",
     464                 coproc_index, cluster_index);
     465        exit(1);
     466    }
     467
     468    /////////// set psegid attribute
     469    int index = getPsegId( cluster_index, str );
     470    if ( index >= 0 )
     471    {
     472#if XML_PARSER_DEBUG
     473printf("      clusterid = %d\n", cluster_index);
     474printf("      psegname  = %s\n", str);
     475printf("      psegid    = %d\n", index);
     476#endif
     477        coproc[coproc_index]->psegid = index;
     478        assert(pseg[index]->type == PSEG_TYPE_PERI && "coproc psegname attribute must refer to a pseg of type PERI" );
     479    }
     480    else             
     481    {
     482        printf("[XML ERROR] pseg not found for coproc %d / clusterid = %d / psegname = %s\n",
     483                   coproc_index, cluster_index, str );
     484        exit(1);
     485    } 
     486
     487    ////////// set port_offset and reg_offset attribute
     488    coproc[coproc_index]->port_offset = cp_port_index;
     489    coproc[coproc_index]->reg_offset = cp_reg_index;
     490
     491#if XML_PARSER_DEBUG
     492printf("    port_offset = %d\n", cp_port_index);
     493printf("    reg_offset = %d\n", cp_reg_index);
     494#endif
     495
     496    int status = xmlTextReaderRead(reader);
     497    while ( status == 1 )
     498    {
     499        const char* tag = (const char*)xmlTextReaderConstName(reader);
     500
     501        if      ( strcmp(tag,"port")    == 0 ) cpPortNode(reader);
     502        else if ( strcmp(tag,"reg")   == 0 ) cpRegNode(reader);
     503        else if ( strcmp(tag,"#text")   == 0 ) { }
     504        else if ( strcmp(tag,"coproc")  == 0 )
     505        {
     506            coproc[coproc_index]->ports = cp_port_loc_index;
     507            coproc[coproc_index]->regs = cp_reg_loc_index;
     508            coproc_loc_index++;
     509            coproc_index++;
     510            return;
     511        }
     512        else
     513        {
     514            printf("[XML ERROR] Unknown tag %s",tag);
     515            exit(1);
     516        }
     517        status = xmlTextReaderRead ( reader );
     518    }
     519} // end coprocNode()
     520
     521///////////////////////////////////////
     522void irqNode( xmlTextReaderPtr reader )
     523///////////////////////////////////////
    161524{
    162525    unsigned int        ok;
     
    166529    if ( xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT ) return;
    167530
     531    if ( irq_index >= MAX_IRQS )
     532    {
     533        printf("[XML ERROR] The number of irqs is larger than %d\n", MAX_IRQS);
     534    }
     535
     536#if XML_PARSER_DEBUG
     537printf("     irq %d\n", irq_loc_index);
     538#endif
     539
     540    irq[irq_index] = (mapping_irq_t*)malloc(sizeof(mapping_irq_t));
     541
     542    ///////// get type attribute
     543    str = getStringValue(reader,"type", &ok);
     544    if ( ok )
     545    {
     546#if XML_PARSER_DEBUG
     547printf("        type    = %s\n", str);
     548#endif
     549        if      ( strcmp(str, "HARD") ) irq[irq_index]->type = IRQ_TYPE_HARD;
     550        else if ( strcmp(str, "SOFT") ) irq[irq_index]->type = IRQ_TYPE_SOFT;
     551        else
     552        {
     553            printf("[XML ERROR] undefined IRQ  <type> for processor %d in cluster %d\n",
     554                   cluster_index, proc_loc_index );
     555            exit(1);
     556        }
     557    } 
     558    else
     559    {
     560        printf("[XML ERROR] missing IRQ <type> for processor %d in cluster %d\n",
     561               cluster_index, proc_loc_index );
     562        exit(1);
     563    }
     564
     565    ///////// get irqid attribute
     566    value = getIntValue(reader, "icuid", &ok);
     567    if ( ok )
     568    {
     569#if XML_PARSER_DEBUG
     570printf("        icuid   = %d\n", value);
     571#endif
     572        irq[irq_index]->icuid = value;
     573        if ( value >= 32 )
     574        {
     575            printf("[XML ERROR] IRQ <icuid> too large for processor %d in cluster %d\n",
     576                   cluster_index, proc_loc_index );
     577            exit(1);
     578        }
     579    }
     580    else
     581    {
     582        printf("[XML ERROR] missing IRQ <icuid> for processor %d in cluster %d\n",
     583               cluster_index, proc_loc_index );
     584        exit(1);
     585    }
     586
     587    ///////// get isr attribute
     588    str = getStringValue(reader,"isr", &ok);
     589    if ( ok )
     590    {
     591#if XML_PARSER_DEBUG
     592printf("        isr     = %s\n", str);
     593#endif
     594        if      ( strcmp(str, "ISR_SWITCH") ) irq[irq_index]->isr = ISR_SWITCH;
     595        else if ( strcmp(str, "ISR_IOC")    ) irq[irq_index]->isr = ISR_IOC;
     596        else if ( strcmp(str, "ISR_FBDMA")  ) irq[irq_index]->isr = ISR_FBDMA;
     597        else if ( strcmp(str, "ISR_TTY")    ) irq[irq_index]->isr = ISR_TTY;
     598        else
     599        {
     600            printf("[XML ERROR] illegal IRQ <isr> for processor %d in cluster %d\n",
     601                   cluster_index, proc_loc_index );
     602            exit(1);
     603        }
     604    } 
     605    else
     606    {
     607        printf("[XML ERROR] missing IRQ <isr> for processor %d in cluster %d\n",
     608               cluster_index, proc_loc_index );
     609        exit(1);
     610    }
     611
     612    ///////// get channel attribute (optionnal : 0 if missing)
     613    value = getIntValue(reader, "channel", &ok);
     614    if ( ok )
     615    {
     616#if XML_PARSER_DEBUG
     617printf("        channel = %d\n", value);
     618#endif
     619        irq[irq_index]->channel = value;
     620    }
     621    else
     622    {
     623        irq[irq_index]->channel = 0;
     624    }
     625
     626    irq_index++;
     627    irq_loc_index++;
     628
     629} // end irqNode
     630
     631/////////////////////////////////////////
     632void procNode ( xmlTextReaderPtr reader )
     633/////////////////////////////////////////
     634{
     635    unsigned int        ok;
     636    unsigned int    value;
     637
     638    irq_loc_index = 0;
     639
     640    if ( xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT ) return;
     641
     642    if ( proc_index >= MAX_PROCS )
     643    {
     644        printf("[XML ERROR] The number of procs is larger than %d\n", MAX_PROCS);
     645    }
     646
     647#if XML_PARSER_DEBUG
     648printf("\n  proc %d\n", proc_index);
     649#endif
     650
     651    proc[proc_index] = (mapping_proc_t*)malloc(sizeof(mapping_proc_t));
     652
     653
     654    /////////// get index attribute (optional)
     655    value = getIntValue(reader,"index",&ok);
     656    if ( ok && (value != proc_index) )
     657    {
     658            printf("[XML ERROR] wrong proc index / expected value is %d",
     659                proc_index);
     660            exit(1);
     661    }
     662
     663    ////////// set irq_offset attribute
     664    proc[proc_index]->irq_offset = irq_index;
     665#if XML_PARSER_DEBUG
     666printf("    irq_offset = %d\n", irq_index);
     667#endif
     668
     669    int status = xmlTextReaderRead(reader);
     670    while ( status == 1 )
     671    {
     672        const char* tag = (const char*)xmlTextReaderConstName(reader);
     673
     674        if      ( strcmp(tag,"irq")    == 0 ) irqNode(reader);
     675        else if ( strcmp(tag,"#text")   == 0 ) { }
     676        else if ( strcmp(tag,"proc")  == 0 )
     677        {
     678            proc[proc_index]->irqs = irq_loc_index;
     679            proc_loc_index++;
     680            proc_index++;
     681            return;
     682        }
     683        else
     684        {
     685            printf("[XML ERROR] Unknown tag %s",tag);
     686            exit(1);
     687        }
     688        status = xmlTextReaderRead ( reader );
     689    }
     690} // end procNode()
     691
     692
     693/////////////////////////////////////////
     694void taskNode ( xmlTextReaderPtr reader )
     695/////////////////////////////////////////
     696{
     697    unsigned int        ok;
     698    unsigned int        value;
     699    char*               str;
     700
     701    if ( xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT ) return;
     702
    168703    if ( task_index >= MAX_TASKS )
    169704    {
     
    241776    if ( ok )
    242777    {
    243         int index = getVobjLocId( vspace_index, str );
     778        int index = getVobjLocId( vspace_index, str , vobj_loc_index);
    244779        if ( index >= 0 )
    245780        {
     
    380915        }
    381916    }
    382     else if (ok && (strcmp(type_str, "BLOB")    == 0)) vobj[vobj_index]->type = VOBJ_TYPE_BLOB;
    383     else if (ok && (strcmp(type_str, "PTAB")    == 0)) vobj[vobj_index]->type = VOBJ_TYPE_PTAB;
    384     else if (ok && (strcmp(type_str, "PERI")    == 0)) vobj[vobj_index]->type = VOBJ_TYPE_PERI;
    385     else if (ok && (strcmp(type_str, "MWMR")    == 0)) vobj[vobj_index]->type = VOBJ_TYPE_MWMR;
    386     else if (ok && (strcmp(type_str, "LOCK")    == 0)) vobj[vobj_index]->type = VOBJ_TYPE_LOCK;
    387     else if (ok && (strcmp(type_str, "BUFFER")  == 0)) vobj[vobj_index]->type = VOBJ_TYPE_BUFFER;
    388     else if (ok && (strcmp(type_str, "BARRIER") == 0)) vobj[vobj_index]->type = VOBJ_TYPE_BARRIER;
     917    else if (ok && (strcmp(str, "BLOB")    == 0)) vobj[vobj_index]->type = VOBJ_TYPE_BLOB;
     918    else if (ok && (strcmp(str, "PTAB")    == 0)) vobj[vobj_index]->type = VOBJ_TYPE_PTAB;
     919    else if (ok && (strcmp(str, "PERI")    == 0)) vobj[vobj_index]->type = VOBJ_TYPE_PERI;
     920    else if (ok && (strcmp(str, "MWMR")    == 0)) vobj[vobj_index]->type = VOBJ_TYPE_MWMR;
     921    else if (ok && (strcmp(str, "LOCK")    == 0)) vobj[vobj_index]->type = VOBJ_TYPE_LOCK;
     922    else if (ok && (strcmp(str, "BUFFER")  == 0)) vobj[vobj_index]->type = VOBJ_TYPE_BUFFER;
     923    else if (ok && (strcmp(str, "BARRIER") == 0)) vobj[vobj_index]->type = VOBJ_TYPE_BARRIER;
    389924    else
    390925    {
     
    449984    else
    450985    {
    451         if(vobj[vobj_index]->type == VOBJ_TYPE_MWMR || vobj[vobj_index]->type == VOBJ_TYPE_BARRIER )
    452         {
    453             printf("[XML ERROR] illegal or missing <value> attribute for vobj (%d,%d), of type: %s\n",
    454                     vspace_index, vobj_loc_index, type_str);
    455             exit(1);
    456         }
    457         else
    458             vobj[vobj_index]->init = 0;
     986        if((vobj[vobj_index]->type == VOBJ_TYPE_MWMR || vobj[vobj_index]->type == VOBJ_TYPE_BARRIER ))
     987        {
     988            printf("[XML ERROR] illegal or missing <value> attribute for vobj (%d,%d). \
     989                                        All MWMR or BARRIER vobj must have a init value \n",
     990                    vspace_index, vobj_loc_index);
     991            exit(1);
     992        }
     993        vobj[vobj_index]->init = 0;
    459994    }
    460995
     
    5251060    }
    5261061
     1062    ////////// get clusterid and psegname attributes
     1063    value = getIntValue(reader,"clusterid", &ok);
     1064    if ( ok == 0 )
     1065    {
     1066        printf("[XML ERROR] illegal or missing <clusterid> for vseg %d\n",
     1067                 vseg_loc_index);
     1068        exit(1);
     1069    }
     1070    str = getStringValue(reader,"psegname", &ok);
     1071    if ( ok == 0 )
     1072    {
     1073        printf("[XML ERROR] illegal or missing <psegname> for vseg %d\n",
     1074                 vseg_loc_index);
     1075        exit(1);
     1076    }
     1077
     1078    /////////// set psegid field
     1079    int index = getPsegId( value, str );
     1080    if ( index >= 0 )
     1081    {
     1082#if XML_PARSER_DEBUG
     1083printf("      clusterid = %d\n", value);
     1084printf("      psegname  = %s\n", str);
     1085printf("      psegid    = %d\n", index);
     1086#endif
     1087        vseg[vseg_index]->psegid = index;
     1088    }
     1089    else             
     1090    {
     1091        printf("[XML ERROR] pseg not found for vseg %d / clusterid = %d / psegname = %s\n",
     1092                   vseg_loc_index, value, str );
     1093        exit(1);
     1094    } 
     1095
    5271096    ////////// get ident attribute (optional : 0 if missing)
    5281097    value = getIntValue(reader,"ident", &ok);
     
    5371106    {
    5381107        vseg[vseg_index]->ident = 0;
    539     }
    540 
    541     ////////// get psegname attribute
    542     str = getStringValue(reader,"psegname", &ok);
    543     if ( ok )
    544     {
    545         int index = getPsegId( str );
    546         if ( index >= 0 )
    547         {
    548 #if XML_PARSER_DEBUG
    549 printf("      psegname = %s\n", str);
    550 printf("      psegid   = %d\n", index);
    551 #endif
    552             vseg[vseg_index]->psegid = index;
    553         }
    554         else             
    555         {
    556             printf("[XML ERROR] illegal or missing <psegname> for vseg %d\n",
    557                      vseg_loc_index);
    558             exit(1);
    559         }
    560     } 
    561     else
    562     {
    563         printf("[XML ERROR] illegal or missing <psegname> for vseg %d\n",
    564                  vseg_loc_index);
    565         exit(1);
    5661108    }
    5671109
     
    5941136    }
    5951137   
    596     ////////// set the length attribute to 0
    597     vseg[vseg_index]->length = value;
    598 
    599     ////////// get vobjs
    600     int status = xmlTextReaderRead ( reader );
     1138    ////////// get vobjs in vseg
     1139    int status = xmlTextReaderRead(reader);
    6011140    while ( status == 1 )
    6021141    {
    6031142        const char* tag = (const char*)xmlTextReaderConstName(reader);
    6041143
    605         if      ( strcmp(tag,"vobj") == 0    ) vobjNode(reader);
     1144        if      ( strcmp(tag,"vobj")    == 0 ) vobjNode(reader);
    6061145        else if ( strcmp(tag,"#text"  ) == 0 ) { }
    607         else if ( strcmp(tag,"vseg") == 0  )
    608         {
    609             //  checking source file consistency?
     1146        else if ( strcmp(tag,"vseg")    == 0 )
     1147        {
    6101148            vseg[vseg_index]->vobjs = vobj_count;
    6111149            vseg_index++;
     
    6881226    }
    6891227
    690     int status = xmlTextReaderRead ( reader );
     1228    int status = xmlTextReaderRead(reader);
    6911229    while ( status == 1 )
    6921230    {
    6931231        const char* tag = (const char*)xmlTextReaderConstName(reader);
    6941232
    695         if      ( strcmp(tag,"vseg") == 0    ) vsegNode(reader);
    696         else if ( strcmp(tag,"task") == 0    ) taskNode(reader);
    697         else if ( strcmp(tag,"#text"  ) == 0 ) { }
    698         else if ( strcmp(tag,"vspace") == 0 )
    699         {
    700             vspace[vspace_index]->vobjs = vobj_loc_index;
     1233        if      ( strcmp(tag,"vseg")    == 0 ) vsegNode(reader);
     1234        else if ( strcmp(tag,"task")    == 0 ) taskNode(reader);
     1235        else if ( strcmp(tag,"#text" == 0 ) { }
     1236        else if ( strcmp(tag,"vspace")  == 0 )
     1237        {
     1238            vspace[vspace_index]->vobjs = vobj_loc_index; 
    7011239            vspace[vspace_index]->tasks = task_loc_index ;
    7021240            vspace[vspace_index]->vsegs = vseg_loc_index ;
    7031241
    7041242            // get index of the vobj containing the start vector
    705             int index =  getVobjLocId( vspace_index, str );
     1243            int index =  getVobjLocId( vspace_index, str , vobj_loc_index );
    7061244            if(index == -1)
    7071245            {
     
    7131251                vspace[vspace_index]->start_offset = index;
    7141252#if XML_PARSER_DEBUG
    715 printf("  startname = %s\n", str);
    716 printf("  startid   = %d\n", index);
     1253printf("      startname = %s\n", str);
     1254printf("      startid   = %d\n", index);
     1255printf("  end vspace %d\n\n", vspace_index);
    7171256#endif
    7181257            }
     
    7651304    pseg[pseg_index] = (mapping_pseg_t*)malloc(sizeof(mapping_pseg_t));
    7661305
    767     // get name attribute
     1306    /////// get name attribute
    7681307    str = getStringValue( reader, "name", &ok );
    7691308#if XML_PARSER_DEBUG
    770 printf("    name = %s\n", str);
     1309printf("      name = %s\n", str);
    7711310#endif
    7721311    if ( ok )
     
    7761315    else
    7771316    {
    778         printf("[XML ERROR] illegal or missing <name> for pseg %d\n", pseg_index);
    779         exit(1);
    780     }
    781 
    782     // get base attribute
     1317        printf("[XML ERROR] illegal or missing <name> for pseg %d in cluster %d\n",
     1318               pseg_index, cluster_index);
     1319        exit(1);
     1320    }
     1321
     1322    //////// get type attribute
     1323    str = getStringValue(reader, "type", &ok);
     1324#if XML_PARSER_DEBUG
     1325printf("      type = %s\n", str);
     1326#endif
     1327    if      (ok && (strcmp(str, "RAM" ) == 0)) pseg[pseg_index]->type = PSEG_TYPE_RAM;
     1328    else if (ok && (strcmp(str, "ROM" ) == 0)) pseg[pseg_index]->type = PSEG_TYPE_ROM;
     1329    else if (ok && (strcmp(str, "PERI") == 0)) pseg[pseg_index]->type = PSEG_TYPE_PERI;
     1330    else
     1331    {
     1332        printf("[XML ERROR] illegal or missing <type> for pseg %s in cluster %d\n",
     1333        pseg[pseg_index]->name, cluster_index);
     1334        exit(1);
     1335    }
     1336
     1337    //////// get base attribute
    7831338    value = getIntValue( reader, "base", &ok );
    7841339#if XML_PARSER_DEBUG
    785 printf("    base = %x\n", value);
     1340printf("      base = 0x%x\n", value);
    7861341#endif
    7871342    if ( ok )
     
    7911346    else
    7921347    {
    793         printf("[XML ERROR] illegal or missing <base> for pseg %d\n", pseg_index);
    794         exit(1);
    795     }
    796 
    797     // get length attribute
     1348        printf("[XML ERROR] illegal or missing <base> for pseg %s in cluster %d\n",
     1349        pseg[pseg_index]->name, cluster_index);
     1350        exit(1);
     1351    }
     1352
     1353    //////// get length attribute
    7981354    value = getIntValue( reader, "length", &ok );
    7991355#if XML_PARSER_DEBUG
    800 printf("    length = %x\n\n", value);
     1356printf("      length = 0x%x\n", value);
    8011357#endif
    8021358    if ( ok )
     
    8061362    else
    8071363    {
    808         printf("[XML ERROR] illegal or missing <length> for pseg %d\n", pseg_index);
    809         exit(1);
    810     }
     1364        printf("[XML ERROR] illegal or missing <length> for pseg %s in cluster %d\n",
     1365        pseg[pseg_index]->name, cluster_index);
     1366        exit(1);
     1367    }
     1368
     1369    //////// set cluster attribute
     1370    pseg[pseg_index]->cluster = cluster_index;
    8111371
    8121372    pseg_index++;
     1373    cluster[cluster_index]->psegs++;
    8131374} // end psegNode()
    8141375
     
    8191380    unsigned int value;
    8201381
     1382    proc_loc_index = 0;
     1383    coproc_loc_index = 0;
     1384    cluster[cluster_index] = 0;
     1385
    8211386    if ( xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT ) return;
    8221387
     
    8291394
    8301395#if XML_PARSER_DEBUG
    831 printf("  cluster %d :\n", cluster_index);
     1396printf("  cluster %d\n", cluster_index);
    8321397#endif
    8331398
    8341399    cluster[cluster_index] = (mapping_cluster_t*)malloc(sizeof(mapping_cluster_t));
    8351400
    836     // get index attribute (optional)
     1401    /////////// get index attribute (optional)
    8371402    value = getIntValue(reader,"index",&ok);
    838 #if XML_PARSER_DEBUG
    839 printf("    index = %d\n", value);
    840 #endif
    8411403    if ( ok && (value != cluster_index) )
    8421404    {
     
    8461408    }
    8471409
    848     // get procs attribute
    849     value = getIntValue(reader,"procs",&ok);
    850 #if XML_PARSER_DEBUG
    851 printf("    procs = %d\n", value);
    852 #endif
    853     if ( ok )
    854     {
    855         cluster[cluster_index]->procs = value;
    856     }
    857     else
    858     {
    859         printf("[XML ERROR] illegal or missing <procs> attribute for cluster %d",
    860                 cluster_index);
    861         exit(1);
    862     }
    863 
    864     cluster_index++;
     1410
     1411    ////////// set pseg_offset attribute
     1412    cluster[cluster_index]->pseg_offset = pseg_index;
     1413    cluster[cluster_index]->proc_offset = proc_index;
     1414    cluster[cluster_index]->coproc_offset = coproc_index;
     1415#if XML_PARSER_DEBUG
     1416printf("    pseg_offset = %d\n", pseg_index);
     1417printf("    proc_offset = %d\n", proc_index);
     1418printf("    coproc_offset = %d\n", coproc_index);
     1419#endif
     1420
     1421    ////////// get psegs, coproc and/or procs
     1422    int status = xmlTextReaderRead(reader);
     1423
     1424    while ( status == 1 )
     1425    {
     1426        const char* tag = (const char*)xmlTextReaderConstName(reader);
     1427
     1428        if      ( strcmp(tag, "pseg")    == 0 ) psegNode(reader);
     1429        else if ( strcmp(tag, "proc")    == 0 ) procNode(reader);
     1430        else if ( strcmp(tag, "coproc")    == 0 ) coprocNode(reader);
     1431        else if ( strcmp(tag, "#text")   == 0 ) { }
     1432        else if ( strcmp(tag, "cluster") == 0 )
     1433        {
     1434#if XML_PARSER_DEBUG
     1435printf("  end cluster %d\n", cluster_index);
     1436#endif
     1437            cluster[cluster_index]->procs = proc_loc_index;
     1438            cluster[cluster_index]->coprocs = coproc_loc_index;
     1439            //psegs = pseg_loc_index is done in psegNode(), so coprocNode() call to getPsegId() success
     1440            cluster_index++;
     1441            return;
     1442        }
     1443        status = xmlTextReaderRead(reader);
     1444    }
    8651445} // end clusterNode()
    8661446
     
    8741454#endif
    8751455
    876     int status = xmlTextReaderRead ( reader );
     1456    int status = xmlTextReaderRead(reader);
    8771457    while ( status == 1 )
    8781458    {
     
    8911471            else
    8921472            {
     1473#if XML_PARSER_DEBUG
     1474printf("  end cluster set\n\n");
     1475#endif
     1476                header->psegs = pseg_index;
     1477                header->procs = proc_index;
     1478                header->irqs  = irq_index;
     1479                header->coprocs = coproc_index;
     1480                header->cp_ports = cp_port_index;
     1481                header->cp_regs = cp_reg_index;
    8931482                return;
    8941483            }
     
    8991488            exit(1);
    9001489        }
    901         status = xmlTextReaderRead ( reader );
     1490        status = xmlTextReaderRead(reader);
    9021491    }
    9031492} // end clusterSetNode()
    904 
    905 ///////////////////////////////////////////
    906 void psegSetNode( xmlTextReaderPtr reader )
    907 {
    908     if ( xmlTextReaderNodeType(reader) == XML_READER_TYPE_END_ELEMENT ) return;
    909 
    910 #if XML_PARSER_DEBUG
    911 printf("  psegs set\n");
    912 #endif
    913 
    914     int status = xmlTextReaderRead ( reader );
    915     while ( status == 1 )
    916     {
    917         const char* tag = (const char*)xmlTextReaderConstName(reader);
    918 
    919         if      ( strcmp(tag,"pseg") == 0    ) psegNode(reader);
    920         else if ( strcmp(tag,"#text") == 0 ) { }
    921         else if ( strcmp(tag,"psegset") == 0  )
    922         {
    923             // checking source file consistency
    924             if ( pseg_index != header->psegs )
    925             {
    926                 printf("[XML ERROR] Wrong number of psegs\n");
    927                 exit(1);
    928             }
    929             else
    930             {
    931                 return;
    932             }
    933         }
    934         else
    935         {
    936             printf("[XML ERROR] Unknown tag in psegset node : %s",tag);
    937             exit(1);
    938         }
    939         status = xmlTextReaderRead ( reader );
    940     }
    941 } // end psegSetNode()
    9421493
    9431494/////////////////////////////////////////////
     
    9501501#endif
    9511502
    952     int status = xmlTextReaderRead ( reader );
     1503    int status = xmlTextReaderRead(reader);
    9531504    while ( status == 1 )
    9541505    {
     
    9671518            else
    9681519            {
     1520#if XML_PARSER_DEBUG
     1521printf("  end global set\n\n");
     1522#endif
    9691523                vseg_loc_index = 0;
    9701524                return;
     
    10711625    }
    10721626
    1073     ////////// get psegs attribute
    1074     value = getIntValue(reader, "psegs", &ok);
    1075     if ( ok )
    1076     {
    1077         if ( value >= MAX_PSEGS )
    1078         {
    1079             printf("[XML ERROR] The number of psegs is larger than %d\n", MAX_PSEGS);
    1080             exit(1);
    1081         }
    1082 #if XML_PARSER_DEBUG
    1083 printf("  psegs = %d\n", value);
    1084 #endif
    1085         header->psegs = value;
    1086     }
    1087     else
    1088     {
    1089         printf("[XML ERROR] illegal or missing <psegs> attribute in header\n");
    1090         exit(1);
    1091     }
    1092 
    10931627    ///////// get ttys attribute
    10941628    value = getIntValue(reader, "ttys", &ok);
     
    11631697    header->signature = IN_MAPPING_SIGNATURE;
    11641698
    1165     int status = xmlTextReaderRead ( reader );
     1699    int status = xmlTextReaderRead(reader);
    11661700    while ( status == 1 )
    11671701    {
     
    11691703
    11701704        if      ( strcmp(tag,"clusterset")   == 0 ) clusterSetNode(reader);
    1171         else if ( strcmp(tag,"psegset")      == 0 ) psegSetNode(reader);
    1172         else if ( strcmp(tag,"globalset")   == 0 ) globalSetNode(reader);
     1705        else if ( strcmp(tag,"globalset")    == 0 ) globalSetNode(reader);
    11731706        else if ( strcmp(tag,"vspaceset")    == 0 ) vspaceSetNode(reader);
    11741707        else if ( strcmp(tag,"#text")        == 0 ) { }
     
    11851718            exit(1);
    11861719        }
    1187         status = xmlTextReaderRead ( reader );
     1720        status = xmlTextReaderRead(reader);
    11881721    }
    11891722} // end headerNode()
     1723   
     1724void BuildTable( int fdout,
     1725               const char* type,
     1726               unsigned int nb_elem,
     1727               unsigned int elem_size,
     1728               char** table)       
     1729{
     1730    unsigned int i;
     1731    unsigned int length;
     1732    // write element
     1733    for ( i = 0 ; i < nb_elem ; i++ )
     1734    {
     1735        length = write(fdout, table[i], elem_size);
     1736   
     1737#if XML_PARSER_DEBUG
     1738printf("Building binary: writing %s %d\n", type, i);
     1739#endif
     1740
     1741        if ( length != elem_size )
     1742        {
     1743            printf("type: %s\n", type);
     1744            perror("error writing");
     1745            exit(1);
     1746        }
     1747    }
     1748}
    11901749
    11911750///////////////////////////
    11921751void  buildBin( int fdout )
    11931752{
    1194     unsigned int    cluster_id;
    1195     unsigned int    pseg_id;
    11961753    unsigned int    vspace_id;
    1197     unsigned int    vseg_id;
    11981754    unsigned int    vobj_id;
    1199     unsigned int    task_id;
    1200 
    12011755    unsigned int    length;
    12021756
     
    12101764    if ( length != sizeof(mapping_header_t) )
    12111765    {
    1212         perror("write header");
     1766        printf("write header error : length = %d \n", length);
    12131767        exit(1);
    12141768    }
    12151769
    12161770    // write clusters
    1217     for ( cluster_id = 0 ; cluster_id < header->clusters ; cluster_id++ )
    1218     {
    1219         length = write(fdout, (char*)cluster[cluster_id], sizeof(mapping_cluster_t));
    1220    
    1221 #if XML_PARSER_DEBUG
    1222 printf("\n*** write cluster %d\n", cluster_id);
    1223 #endif
    1224 
    1225         if ( length != sizeof(mapping_cluster_t) )
    1226         {
    1227             perror("write cluster");
    1228             exit(1);
    1229         }
    1230     }
     1771    BuildTable(fdout, "cluster", cluster_index, sizeof(mapping_cluster_t), (char**) cluster);
    12311772
    12321773    // write psegs
    1233     for ( pseg_id = 0 ; pseg_id < header->psegs ; pseg_id++ )
    1234     {
    1235         length = write(fdout, (char*)pseg[pseg_id], sizeof(mapping_pseg_t));
    1236    
    1237 #if XML_PARSER_DEBUG
    1238 printf("write pseg %d\n", pseg_id);
    1239 #endif
    1240 
    1241         if ( length != sizeof(mapping_pseg_t) )
    1242         {
    1243             perror("write pseg");
    1244             exit(1);
    1245         }
    1246     }
     1774    BuildTable(fdout, "pseg", pseg_index, sizeof(mapping_pseg_t), (char**) pseg);
    12471775
    12481776    // write vspaces
     
    12661794
    12671795    // write vsegs
    1268     for ( vseg_id = 0 ; vseg_id < header->vsegs ; vseg_id++ )
    1269     {
    1270         length = write(fdout, (char*)vseg[vseg_id], sizeof(mapping_vseg_t));
    1271    
    1272 #if XML_PARSER_DEBUG
    1273 printf("write vseg %d\n", vseg_id);
    1274 #endif
    1275 
    1276         if ( length != sizeof(mapping_vseg_t) )
    1277         {
    1278             perror("write vseg");
    1279             exit(1);
    1280         }
    1281     }
     1796    BuildTable(fdout, "vseg", vseg_index, sizeof(mapping_vseg_t), (char**) vseg);
    12821797   
    12831798    // write vobjs
     
    13011816
    13021817    // write tasks
    1303     for ( task_id = 0 ; task_id < header->tasks ; task_id++ )
    1304     {
    1305         length = write(fdout, (char*)task[task_id], sizeof(mapping_task_t));
    1306    
    1307 #if XML_PARSER_DEBUG
    1308 printf("write task %d\n", task_id);
    1309 #endif
    1310 
    1311         if ( length != sizeof(mapping_task_t) )
    1312         {
    1313             perror("write task");
    1314             exit(1);
    1315         }
    1316     }
     1818    BuildTable(fdout, "task", task_index, sizeof(mapping_task_t), (char**) task);
     1819    //building proc
     1820    BuildTable(fdout, "proc", proc_index, sizeof(mapping_proc_t), (char**) proc);
     1821    //building irq
     1822    BuildTable(fdout, "irq", irq_index, sizeof(mapping_irq_t), (char**)irq);
     1823    //building coproc
     1824    BuildTable(fdout, "coproc", coproc_index, sizeof(mapping_coproc_t), (char**)coproc);
     1825    //building cp_port
     1826    BuildTable(fdout, "cp_port", cp_port_index, sizeof(mapping_coproc_port_t),(char**) cp_port);
     1827    //building cp_reg
     1828    BuildTable(fdout, "cp_reg", cp_reg_index, sizeof(mapping_coproc_reg_t), (char**)cp_reg);
     1829
    13171830} // end buildBin()
     1831
     1832/////////////////////////////////////////
     1833// this function set the value of vobj_id
     1834// of the coproc_ports.
     1835///////////////////
     1836void prepareBuild()
     1837{
     1838    unsigned int i;
     1839    for(i=0; i< cp_port_index; i++)
     1840    {
     1841        int vspace_id = getVspaceId( cp_port_vobj_ref[i]->vspace_name );
     1842        if ( vspace_id < 0 )
     1843        {
     1844            printf("[XML ERROR] illegal  <vspacename> for coproc_port %d,\n",
     1845                    i);
     1846            exit(1);
     1847        }
     1848        cp_port[i]->vspaceid = vspace_id;
     1849       
     1850        int vobj_id = getVobjLocId( vspace_id, cp_port_vobj_ref[i]->vobj_name, vspace[vspace_id]->vobjs );
     1851        if ( vobj_id >= 0 )
     1852        {
     1853#if XML_PARSER_DEBUG
     1854printf("coproc_port = %d\n", i);
     1855printf("      vspace_name  = %s\n", cp_port_vobj_ref[i]->vspace_name);
     1856printf("      vobj_name    = %s\n", cp_port_vobj_ref[i]->vobj_name);
     1857printf("      vobj_index   = %d\n", vobj_id);
     1858#endif
     1859            cp_port[i]->vobjlocid = vobj_id;
     1860            assert((vobj[ vspace[vspace_id]->vobj_offset + vobj_id]->type == VOBJ_TYPE_MWMR) && "coproc ports has to refere to a vobj of type MWMR");
     1861        }
     1862        else             
     1863        {
     1864            printf("[XML ERROR] illegal  <vobjname> for coproc_port %d,\n",
     1865                    i);
     1866            exit(1);
     1867        }
     1868       
     1869    }
     1870}
    13181871
    13191872/////////////////////////////////////
     
    13351888    LIBXML_TEST_VERSION;
    13361889
    1337     int              status;
     1890    int status;
    13381891    xmlTextReaderPtr reader = xmlReaderForFile ( argv[1], NULL, 0 );
    13391892
     
    13441897        {
    13451898            const char* tag = (const char*)xmlTextReaderConstName(reader);
     1899
    13461900            if ( strcmp(tag,"mapping_info") == 0 )
    13471901            {
    13481902                headerNode( reader );
     1903                prepareBuild();
    13491904                buildBin( fdout );
    13501905            }
Note: See TracChangeset for help on using the changeset viewer.