source: trunk/zoo-project/zoo-kernel/service_conf.y @ 389

Last change on this file since 389 was 379, checked in by djay, 12 years ago

Fix handling of multiple outputs. Small fix to build with bleeding edge gcc. Add missing copyright in service_internal_ms.c/h. Better gesture of session data. Update HISTORY.txt content.

File size: 24.1 KB
Line 
1%{
2//======================================================
3/**
4 * Thx to Jean-Marie CODOL and Naitan GROLLEMUND
5 * copyright 2009 GeoLabs SARL
6 * Author : Gérald FENOY
7 *
8 */
9//======================================================
10
11#include <string>
12#include <stdio.h>
13#include <ctype.h>
14#include <service.h>
15  //#include <vector>
16
17static int tmp_count=1;
18static int defaultsc=0;
19static bool wait_maincontent=true;
20static bool wait_mainmetadata=false;
21static bool wait_metadata=false;
22static bool wait_inputs=false;
23static bool wait_defaults=false;
24static bool wait_supporteds=false;
25static bool wait_outputs=false;
26static bool wait_data=false;
27static int services_c=0;
28static service* my_service=NULL;
29static map* previous_content=NULL;
30static map* current_content=NULL;
31static elements* current_element=NULL;
32static map* scontent=NULL;
33static char* curr_key;
34static int debug=0;
35static int data=-1;
36static int previous_data=0;
37static int current_data=0;
38// namespace
39using namespace std;
40//======================================================
41
42// srerror
43void srerror(const char *s);
44//======================================================
45
46// usage ()
47void usage(void) ;
48//======================================================
49
50// srdebug
51extern int srdebug;
52//======================================================
53
54extern char srtext[];
55
56// srlineno
57extern int srlineno;
58//======================================================
59
60// srin
61extern FILE* srin;
62//======================================================
63
64// srlex
65extern int srlex(void);
66extern int srlex_destroy(void);
67
68//vector<char*> lattribute;
69
70%}
71
72
73
74%union
75{char * s;char* chaine;char* key;char* val;}
76
77// jetons //
78%token <s> ID
79%token <s> CHAINE
80/* STARTXMLDECL et ENDXMLDECL qui sont <?xml et ?>*/
81%token STARTXMLDECL ENDXMLDECL
82//======================================================
83/* version="xxx" et encoding="xxx" */
84%token VERSIONDECL ENCODINGDECL SDDECL
85//======================================================
86/* < et > */
87%token INFCAR SUPCAR
88//======================================================
89/* / = a1  texte "texte" */
90%token SLASH Eq CHARDATA ATTVALUE PAIR SPAIR EPAIR ANID
91%type <chaine> PAIR
92%type <chaine> EPAIR
93%type <chaine> SPAIR
94//======================================================
95/* <!-- xxx -> <? xxx yyy ?> */
96%token PI PIERROR /** COMMENT **/
97//======================================================
98/* <!-- xxx -> <? xxx yyy ?> */
99%token ERREURGENERALE CDATA WHITESPACE NEWLINE
100%type <s> STag
101%type <s> ETag
102%type <s> ANID
103//======================================================
104// %start
105//======================================================
106
107%%
108// document <//===
109//======================================================
110// regle 1
111// on est a la racine du fichier xml
112//======================================================
113document
114 : miscetoile element miscetoile {}
115 | contentetoile processid contentetoile document {}
116 ;
117
118miscetoile
119 : miscetoile PIERROR {  srerror("processing instruction begining with <?xml ?> impossible\n");}
120 | miscetoile PI {}
121 | {}
122 ;
123// element
124//======================================================
125// regle 39
126// OUVRANTE CONTENU FERMANTE obligatoirement
127// ou neutre
128// on ne peut pas avoir Epsilon
129// un fichier xml ne peut pas etre vide ou seulement avec un prolog
130//======================================================
131element
132 : STag contentetoile ETag     
133{
134}
135
136// pour neutre
137// on a rien a faire, meme pas renvoyer l identificateur de balise
138// vu qu'il n y a pas de comparaison d'identificateurs avec un balise jumelle .
139 | EmptyElemTag          {}
140 ;
141
142//======================================================
143// STag
144//======================================================
145// regle 40
146// BALISE OUVRANTE
147// on est obligé de faire appel a infcar et supcar
148// pour acceder aux start conditions DANSBALISE et INITIAL
149//======================================================
150STag
151: INFCAR ID Attributeetoile SUPCAR
152{
153#ifdef DEBUG_SERVICE_CONF
154  fprintf(stderr,"(%s %d) %s\n",__FILE__,__LINE__,$2);
155  fflush(stderr);
156#endif
157  if(my_service->content==NULL){
158#ifdef DEBUG_SERVICE_CONF
159    fprintf(stderr,"NO CONTENT\n");
160#endif
161    addMapToMap(&my_service->content,current_content);
162    freeMap(&current_content);
163    free(current_content);
164    current_content=NULL;
165    my_service->metadata=NULL;
166    wait_maincontent=false;
167  }
168  if(strncasecmp($2,"DataInputs",10)==0){
169    if(wait_mainmetadata==true){
170      addMapToMap(&my_service->metadata,current_content);
171      freeMap(&current_content);
172      free(current_content);
173      current_content=NULL;
174      wait_mainmetadata=false;
175    }
176    if(current_element==NULL){
177#ifdef DEBUG_SERVICE_CONF
178      fprintf(stderr,"(DATAINPUTS - %d) FREE current_element\n",__LINE__);
179#endif
180      freeElements(&current_element);
181      free(current_element);
182#ifdef DEBUG_SERVICE_CONF
183      fprintf(stderr,"(DATAINPUTS - %d) ALLOCATE current_element\n",__LINE__);
184#endif
185      current_element=NULL;
186      current_element=(elements*)malloc(ELEMENTS_SIZE);
187      current_element->name=NULL;
188      current_element->content=NULL;
189      current_element->metadata=NULL;
190      current_element->format=NULL;
191      current_element->defaults=NULL;
192      current_element->supported=NULL;
193      current_element->next=NULL;
194    }
195    wait_inputs=true;
196    current_data=1;
197    previous_data=1;
198  }
199  else
200    if(strncasecmp($2,"DataOutputs",11)==0){
201      if(wait_inputs==true){
202#ifdef DEBUG_SERVICE_CONF
203        fprintf(stderr,"(DATAOUTPUTS %d) DUP INPUTS current_element\n",__LINE__);
204        fprintf(stderr,"CURRENT_ELEMENT\n");
205        dumpElements(current_element);
206        fprintf(stderr,"SERVICE INPUTS\n");
207        dumpElements(my_service->inputs);
208        dumpService(my_service);
209#endif 
210        if(my_service->inputs==NULL){
211          my_service->inputs=dupElements(current_element);
212          my_service->inputs->next=NULL;
213        }
214        else if(current_element!=NULL && current_element->name!=NULL){
215          addToElements(&my_service->inputs,current_element);
216        }
217#ifdef DEBUG_SERVICE_CONF
218        fprintf(stderr,"CURRENT_ELEMENT\n");
219        dumpElements(current_element);
220        fprintf(stderr,"SERVICE INPUTS\n");
221        dumpElements(my_service->inputs);
222        fprintf(stderr,"(DATAOUTPUTS) FREE current_element\n");
223#endif
224        freeElements(&current_element);
225        free(current_element);
226        current_element=NULL;
227        wait_inputs=false;
228      }
229      if(current_element==NULL){
230#ifdef DEBUG_SERVICE_CONF
231        fprintf(stderr,"(DATAOUTPUTS - %d) ALLOCATE current_element (%s)\n",__LINE__,$2);
232        fflush(stderr);
233#endif
234        current_element=(elements*)malloc(ELEMENTS_SIZE);
235        current_element->name=NULL;
236        current_element->content=NULL;
237        current_element->metadata=NULL;
238        current_element->format=NULL;
239        current_element->defaults=NULL;
240        current_element->supported=NULL;
241        current_element->next=NULL;
242      }
243      wait_outputs=true;
244      current_data=2;
245      previous_data=2;
246    }
247    else
248      if(strncasecmp($2,"MetaData",8)==0){
249        previous_data=current_data;
250        current_data=3;
251        if(current_element!=NULL){
252#ifdef DEBUG_SERVICE_CONF
253          fprintf(stderr,"add current_content to current_element->content\n");
254          fprintf(stderr,"LINE %d",__LINE__);
255#endif
256          addMapToMap(&current_element->content,current_content);
257          freeMap(&current_content);
258          free(current_content);
259          if(previous_data==1 || previous_data==2)
260            wait_metadata=true;
261          else
262            wait_mainmetadata=true;
263        }
264        else{
265          if(previous_data==1 || previous_data==2)
266            wait_metadata=true;
267          else
268            wait_mainmetadata=true;
269        }
270        current_content=NULL;
271      }
272      else
273        if(strncasecmp($2,"ComplexData",11)==0 || strncasecmp($2,"LiteralData",10)==0
274           || strncasecmp($2,"ComplexOutput",13)==0 || strncasecmp($2,"LiteralOutput",12)==0
275           || strncasecmp($2,"BoundingBoxOutput",13)==0 || strncasecmp($2,"BoundingBoxData",12)==0){
276          current_data=4;
277          if(wait_metadata==true){
278            if(current_content!=NULL){
279#ifdef DEBUG_SERVICE_CONF
280              fprintf(stderr,"add current_content to current_element->content\n");
281              fprintf(stderr,"LINE %d",__LINE__);
282#endif
283              addMapToMap(&current_element->metadata,current_content);
284              current_element->next=NULL;
285              if($2!=NULL)
286                current_element->format=strdup($2);
287             
288              current_element->defaults=NULL;
289              current_element->supported=NULL;
290              freeMap(&current_content);
291              free(current_content);
292            }
293          }else{
294            // No MainMetaData
295            addMapToMap(&current_element->content,current_content);
296            freeMap(&current_content);
297            free(current_content);
298            current_element->metadata=NULL;
299            current_element->next=NULL;
300            if($2!=NULL)
301              current_element->format=strdup($2);
302            current_element->defaults=NULL;
303            current_element->supported=NULL;
304          }
305          current_content=NULL;
306          wait_metadata=false;
307        }
308        else
309          if(strncasecmp($2,"Default",7)==0){
310            wait_defaults=true;
311            current_data=5;
312          }
313          else
314            if(strncasecmp($2,"Supported",9)==0){
315              wait_supporteds=true;
316              if(wait_defaults==true){
317                defaultsc++;
318              }
319              current_data=5;
320            }
321#ifdef DEBUG_SERVICE_CONF
322  printf("* Identifiant : %s\n",$2);
323  fflush(stdout);
324#endif
325}
326 ;
327
328//======================================================
329// Attributeetoile
330//======================================================
331// regle 41
332// une liste qui peut etre vide d'attributs
333// utiliser la récursivité a gauche
334//======================================================
335Attributeetoile
336 : Attributeetoile attribute  {}
337 |                                {/* Epsilon */}
338 ;
339
340//======================================================
341// attribute
342//======================================================
343// regle 41
344// un attribut est compose d'un identifiant
345// d'un "="
346// et d'une définition de chaine de caractere
347// ( "xxx" ou 'xxx' )
348//======================================================
349attribute
350 : ID Eq ATTVALUE               
351{
352#ifdef DEBUG_SERVICE_CONF
353  printf ("attribute : %s\n",$1) ;
354#endif
355}
356 ;
357
358//======================================================
359// EmptyElemTag
360//======================================================
361// regle 44
362// ICI ON DEFINIT NEUTRE
363// on ne renvoie pas de char*
364// parce qu'il n'y a pas de comparaisons a faire
365// avec un identifiant d'une balise jumelle
366//======================================================
367EmptyElemTag
368 : INFCAR ID Attributeetoile SLASH SUPCAR       {
369#ifdef DEBUG_SERVICE_CONF
370  fprintf(stderr,"(%s %d)\n",__FILE__,__LINE__);
371#endif
372   if(strncasecmp($2,"Default",7)==0){
373     wait_defaults=false;
374     current_data=previous_data;
375     if(current_element->defaults==NULL){
376       current_element->defaults=(iotype*)malloc(IOTYPE_SIZE);
377       current_element->defaults->content=NULL;
378     }
379     addMapToMap(&current_element->defaults->content,current_content);
380     freeMap(&current_content);
381     free(current_content);
382     current_element->defaults->next=NULL;
383     wait_defaults=false;
384     current_content=NULL;
385     current_element->supported=NULL;
386     current_element->next=NULL;
387   }
388 }
389 ;
390
391//======================================================
392// ETag
393//======================================================
394// regle 42
395// BALISE FERMANTE
396// les separateurs après ID sont filtrés
397//======================================================
398ETag
399 : INFCAR SLASH ID SUPCAR
400{
401#ifdef DEBUG_SERVICE_CONF
402  fprintf(stderr,"(%s %d)\n",__FILE__,__LINE__);
403#endif
404  if(strcmp($3,"DataInputs")==0){
405    current_data=1;
406  }
407  if(strcmp($3,"DataOutputs")==0){
408    current_data=2;
409  }
410  if(strcmp($3,"MetaData")==0){
411    current_data=previous_data;
412  }
413  if(strcmp($3,"ComplexData")==0 || strcmp($3,"LiteralData")==0
414     || strcmp($3,"ComplexOutput")==0 || strcmp($3,"LiteralOutput")==0){
415    current_content=NULL;
416  }
417  if(strcmp($3,"Default")==0){
418    current_data=previous_data;
419    if(current_element->defaults==NULL){
420      current_element->defaults=(iotype*)malloc(IOTYPE_SIZE);
421      current_element->defaults->content=NULL;
422    }
423    addMapToMap(&current_element->defaults->content,current_content);
424    freeMap(&current_content);
425    free(current_content);
426    current_element->defaults->next=NULL;
427    wait_defaults=false;
428    current_content=NULL;
429    current_element->supported=NULL;
430    current_element->next=NULL;
431  }
432  if(strcmp($3,"Supported")==0){
433    current_data=previous_data;
434    if(current_element->supported==NULL){
435      if(current_content!=NULL){
436        current_element->supported=(iotype*)malloc(IOTYPE_SIZE);
437        current_element->supported->content=NULL;
438        addMapToMap(&current_element->supported->content,current_content);
439        freeMap(&current_content);
440        free(current_content);
441        current_element->supported->next=NULL;
442        current_content=NULL;
443      }else{
444        current_element->supported=NULL;
445        current_element->next=NULL;
446      }
447    }
448    else{
449#ifdef DEBUG_SERVICE_CONF
450      fprintf(stderr,"SECOND SUPPORTED FORMAT !!!!\n");
451#endif
452      addMapToIoType(&current_element->supported,current_content);
453      freeMap(&current_content);
454      free(current_content);
455      current_content=NULL;
456#ifdef DEBUG_SERVICE_CONF
457      dumpElements(current_element);
458      fprintf(stderr,"SECOND SUPPORTED FORMAT !!!!\n");
459#endif
460    }
461    current_content=NULL;
462  }
463}
464 ;
465
466//======================================================
467// contentetoile
468//======================================================
469// regle 43
470// ENTRE 2 BALISES
471// entre 2 balises, on peut avoir :
472// --- OUVRANTE CONTENU FERMANTE (recursivement !)
473// --- DU TEXTE quelconque
474// --- COMMENTS
475// --- DES PROCESSES INSTRUCTIONS
476// --- /!\ il peut y avoir une processing instruction invalide ! <?xml
477// --- EPSILON
478// ### et/ou tout ca a la suite en nombre indeterminé
479// ### donc c'est un operateur etoile (*)
480//======================================================
481contentetoile
482: contentetoile element           {}
483 | contentetoile PIERROR                  {srerror("processing instruction <?xml ?> impossible\n");}
484 | contentetoile PI                       {}
485///// on filtre les commentaires | contentetoile comment              {}
486 | contentetoile NEWLINE {/*printf("NEWLINE FOUND !!");*/}
487 | contentetoile pair {}
488 | contentetoile processid {}
489 | contentetoile texteinterbalise         {}
490 | contentetoile CDATA {} 
491 | {/* Epsilon */}
492 ;
493
494//======================================================
495// texteinterbalise
496//======================================================
497// regle 14
498// DU TEXTE quelconque
499// c'est du CHARDATA
500// il y a eut un probleme avec ID,
501// on a mis des starts conditions,
502// maintenant on croise les ID dans les dbalises
503// et des CHARDATA hors des balises
504//======================================================
505texteinterbalise
506 : CHARDATA             {}
507 ;
508//======================================================
509
510pair: PAIR { if(debug) fprintf(stderr,"PAIR FOUND !!\n");if(curr_key!=NULL){free(curr_key);curr_key=NULL;} }
511| EPAIR {
512#ifdef DEBUG_SERVICE_CONF
513  fprintf(stderr,"(%s %d)\n",__FILE__,__LINE__);
514  fprintf(stderr,"EPAIR FOUND !! \n");
515  fprintf(stderr,"[%s=>%s]\n",curr_key,$1);
516  fprintf(stderr,"[ZOO: service_conf.y line %d free(%s)]\n",__LINE__,curr_key);
517  dumpMap(current_content);
518  fflush(stderr);
519#endif
520  if($1!=NULL){
521    if(current_content==NULL){
522#ifdef DEBUG_SERVICE_CONF
523      fprintf(stderr,"[ZOO: service_conf.y line %d free(%s)]\n",__LINE__,curr_key);
524#endif
525      current_content=createMap(curr_key,$1);
526#ifdef DEBUG_SERVICE_CONF
527      fprintf(stderr,"[ZOO: service_conf.y line %d free(%s)]\n",__LINE__,curr_key);
528#endif
529    }
530    else{
531#ifdef DEBUG_SERVICE_CONF
532      dumpMap(current_content);
533      fprintf(stderr,"addToMap(current_content,%s,%s) !! \n",curr_key,$1);
534#endif
535      addToMap(current_content,curr_key,$1);
536#ifdef DEBUG_SERVICE_CONF
537      fprintf(stderr,"addToMap(current_content,%s,%s) end !! \n",curr_key,$1);
538#endif   
539    }
540  }
541#ifdef DEBUG_SERVICE_CONF
542  fprintf(stderr,"[%s=>%s]\n",curr_key,$1);
543  fprintf(stderr,"[ZOO: service_conf.y line %d free(%s)]\n",__LINE__,curr_key);
544  dumpMap(current_content);
545  fflush(stderr);
546#endif
547  if(curr_key!=NULL){
548    free(curr_key);
549    curr_key=NULL;
550  }
551  }
552| SPAIR  { if(curr_key!=NULL) {free(curr_key);curr_key=NULL;} if($1!=NULL) curr_key=strdup($1);if(debug) fprintf(stderr,"SPAIR FOUND !!\n"); }
553 ;
554
555
556processid
557: ANID  {
558#ifdef DEBUG_SERVICE_CONF
559  fprintf(stderr,"(%s %d)\n",__FILE__,__LINE__);
560#endif
561  if(data==-1){
562    data=1;
563    if($1!=NULL){
564      char *cen=strdup($1);
565      my_service->name=(char*)malloc((strlen(cen)-1)*sizeof(char*));
566      cen[strlen(cen)-1]=0;
567      cen+=1;
568      sprintf(my_service->name,"%s",cen);
569      cen-=1;
570      free(cen);
571      my_service->content=NULL;
572      my_service->metadata=NULL;
573      my_service->inputs=NULL;
574      my_service->outputs=NULL;
575    }
576  } else {
577    if(current_data==1){
578      if(my_service->content!=NULL && current_element->name!=NULL){
579        if(my_service->inputs==NULL){
580          my_service->inputs=dupElements(current_element);
581          my_service->inputs->next=NULL;
582          tmp_count++;
583        }
584        else{
585          addToElements(&my_service->inputs,current_element);
586        }
587#ifdef DEBUG_SERVICE_CONF
588        fprintf(stderr,"(%s %d)FREE current_element (after adding to allread existing inputs)",__FILE__,__LINE__);
589        dumpElements(current_element);
590        fprintf(stderr,"(%s %d)FREE current_element (after adding to allread existing inputs)",__FILE__,__LINE__);
591        dumpElements(my_service->inputs);
592#endif
593        freeElements(&current_element);
594        free(current_element);
595        current_element=NULL;
596#ifdef DEBUG_SERVICE_CONF
597        fprintf(stderr,"(DATAINPUTS - 489) ALLOCATE current_element\n");
598#endif
599        current_element=(elements*)malloc(ELEMENTS_SIZE);
600        current_element->name=NULL;
601        current_element->content=NULL;
602        current_element->metadata=NULL;
603        current_element->format=NULL;
604        current_element->defaults=NULL;
605        current_element->supported=NULL;
606        current_element->next=NULL;
607      }
608      if(current_element->name==NULL){
609#ifdef DEBUG_SERVICE_CONF
610        fprintf(stderr,"NAME IN %s (current - %s)\n",
611                $1,current_element->name);
612#endif
613        wait_inputs=true;
614#ifdef DEBUG_SERVICE_CONF
615        fprintf(stderr,"(DATAINPUTS - 501) SET NAME OF current_element\n");
616#endif
617        if($1!=NULL){
618          char *cen=strdup($1);
619          current_element->name=(char*)malloc((strlen(cen)-1)*sizeof(char*));
620          cen[strlen(cen)-1]=0;
621          cen+=1;
622          sprintf(current_element->name,"%s",cen);
623          cen-=1;
624          free(cen);
625#ifdef DEBUG_SERVICE_CONF
626          fprintf(stderr,"NAME IN %s (current - %s)\n",$1,current_element->name);
627#endif
628          current_element->content=NULL;
629          current_element->metadata=NULL;
630          current_element->format=NULL;
631          current_element->defaults=NULL;
632          current_element->supported=NULL;
633          current_element->next=NULL;
634#ifdef DEBUG_SERVICE_CONF
635          fprintf(stderr,"NAME IN %s (current - %s)\n",$1,current_element->name);
636#endif
637        }
638      }
639    }
640    else
641      if(current_data==2){
642        wait_outputs=true;
643        if(wait_inputs){
644          if(current_element!=NULL && current_element->name!=NULL){
645            if(my_service->outputs==NULL){
646              my_service->outputs=dupElements(current_element);
647              my_service->outputs->next=NULL;
648            }
649            else{
650#ifdef DEBUG_SERVICE_CONF
651              fprintf(stderr,"LAST NAME IN %s (current - %s)\n",$1,current_element->name);
652#endif
653              addToElements(&my_service->outputs,current_element);
654            }
655#ifdef DEBUG_SERVICE_CONF
656            dumpElements(current_element);
657            fprintf(stderr,"(DATAOUTPUTS) FREE current_element %s %i\n",__FILE__,__LINE__);
658#endif
659            freeElements(&current_element);
660            free(current_element);
661            current_element=NULL;
662#ifdef DEBUG_SERVICE_CONF
663            fprintf(stderr,"(DATAOUTPUTS -%d) ALLOCATE current_element %s \n",__LINE__,__FILE__);
664#endif
665            current_element=(elements*)malloc(ELEMENTS_SIZE);
666            current_element->name=NULL;
667            current_element->content=NULL;
668            current_element->metadata=NULL;
669            current_element->format=NULL;
670            current_element->defaults=NULL;
671            current_element->supported=NULL;
672            current_element->next=NULL;
673          }
674          if(current_element->name==NULL){
675#ifdef DEBUG_SERVICE_CONF
676            fprintf(stderr,"NAME OUT %s\n",$1);
677            fprintf(stderr,"(DATAOUTPUTS - %d) SET NAME OF current_element\n",__LINE__);
678#endif
679            if($1!=NULL){
680              char *cen=strdup($1);
681              current_element->name=(char*)malloc((strlen(cen)-1)*sizeof(char));
682              cen[strlen(cen)-1]=0;
683              cen+=1;
684              sprintf(current_element->name,"%s",cen);
685              cen-=1;
686              free(cen);
687              current_element->content=NULL;
688              current_element->metadata=NULL;
689              current_element->format=NULL;
690              current_element->defaults=NULL;
691              current_element->supported=NULL;
692              current_element->next=NULL;
693            }
694          }
695
696          current_content=NULL;
697        }
698        else
699          if(current_element!=NULL && current_element->name!=NULL){
700            if(my_service->outputs==NULL)
701              my_service->outputs=dupElements(current_element);
702            else
703              addToElements(&my_service->outputs,current_element);
704#ifdef DEBUG_SERVICE_CONF
705            fprintf(stderr,"ADD TO OUTPUTS Elements\n");
706            dupElements(current_element);
707#endif
708            freeElements(&current_element);
709            free(current_element);
710            current_element=NULL;
711            current_element=(elements*)malloc(ELEMENTS_SIZE);
712            char *cen=strdup($1);
713            current_element->name=(char*)malloc((strlen(cen)-1)*sizeof(char));
714            cen[strlen(cen)-1]=0;
715            cen+=1;
716            sprintf(current_element->name,"%s",cen);
717            cen-=1;
718            free(cen);
719            current_element->content=NULL;
720            current_element->metadata=NULL;
721            current_element->format=NULL;
722            current_element->defaults=NULL;
723            current_element->supported=NULL;
724            current_element->next=NULL;
725          }
726          else{
727#ifdef DEBUG_SERVICE_CONF
728            fprintf(stderr,"NAME OUT %s\n",$1);
729            fprintf(stderr,"(DATAOUTPUTS - %d) SET NAME OF current_element %s\n",__LINE__,$1);
730#endif
731            if($1!=NULL){
732              char *cen=strdup($1);
733              current_element->name=(char*)malloc((strlen(cen))*sizeof(char*));
734              cen[strlen(cen)-1]=0;
735#ifdef DEBUG
736              fprintf(stderr,"tmp %s\n",cen);
737#endif
738              cen+=1;
739              sprintf(current_element->name,"%s",cen);
740              cen-=1;
741              free(cen);
742              current_element->content=NULL;
743              current_element->metadata=NULL;
744              current_element->format=NULL;
745              current_element->defaults=NULL;
746              current_element->supported=NULL;
747              current_element->next=NULL;
748            }
749          }
750        wait_inputs=false;
751        wait_outputs=true;
752        //wait_outputs=true;
753      }
754  }
755 }
756 ;
757
758%%
759
760// srerror
761//======================================================
762/* fonction qui affiche l erreur si il y en a une */
763//======================================================
764void srerror(const char *s)
765{
766  if(debug)
767    fprintf(stderr,"\nligne %d : %s\n",srlineno,s);
768}
769
770/**
771 * getServiceFromFile :
772 * set service given as second parameter with informations extracted from the
773 * definition file.
774 */
775int getServiceFromFile(const char* file,service** service){
776
777  freeMap(&previous_content);
778  previous_content=NULL;
779  freeMap(&current_content);
780  current_content=NULL;
781  freeMap(&scontent);
782#ifdef DEBUG_SERVICE_CONF
783  fprintf(stderr,"(STARTING)FREE current_element\n");
784#endif
785  freeElements(&current_element);
786  free(current_element);
787  current_element=NULL;
788  my_service=NULL;
789  scontent=NULL;
790
791  wait_maincontent=true;
792  wait_mainmetadata=false;
793  wait_metadata=false;
794  wait_inputs=false;
795  wait_defaults=false;
796  wait_supporteds=false;
797  wait_outputs=false;
798  wait_data=false;
799  data=-1;
800  previous_data=1;
801  current_data=0;
802 
803  my_service=*service;
804
805  srin = fopen(file,"r");
806  if (srin==NULL){
807    fprintf(stderr,"error : file not found\n") ;
808    return -1;
809  }
810
811  int resultatYYParse = srparse() ;
812 
813  if(wait_outputs && current_element!=NULL && current_element->name!=NULL){
814    if(my_service->outputs==NULL){     
815#ifdef DEBUG_SERVICE_CONF
816      fprintf(stderr,"(DATAOUTPUTS - %d) DUP current_element\n",__LINE__);
817#endif
818      my_service->outputs=dupElements(current_element);
819      my_service->outputs->next=NULL;
820    }
821    else{
822#ifdef DEBUG_SERVICE_CONF
823      fprintf(stderr,"(DATAOUTPUTS - %d) COPY current_element\n",__LINE__);
824#endif
825      addToElements(&my_service->outputs,current_element);
826    }
827#ifdef DEBUG_SERVICE_CONF
828    fprintf(stderr,"(DATAOUTPUTS - %d) FREE current_element\n",__LINE__);
829#endif
830    freeElements(&current_element);
831    free(current_element);
832    current_element=NULL;
833#ifdef DEBUG_SERVICE_CONF
834    fprintf(stderr,"(DATAOUTPUTS - %d) FREE current_element\n",__LINE__);
835#endif
836  }
837  if(current_element!=NULL){
838    freeElements(&current_element);
839    free(current_element);
840    current_element=NULL;
841  }
842  if(current_content!=NULL){
843    freeMap(&current_content);
844    free(current_content);
845    current_content=NULL;
846  }
847  fclose(srin);
848#ifdef DEBUG_SERVICE_CONF
849  dumpService(my_service);
850#endif
851  *service=my_service;
852
853#ifndef WIN32
854  srlex_destroy();
855#endif
856  return resultatYYParse;
857}
Note: See TracBrowser for help on using the repository browser.

Search

ZOO Sponsors

http://www.zoo-project.org/trac/chrome/site/img/geolabs-logo.pnghttp://www.zoo-project.org/trac/chrome/site/img/neogeo-logo.png http://www.zoo-project.org/trac/chrome/site/img/apptech-logo.png http://www.zoo-project.org/trac/chrome/site/img/3liz-logo.png http://www.zoo-project.org/trac/chrome/site/img/gateway-logo.png

Become a sponsor !

Knowledge partners

http://www.zoo-project.org/trac/chrome/site/img/ocu-logo.png http://www.zoo-project.org/trac/chrome/site/img/gucas-logo.png http://www.zoo-project.org/trac/chrome/site/img/polimi-logo.png http://www.zoo-project.org/trac/chrome/site/img/fem-logo.png http://www.zoo-project.org/trac/chrome/site/img/supsi-logo.png http://www.zoo-project.org/trac/chrome/site/img/cumtb-logo.png

Become a knowledge partner

Related links

http://zoo-project.org/img/ogclogo.png http://zoo-project.org/img/osgeologo.png