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

Last change on this file since 465 was 465, checked in by djay, 10 years ago

Add the optional YAML ZCFG support #4 and the zcfg2yaml converter. Return error messages that enable the service provider to quickly identify the root cause of errors due to configuration file syntax #90. Fix logic in addMapToMap #91. Enable multiple range definition using default and supported blocks. Add the lastest revision number in version.h (available from Python ZOO-API as zoo.VERSION).

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