source: anr/gantt.l @ 300

Last change on this file since 300 was 300, checked in by coach, 14 years ago

1) Ajout des parters entre () pour les sous taches.
2) Ajout des liens sur les livrables dans les taches.
3) Sorties d'un point csv
4) Regrouppement des livrables evaluation
5) Ajout du D840
6) MAJ des effort de l'UPMC

  • Property svn:keywords set to Revision HeadURL Id
File size: 46.1 KB
Line 
1%{
2#define COLOR_Milestone  "gtcMilestone"
3#define COLOR_BOX_HEAVY "gtcBoxHeavy"
4#define COLOR_BOX_LIGHT "gtcBoxLight"
5
6#define PICT_TOPSEP   0.0
7#define PICT_BOTSEP   3.0
8#define PICT_LEFTSEP  2.0
9#define PICT_RIGHTSEP 3.0
10#define PICT_VSEP     2.0
11#define PICT_HSEP     2.0
12
13#define PICT_MONTHHEIGHT 5  // police height
14#define PICT_MONTHWIDTH  (10./3.)
15
16#define TASK_VSEP  2
17#define TASK_BGC0       "gtcTaskBG0"
18#define TASK_BGC1       "gtcTaskBG1"
19#define TASK_TITLEHEIGHT 6.
20#define TASK_TITLEFONTHEIGHT 2.
21
22#define DELIVRABLE_VSEP   1
23#define DELIVRABLE_HEIGHT 3
24#define DELIVRABLE_LABELWIDTH  7.5
25#define DELIVRABLE_LABELHEIGHT DELIVRABLE_HEIGHT
26#define DELIVRABLE_TITLEWIDTH  38
27#define DELIVRABLE_TITLEHEIGHT DELIVRABLE_HEIGHT
28#define DELIVRABLE_BOXHEIGHT   (DELIVRABLE_HEIGHT)
29
30char* task_names[] = {
31    0,
32    "Project management",
33    "Backbone infrastructure",
34    "System generation",
35    "HAS front-end",
36    "HAS back-end",
37    "PC/FPGA communication middleware",
38    "Industrial demonstrators",
39    "Dissemination",
40    0
41};
42char* subtask_names[20][20];
43char* get_subtask_name(int tn, int stn)
44{
45    char* ret=subtask_names[tn][stn];
46    if (ret==0)  {
47        fprintf(stderr,"ERROR: no name found for st%d-%d sub-task.\n",tn,stn);
48        return "";
49    } else
50        return ret;
51}
52
53struct partner_def { char *key, *name, *fnfull, *fnshort; } partner_table[] = {
54    { "UNKNOW" ,"relax"  ,0                             ,0                        },
55    { "irisa"  ,"irisa"  ,"table_inria_cairn_full.tex"  ,"table_inria_cairn_short.tex"  },
56    { "lip"    ,"lip"    ,"table_inria_compsys_full.tex","table_inria_compsys_short.tex"    },
57    { "tima"   ,"tima"   ,"table_tima_full.tex"         ,"table_tima_short.tex"   },
58    { "ubs"    ,"ubs"    ,"table_ubs_full.tex"          ,"table_ubs_short.tex"    },
59    { "upmc"   ,"upmc"   ,"table_upmc_full.tex"         ,"table_upmc_short.tex"   },
60    { "bull"   ,"bull"   ,"table_bull_full.tex"         ,"table_bull_short.tex"   },
61    { "thales" ,"thales" ,"table_thales_full.tex"       ,"table_thales_short.tex" },
62    { "mds"    ,"mds"    ,"table_mds_full.tex"          ,"table_mds_short.tex"   },
63    { 0        ,0        ,0                             ,0                        },
64};
65
66typedef struct _Tlivrable {
67    char v;            // 0, 1, 2, ..., F
68    char* kind;
69    char* title;
70    int   bm,em;       // mois de bebut et de fin
71    double hman[3];    // nombre de mh par an
72    int tn,stn,dn,vn;  // task, sub-task, number
73    int    leader;     // 1: the partner leads this livrable
74                       // 0: the partner helps for this livrable
75    int    partner;    // index dans partner_table
76    // these fields are filled by the program for data[tn][0][0][0]
77    double task_y;           // top of task
78    double task_dy;          // bot of task is task_y+task_dy
79    double task_y_del;       // delivrables start at task_y+task_y_del
80    double nbma[3];          // durée en mois par annee
81    // these fields are filled by the program for data[tn][stn][dn][0]
82    struct _Tlivrable // versions of the livrable
83            **vers; // null termiated (vers[i] = data[tn][stn][dn][j])
84                    // this->leader == 1
85                    // vers[0] = this
86                    // vers[i]->leadaer == this->leader
87                    // vers[i]->partner == this->partner
88    int    nbvers;  // nombre de vers
89    double height;     // height of livrable
90    // int del_bm,del_em;    // mois de bebut et de fin cummule
91    // these fields are filled by the program for all elements
92    int   nbTitleLines;
93    char* titleLines[5]; // null termiated
94    struct _Tlivrable // participant to the livrable
95            **part; // null termiated (vers[i] = data[tn][stn][dn][j])
96                    // this->leader == 1
97                    // vers[i] != this
98                    // vers[i]->leader ==  0
99                    // vers[i]->partner != this->partner
100    int    nbpart;  // nombre de vers
101} Tlivrable;
102
103#define T_MAX 10
104#define S_MAX 10
105#define D_MAX 10
106#define V_MAX 10
107typedef struct _Tdata {
108    FILE*      os;
109    Tlivrable* ls[T_MAX][S_MAX][D_MAX][V_MAX];
110} Tdata;
111Tdata  data_org;
112Tdata* curr;
113
114Tdata* data_new(int *tnplus, int *tnmoins)
115{
116    int i,skip;
117    int tn,stn,dn,v;
118    Tdata* data = malloc(sizeof(*data));
119    memset(data,0,sizeof(*data));
120    for (tn=0 ; tn<T_MAX ; tn++)
121    for (stn=0; stn<S_MAX; stn++)
122    for (dn=0; dn<D_MAX; dn++)
123    for (v=0; v<V_MAX; v++) {
124        if ( data_org.ls[tn][stn][dn][v]==0 ) continue;
125        // tnplus treatment
126        skip = 0;
127        if (tnplus!=0) {
128            skip=1;
129            for (i=0 ; tnplus[i]!=-1 ; i++) {
130                if ( tnplus[i]==data_org.ls[tn][stn][dn][v]->tn ) {
131                    skip=0;
132                    break;
133        }   }   }
134        if (skip) continue;
135        // tnmoins treatment
136        skip = 0;
137        if (tnmoins!=0) {
138            for (i=0 ; tnmoins[i]!=-1 ; i++) {
139//fprintf(stderr,"i=%d data_org.ls[tn][stn][dn][v]->tn=%d tnmoins[i]=%d\n",i,data_org.ls[tn][stn][dn][v]->tn,tnmoins[i]);
140                if ( tnmoins[i]==data_org.ls[tn][stn][dn][v]->tn ) {
141                    skip=1;
142                    break;
143        }   }   }
144//fprintf(stderr,"selected: [tn][stn][dn][v]=%d,%d,%d,%d skip=%d\n",tn,stn,dn,v,skip);
145        if (skip) continue;
146        Tlivrable* l=malloc(sizeof(*l));
147        *l = *data_org.ls[tn][stn][dn][v];
148        data->ls[tn][stn][dn][v] = l;
149//fprintf(stderr,"selected: [tn][stn][dn][v]=%d,%d,%d,%d\n",tn,stn,dn,v);
150    }
151    return data;
152}
153
154int milestones[100];
155
156char* gen_label_base(char* buf,Tlivrable*p)
157    { if (p->dn >=0) sprintf(buf,"D%d%d%d",p->tn,p->stn,p->dn); else sprintf(buf,""); return buf; }
158char* gen_label_vers(char* buf,Tlivrable*p)
159    { if (p->nbvers<=1) strcpy(buf,""); else sprintf(buf,"V%c",p->v); return buf; }
160char* gen_label_full(char* buf,Tlivrable*p)
161    { char b[100],v[100]; gen_label_base(b,p); gen_label_vers(v,p);
162      sprintf(buf,"%s%s%s",b,*v?"-":"",v); return buf; }
163
164void print_put(double x,double y, const char* object)
165    { fprintf(curr->os,"\\put(%.2f,%.2f){%s}\n",x,y,object); }
166void print_hline(double x,double y, double len, const char* color)
167{
168    char object[1024];
169    if (color!=0) { fprintf(curr->os,"\\bgroup\\color{%s}\n",color); }
170    sprintf(object,"\\line(1,0){%.2f}",len);
171    print_put(x,y,object);
172    if (color!=0) { fprintf(curr->os,"\\egroup\n"); }
173}
174void print_vline(double x,double y, double len, const char* color)
175{
176    char object[1024];
177    if (color!=0) { fprintf(curr->os,"\\bgroup\\color{%s}\n",color); }
178    sprintf(object,"\\line(0,1){%.2f}",len);
179    print_put(x,y,object);
180    if (color!=0) { fprintf(curr->os,"\\egroup\n"); }
181}
182void print_box(
183    int filled, char* vers, // vers may be 0,
184    double x,double y, double dx, double dy,
185    const char* boxcolor,  // may be 0 (default COLOR_BOX_HEAVY)
186    const char* bgcolor,   // may be 0 (not set)
187    const char* textcolor //  may be 0 (black)
188){
189    double tn=.4;
190    char object[1024];
191    if ( boxcolor==0 ) boxcolor = COLOR_BOX_HEAVY;
192    if ( filled==1 ) {
193        sprintf(object,
194            "\\fcolorbox{black}{%s}{\\makebox(%.2f,%.2f){}}",
195                boxcolor,dx-2-tn,dy-2-tn);
196        print_put(x,y+1,object);
197    } else {
198        double tn2=tn/2;
199        double e=.1;
200        fprintf(curr->os,"\\bgroup\\color{%s}\n",boxcolor);
201        fprintf(curr->os,"\\linethickness{%.2fmm}\n",tn);
202        print_hline(x+tn2-e ,y,    dx     ,0);
203        print_hline(x+tn2-e ,y+dy, dx     ,0);
204        print_vline(x+tn-e  ,y+e,  dy-2*e ,0);
205        print_vline(x+dx-2*e,y+e,  dy-2*e ,0);
206        fprintf(curr->os,"\\egroup\n");
207    }
208    if (vers) {
209        sprintf(object,"\\begin{tiny}\\textbf{%s}\\end{tiny}",vers);
210        print_put(x+1,y+.5,object);
211    }
212}
213
214void gen_titleLines(Tlivrable*p)
215{
216    const char* macro="\\ganttlf";
217    char* pc = p->title;
218    char* pc2;
219
220    if (pc==0) return;
221   
222    while ( (pc2=strstr(pc,macro))!=0 ) {
223        char c = *pc2;
224        *pc2 = 0;
225        p->titleLines[p->nbTitleLines]=strdup(pc);
226        p->nbTitleLines+=1;
227        *pc2=c;
228        pc=pc2+strlen(macro);
229    }
230    p->titleLines[p->nbTitleLines]=strdup(pc);
231    p->nbTitleLines+=1;
232}
233%}
234
235%option noyywrap
236
237%%
238 int tn,stn,dn,v,bm,em; char* title; char* kind;
239 double an[3];
240 char*  an_comment;
241 int    leader;
242 int    partner;
243#.*\n   ;
244L=1       { leader=1; }
245L=0       { leader=0; }
246T=[0-9]+  { tn=atoi(yytext+2); }
247S=[0-9]+  { stn=atoi(yytext+2); }
248D=[0-9]+  { dn=atoi(yytext+2); }
249V=V[1-8F] { v=yytext[3]; }
250ML=[0-9]+ {
251        int i;
252        for (i=0 ; milestones[i]!=0 ; i++);
253        milestones[i] = atoi(yytext+3);
254    }
255STN=.*   {
256        int nb,tn, stn;
257        char tmp[1000];
258        nb=sscanf(yytext+4,"%d%d%s",&tn,&stn,tmp);
259        if ( nb==3 && 0<=tn && tn<10 && 0<=stn && stn<10 ) {
260            char* p =strstr(yytext+4,tmp);
261            subtask_names[tn][stn]=strdup(p);
262        } else {
263            fprintf(stderr, "bad formated ST rule (ignored): %s.\n",yytext);
264        }
265}
266BM=[0-9]+ { bm=atoi(yytext+3); }
267EM=[0-9]+ { em=atoi(yytext+3); }
268R=none    { an[0]=0; an[1]=0; an[2]=0; an_comment=0; }
269R=[0-9:.]+ {
270        char tmp[1000];
271        int status = sscanf(yytext+2,"%lf:%lf:%lf:%s",an+0,an+1,an+2,tmp);
272        if (status<3) {
273            fprintf(stderr,
274                "%s: is not resource definition, expected format \"N:N:N\" (near D%d%d%d-V%c)\n",
275               yytext+2,tn,stn,dn,v);
276            an[0]=0; an[1]=0; an[2]=0; an_comment=0;
277        } else if (status==3) {
278            an_comment = 0;
279        } else
280            an_comment = strdup(tmp);
281    }
282PART="{"[^}]+"}"  {
283        int i;
284        partner=-1;
285        for (i=0; partner_table[i].key!=0 ; i++) {
286            if (strstr(yytext,partner_table[i].key)!=0 ) {
287                partner=i;
288                break;
289            }
290        }
291        if ( partner==-1 ) {
292            fprintf(stderr,"%s: does not contains a partner key (near D%d%d%d-V%c)\n",
293               yytext+5,tn,stn,dn,v);
294            partner=0;
295        }
296    }
297KIND="{"[^}]+"}"  {
298        yytext[yyleng-1]=0;
299        kind= strdup(yytext+6);
300        if ( strcmp(kind,"x")!=0 && strcmp(kind,"d")!=0 && strcmp(kind,"h")!=0 &&
301             strcmp(kind,"d+x")!=0 )
302          fprintf(stderr,"ERROR:D%d%d%d invalid KIND: %s\n",tn,stn,dn,kind);
303    }
304KIND="{}"  {
305        yytext[yyleng-1]=0;
306        kind= strdup(yytext+6);
307    }
308TITLE=.*\n {
309        char* pc=yytext+6;
310        yytext[yyleng-1]=0;
311        while ( *pc==' ' || *pc=='\t' ) pc+=1;
312        title=strdup(pc);
313        Tlivrable* p= (Tlivrable*) calloc(sizeof(*p),1);
314        p->tn = tn;
315        p->stn = stn;
316        p->dn = dn;
317        p->v  = v;
318        p->hman[0] = an[0];
319        p->hman[1] = an[1];
320        p->hman[2] = an[2];
321        p->leader = leader;
322        p->partner = partner;
323        p->title = title;
324        p->bm = bm;
325        p->em = em;
326        p->kind = kind;
327        gen_titleLines(p);
328
329        for (v=0; data_org.ls[tn][stn][dn][v]!=0 ; v++);
330        data_org.ls[tn][stn][dn][v] = p;
331//fprintf(stderr,"ADDED: %d %d %d %d\n",tn,stn,dn,v);
332        tn=stn=dn=v=bm=em=0;
333        title=kind=0;
334        an[0]= an[1]=an[1]=0;
335        an_comment=0;
336        partner=0;
337        leader=0;
338    }
339[ \t\n] ;
340.   { fprintf(stderr,"%c: unexpected value in anr.gantt file (near D%d%d%d-V%c)\n",
341        *yytext,tn,stn,dn,v); }
342%%
343
344void prepare0(Tdata* data)
345{
346int tn,stn,v;
347int i0,i1,i;
348    for (tn=0 ; tn<T_MAX ; tn++)
349    for (stn=0; stn<S_MAX; stn++) {
350//fprintf(stderr,"AVANT:t=%d:%d:: ",tn,stn); for (i=0; i<D_MAX ; i++)
351//fprintf(stderr,"%d:%p ",i,data->ls[tn][stn][i][0]); fprintf(stderr,"\n");
352        while (1) {
353            for (i0=0 ; i0<D_MAX ; i0++)
354                if (data->ls[tn][stn][i0][0] == 0) break;
355            for (i1=i0+1 ; i1<D_MAX ; i1++)
356                if (data->ls[tn][stn][i1][0] != 0) break;
357            if (i1>=D_MAX) break;
358            // shift
359            for (i=0 ; (i1+i)<D_MAX ; i++)
360                for (v=0;v<V_MAX;v+=1) {
361                    data->ls[tn][stn][i0+i][v] = data->ls[tn][stn][i1+i][v];
362                    data->ls[tn][stn][i1+i][v] = 0;
363                }
364        }
365//fprintf(stderr,"AVANT:t=%d:%d:: ",tn,stn); for (i=0; i<D_MAX ; i++)
366//fprintf(stderr,"%d:%p ",i,data->ls[tn][stn][i][0]); fprintf(stderr,"\n");
367    }
368}
369void prepare1(Tdata* data)
370{
371int tn,dn,v;
372int i0,i1,i;
373    for (tn=0 ; tn<T_MAX ; tn++) {
374//fprintf(stderr,"AVANT:t=%d:: ",tn,i0,i1); for (i=0; i<S_MAX ; i++) fprintf(stderr,"%d:%p ",i,data->ls[tn][i][0][0]); fprintf(stderr,"\n");
375        while (1) {
376            for (i0=0 ; i0<S_MAX ; i0++)
377                if (data->ls[tn][i0][0][0] == 0) break;
378            for (i1=i0+1 ; i1<S_MAX ; i1++)
379                if (data->ls[tn][i1][0][0] != 0) break;
380//fprintf(stderr,"%d %d %d\n",tn,i0,i1);
381            if (i1>=S_MAX) break;
382            // shift
383            for (i=0 ; (i1+i)<S_MAX ; i++)
384                for (dn=0;dn<D_MAX;dn+=1)
385                    for (v=0;v<V_MAX;v+=1) {
386                        data->ls[tn][i0+i][dn][v] = data->ls[tn][i1+i][dn][v];
387                        data->ls[tn][i1+i][dn][v] = 0;
388                    }
389        }
390//fprintf(stderr,"APRES:t=%d:: ",tn,i0,i1); for (i=0; i<S_MAX ; i++) fprintf(stderr,"%d:%p ",i,data->ls[tn][i][0][0]); fprintf(stderr,"\n");
391    }
392}
393void prepare2(Tdata* data)
394{
395int tn0,tn1,stn,dn,vn;
396int moved=1;
397    while (moved) {
398        moved=0;
399        for (tn0=0 ; tn0<T_MAX ; tn0++)
400            if (data->ls[tn0][0][0][0] == 0) break;
401        for (tn1=tn0+1 ; tn1<T_MAX ; tn1++)
402            if (data->ls[tn1][0][0][0] != 0) break;
403        if (tn1==T_MAX) break;
404        for (stn=0 ; stn<S_MAX ; stn++)
405            for (dn=0;dn<D_MAX;dn+=1)
406                for (vn=0;vn<V_MAX;vn+=1) {
407                    data->ls[tn0][stn][dn][vn] = data->ls[tn1][stn][dn][vn];
408                    data->ls[tn1][stn][dn][vn] = 0;
409                }
410        moved=1;
411    }
412}
413
414void prepare3(Tdata* data)
415{
416int tn,stn,dn,vn,cnt;
417Tlivrable* tmp;
418    for (tn=0 ; tn<T_MAX ; tn++)
419    for (stn=0; stn<S_MAX; stn++)
420    for (dn=0; dn<D_MAX; dn++) {
421        Tlivrable* p = data->ls[tn][stn][dn][0];
422        if (p==0) continue;
423        p->nbvers=0 ;
424        p->nbpart=0 ;
425        for (vn=0 ; vn<V_MAX ; vn+=1) {
426            tmp = data->ls[tn][stn][dn][vn];
427            if (tmp==0) continue;
428            if (tmp->leader==0)
429               p->nbpart+=1;
430            else
431                p->nbvers+=1;
432        }
433        p->vers=(Tlivrable**)malloc(sizeof(*p->vers)*(p->nbvers+1));
434        for (vn=0,cnt=0 ; vn<V_MAX ; vn+=1) {
435            tmp = data->ls[tn][stn][dn][vn];
436            if (tmp!=0 && tmp->leader==1) {
437                p->vers[cnt++] = tmp;
438                tmp->nbvers = p->nbvers;
439             }
440        }
441        p->vers[cnt] = 0;
442        if (p->nbpart!=0) {
443            p->part=(Tlivrable**)malloc(sizeof(*p->part)*(p->nbpart+1));
444            for (vn=0,cnt=0 ; vn<V_MAX ; vn+=1) {
445                tmp = data->ls[tn][stn][dn][vn];
446                if (tmp!=0 && tmp->leader==0) {
447                    p->part[cnt++] = tmp;
448                 }
449            }
450            p->part[cnt] = 0;
451        }
452
453        p->height = 1.0*DELIVRABLE_HEIGHT;
454        if (p->nbTitleLines>=1) {
455            double h=0;
456            h += p->vers[p->nbvers-1]->nbTitleLines*DELIVRABLE_TITLEHEIGHT;
457            h += (p->vers[p->nbvers-1]->nbTitleLines-1)*(DELIVRABLE_TITLEHEIGHT/5.);
458            if ( h>p->height) p->height=h;
459        }
460        Tlivrable* lu= p->vers[p->nbvers-1];
461        int i;
462//fprintf(stderr,"--------------------\n");
463        for (i=0 ; i<p->nbvers ; i++) {
464            Tlivrable* l= p->vers[i];
465            double bm= l->bm;
466            double em= l->em;
467//fprintf(stderr,"  %d%d%d-V%c: bm=%2.f em=%2.f --> %2.1f %2.1f %2.1f\n",l->tn,l->stn,l->dn,l->v,bm,em, lu->nbma[0],lu->nbma[1],lu->nbma[2]);
468            if (bm<12 && em>0) {
469                lu->nbma[0] += (em>12?12:em)-bm;
470                bm=12;
471            }
472            if (bm<24 && em>12) {
473                lu->nbma[1] += (em>24?24:em)-bm;
474                bm=24;
475            }
476            if (bm<36 && em>24) {
477                lu->nbma[2] += em-bm;
478            }
479//fprintf(stderr,"  %d%d%d-V%c: bm=%2.f em=%2.f --> %2.1f %2.1f %2.1f %p\n",l->tn,l->stn,l->dn,l->v,bm,em, lu->nbma[0],lu->nbma[1],lu->nbma[2], lu);
480        }
481    }
482}
483
484double task_livrable_height(int tn, double* delivrable_y)
485{
486int    stn,dn,nblivrables=0;
487double height=0;
488    height += TASK_TITLEHEIGHT ;
489    *delivrable_y = height;
490    for (stn=0 ; curr->ls[tn][stn][0][0]!=0 ; stn++)
491        for (dn=0 ; curr->ls[tn][stn][dn][0]!=0 ; dn++) {
492            if ( curr->ls[tn][stn][dn][0]->leader==0 ) continue;
493            nblivrables += 1;
494            height+=curr->ls[tn][stn][dn][0]->height;
495        }
496        height += DELIVRABLE_VSEP/2;
497        height += (nblivrables-1)*DELIVRABLE_VSEP;
498        height += DELIVRABLE_VSEP/2;
499    return height;
500}
501
502void  task_box(double pictwidth)
503{
504    int tn;
505    for ( tn=0 ; curr->ls[tn][0][0][0]!=0 ; tn++ ) {
506        const char* color= (tn%2)!=0 ? TASK_BGC1 : TASK_BGC0 ;
507        fprintf(curr->os,
508            "\\put(%.2f,%.2f){\\fcolorbox{black}{%s}{\\makebox(%5.2f,%5.2f){}}}\n",
509            0.0,curr->ls[tn][0][0][0]->task_y,
510            color,
511            pictwidth,curr->ls[tn][0][0][0]->task_dy
512        );
513    }
514}
515
516void  month_grid(double x, double y, double dx, double dy)
517{
518    int i;
519    for (i=0 ;  i<=36 ; i+=1,x+=PICT_MONTHWIDTH) {
520        if ( (i%3)!=0 ) continue;
521        fprintf(curr->os,
522            "\\put(%5.1f,%5.1f){\\line(0,1){%5.1f}}\\put(%5.1f,%5.1f){%d}\n",
523            x,y,dy-PICT_MONTHWIDTH-PICT_VSEP,
524            x-2,y+dy-PICT_MONTHHEIGHT,
525            i
526        );
527    }
528}
529
530void  print_milestones(double x, double y, double dx, double dy)
531{
532    int i;
533    double tn=.3;
534    //x=x-tn/2;
535    fprintf(curr->os,"\\bgroup\n");
536    fprintf(curr->os,"\\color{red}\n");
537    fprintf(curr->os,"\\linethickness{%.2fmm}\n",tn);
538    for (i=0 ;  milestones[i]!=0 ; i+=1) {
539        double xx= x + milestones[i]*PICT_MONTHWIDTH;
540        print_vline(xx,y,dy-PICT_MONTHWIDTH-PICT_VSEP,0);
541        char tmp[100];
542        sprintf(tmp,"M%d",i+1);
543        print_put(xx-2,y-3,tmp);
544    }
545    fprintf(curr->os,"\\egroup\n");
546}
547
548double delivrable(
549    double label_x, double box_x, double title_x,
550    double y,
551    int tn, int stn, int dn)
552{
553    Tlivrable* top=curr->ls[tn][stn][dn][0];
554    Tlivrable* last=curr->ls[tn][stn][dn][top->nbvers-1];
555    char tmp[1000],label[1000],title[1000];
556    double y0;
557    int v;
558    double label_dx = DELIVRABLE_LABELWIDTH ;
559    double label_dy = DELIVRABLE_LABELHEIGHT ;
560    double boxx,box_dx;
561    double box_dy = DELIVRABLE_BOXHEIGHT ;
562    double title_dx = DELIVRABLE_TITLEWIDTH ;
563    double title_dy = DELIVRABLE_TITLEHEIGHT ;
564   
565//print_hline(0,y,180,0);
566    gen_label_base(label,top);
567    // y -= DELIVRABLE_HEIGHT;
568    y -= top->height ;
569//print_hline(0,y,180,0);
570    fprintf(curr->os,"%% Delivrable %s (tn=%d stn=%d dn=%d\n",label,tn,stn,dn);
571
572    // print label
573    //y0 = (DELIVRABLE_HEIGHT-DELIVRABLE_LABELHEIGHT)/2;
574    y0 = (top->height-DELIVRABLE_LABELHEIGHT)/2;
575    sprintf(tmp,"\\ganttlabelstyle{%s}",label);
576    print_put(label_x,y+y0,tmp);
577    // print title
578    if (last->nbTitleLines==1) {
579        y0  = (DELIVRABLE_HEIGHT-DELIVRABLE_TITLEHEIGHT)/2;
580        y0 += DELIVRABLE_TITLEHEIGHT/5. ;
581        sprintf(tmp,"\\gantttitlestyle{%s}",last->title);
582        print_put(title_x,y+y0,tmp);
583    } else if (last->nbTitleLines>1) {
584        int i;
585        // y0 = (DELIVRABLE_HEIGHT-DELIVRABLE_TITLEHEIGHT)/2;
586        y0=DELIVRABLE_TITLEHEIGHT/5.;
587        sprintf(tmp,"\\gantttitlestyle{\\shortstack[l]{%s",last->titleLines[0]);
588        for (i=1 ; i<last->nbTitleLines ; i+=1) {
589            strcat(tmp,"\\\\");
590            strcat(tmp,last->titleLines[i]);
591        }
592        strcat(tmp,"}}");
593        print_put(title_x,y+y0,tmp);
594    }
595       
596    // print box
597    //y0 = (DELIVRABLE_HEIGHT-DELIVRABLE_BOXHEIGHT)/2;
598    y0 = (top->height-DELIVRABLE_BOXHEIGHT)/2;
599    if ( last==top ) {
600        Tlivrable* l=top;
601        boxx = box_x + l->bm*PICT_MONTHWIDTH ;
602        box_dx  = (l->em - l->bm) * PICT_MONTHWIDTH;
603        print_box(1,0,boxx,y+y0,box_dx,box_dy,COLOR_BOX_LIGHT,0,0);
604        print_box(0,0,boxx,y+y0,box_dx,box_dy,0,0,0);
605    } else for (v=0 ; v<top->nbvers ; v+=1) {
606        Tlivrable* l=curr->ls[tn][stn][dn][v] ;
607        gen_label_vers(tmp,l);
608        boxx = box_x + l->bm*PICT_MONTHWIDTH ;
609        box_dx  = (l->em - l->bm) * PICT_MONTHWIDTH;
610        print_box(1,0,boxx,y+y0,box_dx,box_dy,COLOR_BOX_LIGHT,0,0);
611        print_box(0,tmp,boxx,y+y0,box_dx,box_dy,0,0,0);
612    }
613    y -= DELIVRABLE_VSEP;
614    return y;
615}
616
617void task_delivrable(double label_x, double box_x, double title_x, int tn)
618{
619int stn,dn;
620Tlivrable* task=curr->ls[tn][0][0][0];
621double y = task->task_y+task->task_dy-task->task_y_del;
622    char tmp[1000];
623    sprintf(tmp,"\\textbf{Task-%d \\textit{%s}}",task->tn,task_names[task->tn]);
624    print_put(label_x/2,y+(TASK_TITLEHEIGHT-TASK_TITLEFONTHEIGHT)/2,tmp);
625
626    //y += DELIVRABLE_VSEP/2. ;
627    for (stn=0 ; curr->ls[tn][stn][0][0]!=0 ; stn++)
628        for (dn=0 ; curr->ls[tn][stn][dn][0]!=0 ; dn++) {
629                        if (curr->ls[tn][stn][dn][0]->dn >=0)
630                                y=delivrable(label_x,box_x,title_x,y,tn,stn,dn);
631        }
632}
633
634void do_gantt(const char* fn, int* tnplus, int* tnmoins)
635{
636    int tn;
637    double pictwidth, pictheight;
638    double gantt_x,gantt_y;
639    double gantt_dx,gantt_dy;
640
641    double label_x,title_x;
642    curr = data_new(tnplus,tnmoins);
643    if ( (curr->os=fopen(fn,"w"))==0 ) {
644        fprintf(stderr,"can not open %s file for writing.\n",fn);
645        fprintf(stderr,"generation of %s graph is skipped.\n",fn);
646        return;
647    }
648    prepare0(curr);
649    prepare1(curr);
650    prepare2(curr);
651    prepare3(curr);
652
653    pictheight=0 ;
654    pictheight += PICT_BOTSEP ;
655    for ( tn=0 ; curr->ls[tn][0][0][0]!=0 ; tn++ );
656    for ( tn=tn-1 ; tn>=0 ; tn-- ) {
657        double offset;
658        curr->ls[tn][0][0][0]->task_y     = pictheight;
659        curr->ls[tn][0][0][0]->task_dy    = task_livrable_height(tn,&offset);
660        curr->ls[tn][0][0][0]->task_y_del = offset;
661        pictheight += curr->ls[tn][0][0][0]->task_dy;
662        pictheight += TASK_VSEP;
663    }
664    pictheight += PICT_MONTHHEIGHT;
665    pictheight += PICT_TOPSEP ;
666    gantt_y  = PICT_BOTSEP ;
667    gantt_dy = pictheight-PICT_TOPSEP-PICT_BOTSEP ;
668
669    pictwidth=0;
670    pictwidth += PICT_LEFTSEP;
671    label_x    = pictwidth;
672    pictwidth += DELIVRABLE_LABELWIDTH;
673    pictwidth += PICT_HSEP;
674    gantt_x    = pictwidth ;
675    gantt_dx   = 36*PICT_MONTHWIDTH ;
676    pictwidth += gantt_dx ;
677    pictwidth += PICT_HSEP;
678    title_x    = pictwidth;
679    pictwidth += DELIVRABLE_TITLEWIDTH;
680    pictwidth += PICT_RIGHTSEP;
681   
682    fprintf(curr->os,"\\setlength{\\unitlength}{0.9mm}\n");
683    fprintf(curr->os,"\\begin{picture}(%.1f,%.1f)\n",pictwidth,pictheight);
684    //print_hline(0,0,pictwidth,0);
685    //print_hline(0,pictheight,pictwidth,0);
686    task_box(pictwidth);
687    month_grid(gantt_x,gantt_y,gantt_dx,gantt_dy);
688    for ( tn=0 ; curr->ls[tn][0][0][0]!=0 ; tn++ ) {
689        task_delivrable(label_x,gantt_x,title_x,tn);
690    }
691
692    print_milestones(gantt_x,0,gantt_dx,gantt_dy+gantt_y);
693    fprintf(curr->os,"\\end{picture}\n");
694    fclose(curr->os);
695    curr->os=0;
696}
697
698Tlivrable* do_partner_table_getLivrable(Tlivrable** leader, Tlivrable* top, int partner)
699{
700    int i;
701    Tlivrable* ret;
702    *leader=top->vers[top->nbvers-1];
703    if (leader[0]->partner==partner)
704        return *leader;
705    for (i=0; i<top->nbpart ; i+=1) {
706        ret= top->part[i];
707        if ( ret->partner==partner )
708                return ret;
709    }
710    return 0;
711}
712
713void do_partner_table_full(int partner)
714{
715    struct partner_def* part = partner_table+partner;
716    if ( (curr->os=fopen(part->fnfull,"w"))==0 ) {
717        fprintf(stderr,"can not open %s file for writing.\n",part->fnfull);
718        fprintf(stderr,"generation of %s partner table is skipped.\n",part->fnfull);
719        return;
720    }
721    fprintf(curr->os,"\\begin{tabular}{|c|l||r|r|r||r|}\\hline\n");
722    fprintf(curr->os,
723        "number & \\multicolumn{1}{c||}{title} & \\multicolumn{3}{c||}{years } & total \\\\\\cline{3-5}\n");
724    fprintf(curr->os,
725        " & & \\multicolumn{1}{c|}{1} & \\multicolumn{1}{c|}{2} & "
726        "\\multicolumn{1}{c||}{3} &  \\\\\\hline\\hline\n");
727    int tn,stn,dn,v=0;
728    double an1=0,an2=0,an3=0,an=0;
729    double tsk1,tsk2,tsk3,tsk;
730    int newlineadded=1;
731    for (tn=0 ; tn<T_MAX ; tn++) {
732        if (curr->ls[tn][0][0][0]==0) break;
733        if (tn!=0 && newlineadded==0 ) {
734            newlineadded = 1;
735            fprintf(curr->os,"\\hline ");
736        }
737                tsk1=tsk2=tsk3=tsk=0;
738        for (stn=0; stn<S_MAX; stn++) {
739            for (dn=0; dn<D_MAX; dn++) {
740                Tlivrable *lcurr,*leader;
741                Tlivrable* top=curr->ls[tn][stn][dn][v];
742                if (top==0) continue;
743                if ( (lcurr=do_partner_table_getLivrable(&leader,top,partner))==0 )
744                    continue;
745                double sum1,sum2,sum3,sum=0;
746                sum1 = lcurr->hman[0]; sum +=sum1;
747                sum2 = lcurr->hman[1]; sum +=sum2;
748                sum3 = lcurr->hman[2]; sum +=sum3;
749                char label_lnk[1000],label[1000],title[1000];
750                gen_label_base(label,leader);
751                sprintf(label_lnk,"\\hyperlink{%s}{%s}",label,label);
752                sprintf(title,"\\resstablestyletitle{%s}",leader->title);
753                fprintf(curr->os,"%s & %s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n",
754                   label_lnk,title,sum1,sum2,sum3,sum);
755                an1 += sum1 ; tsk1 += sum1 ;
756                an2 += sum2 ; tsk2 += sum2 ;
757                an3 += sum3 ; tsk3 += sum3 ;
758                an  += sum  ; tsk  += sum  ;
759                newlineadded=0;
760                if ( sum1==0 && leader->nbma[0]!=0)
761                    fprintf(stderr,"ERROR:   %-10s:%s probleme sur l'an 1 (in table=%2.1f, in gantt=%2.1f\n",
762                        part->name,label,sum1,leader->nbma[0]);
763                else if (sum1!=0 && leader->nbma[0]==0 )
764                    fprintf(stderr,"ERROR:   %-10s:%s probleme sur l'an 1 (in table=%2.1f, in gantt=%2.1f\n",
765                        part->name,label,sum1,leader->nbma[0]);
766                else if (sum1!=0 && sum1>leader->nbma[0] )
767                    fprintf(stderr,"WARNING: %-10s:%s probleme sur l'an 1 (in table=%2.1f, in gantt=%2.1f\n",
768                        part->name,label,sum1,leader->nbma[0]);
769                if ( sum2==0 && leader->nbma[1]!=0)
770                    fprintf(stderr,"ERROR:   %-10s:%s probleme sur l'an 2 (in table=%2.1f, in gantt=%2.1f\n",
771                        part->name,label,sum2,leader->nbma[1]);
772                else if ( sum2!=0 && leader->nbma[1]==0)
773                    fprintf(stderr,"ERROR:   %-10s:%s probleme sur l'an 2 (in table=%2.1f, in gantt=%2.1f\n",
774                        part->name,label,sum2,leader->nbma[1]);
775                else if (sum2!=0 && sum2>leader->nbma[1])
776                    fprintf(stderr,"WARNING: %-10s:%s probleme sur l'an 2 (in table=%2.1f, in gantt=%2.1f\n",
777                        part->name,label,sum2,leader->nbma[1]);
778                if ( sum3==0 && leader->nbma[2]!=0)
779                    fprintf(stderr,"ERROR:   %-10s:%s probleme sur l'an 3 (in table=%2.1f, in gantt=%2.1f\n",
780                        part->name,label,sum3,leader->nbma[2]);
781                else if ( sum3!=0 && leader->nbma[2]==0)
782                    fprintf(stderr,"ERROR:   %-10s:%s probleme sur l'an 3 (in table=%2.1f, in gantt=%2.1f\n",
783                        part->name,label,sum3,leader->nbma[2]);
784                else if (sum3!=0 && sum3>leader->nbma[2])
785                    fprintf(stderr,"WARNING: %-10s:%s probleme sur l'an 3 (in table=%2.1f, in gantt=%2.1f\n",
786                        part->name,label,sum3,leader->nbma[2]);
787            }
788        }
789                if (tsk!=0)
790        fprintf(curr->os,"%s & total Task-%d & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n",
791            "",curr->ls[tn][0][0][0]->tn,tsk1,tsk2,tsk3,tsk);
792               
793    }
794    if ( an!=(an1+an2+an3) ) {
795        fprintf(stderr,"bad computation in %s table.\n",part->fnfull);
796    }
797    fprintf(curr->os,"\\hline\n");
798    fprintf(curr->os,"%s & %s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n",
799            "","total",an1,an2,an3,an);
800
801    fprintf(curr->os,"\\end{tabular}\n");
802    fclose(curr->os);
803    curr->os=0;
804}
805
806void do_partner_table_short(int partner)
807{
808    struct partner_def* part = partner_table+partner;
809    if ( (curr->os=fopen(part->fnshort,"w"))==0 ) {
810        fprintf(stderr,"can not open %s file for writing.\n",part->fnshort);
811        fprintf(stderr,"generation of %s partner table is skipped.\n",part->fnshort);
812        return;
813    }
814    fprintf(curr->os,"\\begin{center}\\begin{small}\\begin{tabular}{|c|l||r|r|r||r|}\\hline\n");
815    fprintf(curr->os,
816        " & title & \\multicolumn{3}{c||}{years } & total \\\\\\cline{3-5}\n");
817    fprintf(curr->os,
818        " &       & \\multicolumn{1}{c|}{1} & \\multicolumn{1}{c|}{2} & "
819                    "\\multicolumn{1}{c||}{3} &  \\\\\\hline\\hline\n");
820    int tn,stn,dn,v=0;
821    double an1=0,an2=0,an3=0,an=0;
822    double tsk1,tsk2,tsk3,tsk;
823    int newlineadded=1;
824    for (tn=0 ; tn<T_MAX ; tn++) {
825        if (curr->ls[tn][0][0][0]==0) break;
826                tsk1=tsk2=tsk3=tsk=0;
827        for (stn=0; stn<S_MAX; stn++) {
828            for (dn=0; dn<D_MAX; dn++) {
829                Tlivrable *lcurr,*leader;
830                Tlivrable* top=curr->ls[tn][stn][dn][v];
831                if (top==0) continue;
832                if ( (lcurr=do_partner_table_getLivrable(&leader,top,partner))==0 )
833                    continue;
834                double sum1,sum2,sum3,sum=0;
835                sum1 = lcurr->hman[0]; sum +=sum1;
836                sum2 = lcurr->hman[1]; sum +=sum2;
837                sum3 = lcurr->hman[2]; sum +=sum3;
838                an1 += sum1 ; tsk1 += sum1 ;
839                an2 += sum2 ; tsk2 += sum2 ;
840                an3 += sum3 ; tsk3 += sum3 ;
841                an  += sum  ; tsk  += sum  ;
842                newlineadded=0;
843            }
844        }
845                if (tsk!=0)
846        fprintf(curr->os,"Task-%d & %s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n",
847            curr->ls[tn][0][0][0]->tn,
848            task_names[curr->ls[tn][0][0][0]->tn],tsk1,tsk2,tsk3,tsk);
849               
850    }
851    if ( an!=(an1+an2+an3) ) {
852        fprintf(stderr,"bad computation in %s table.\n",part->fnshort);
853    }
854    fprintf(curr->os,"\\hline\n");
855    fprintf(curr->os," & %s &  %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n",
856            "total",an1,an2,an3,an);
857
858    fprintf(curr->os,"\\end{tabular}\\end{small}\\end{center}\n");
859    fclose(curr->os);
860    curr->os=0;
861}
862
863void do_livrable_tables_open(int tablenum, int last)
864{
865    char fn[1024];
866
867    if (curr->os!=0) {
868        fprintf(curr->os,"\\end{tabular}\n");
869        fclose(curr->os);
870        curr->os = 0;
871    }
872
873    if ( last )
874        return;
875
876    sprintf(fn,"table_livrable_%02d.tex",tablenum);
877    if ( (curr->os=fopen(fn,"w"))==0 ) {
878        fprintf(stderr,"FATAL: can not open %s file for writing.\n",fn);
879        exit(1);
880    }
881    fprintf(curr->os,"\\begin{tabular}[t]{|l|c|c|c|p{\\desclen}|}\\hline\n");
882    fprintf(curr->os,"number");
883    fprintf(curr->os," & resp.");
884    fprintf(curr->os," & \\makebox[2mm]{T0+}");
885    fprintf(curr->os," & \\makebox[2mm]{kind}");
886    fprintf(curr->os," & description\\\\\\hline\\hline\n");
887}
888
889void do_livrable_tables(int maxlines)
890{
891    int nblines=maxlines;
892    int nbfile=1;
893    int tn,stn,dn,v;
894    do_livrable_tables_open(nbfile,0); nbfile +=1 ;
895    for (tn=0 ; tn<T_MAX ; tn++)  { if ( curr->ls[tn][0][0][0]==0 ) break;
896    for (stn=0; stn<S_MAX; stn++) { if ( curr->ls[tn][stn][0][0]==0 ) break;
897    for (dn=0; dn<D_MAX; dn++)    {
898        Tlivrable* top = curr->ls[tn][stn][dn][0];
899        if ( top==0 ) break;
900        Tlivrable* last=top->vers[top->nbvers-1];
901        if ( (nblines-top->nbvers) <= 0 ) {
902            do_livrable_tables_open(nbfile,0); nbfile +=1 ;
903            nblines = maxlines;
904        }
905        for (v=0; v<V_MAX; v++) {
906            Tlivrable* l = curr->ls[tn][stn][dn][v];
907            if ( l==0 ) break;
908            if ( l->leader==0 ) continue;
909            char label_lnk[1000],label[1000],resp[100],date[100],kind[100],desc[1000];
910            gen_label_full(label,l);
911            sprintf(label_lnk,"\\hyperlink{%s}{%s}",label,label);
912            sprintf(resp,"\\S%s",partner_table[l->partner].key);
913            sprintf(date,"\\makebox[2mm][r]{%d}",l->em);
914            sprintf(kind,"\\makebox[1mm]{%s}",l->kind);
915            if ( top->nbvers == 1 )
916                sprintf(desc,"%s \\\\\\hline\n",last->title);
917             else if ( v==(top->nbvers-1) )
918                sprintf(desc,
919                  "\\multirow{-%d}{\\desclen}{%s}\\\\\\hline\n",
920                  top->nbvers,last->title);
921             //else if ( v==(top->nbvers-1) )
922             //   sprintf(desc, "\\\\\\hline\n");
923             else
924                sprintf(desc, "\\\\\\cline{1-4}\n");
925
926             fprintf(curr->os,"%-15s", label_lnk);
927             fprintf(curr->os," & %-10s", resp);
928             fprintf(curr->os," & %-30s", date);
929             fprintf(curr->os," & %-30s", kind);
930             fprintf(curr->os," & %s", desc);
931             nblines -= 1;
932        }
933    }}}
934    do_livrable_tables_open(nbfile,1);
935}
936
937void do_effort_par_livrable(char* filename,int from_task, int to_task)
938{
939    //struct partner_def* part;
940    if ( (curr->os=fopen(filename,"w"))==0 ) {
941        fprintf(stderr,"can not open %s file for writing.\n",filename);
942        fprintf(stderr,"generation of %s file is skipped.\n",filename);
943        return;
944    }
945    fprintf(curr->os,"\\begin{tabular}{|c|l||c|r|r|r||r|}\\hline\n");
946    fprintf(curr->os,
947        "number & \\multicolumn{1}{c||}{title} & part. & \\multicolumn{3}{c||}{years } & total \\\\\\cline{4-6}\n");
948    fprintf(curr->os,
949        " & & & \\multicolumn{1}{c|}{1} & \\multicolumn{1}{c|}{2} & "
950        "\\multicolumn{1}{c||}{3} &  \\\\\\hline\\hline\n");
951    int tn,stn,dn,partner;
952    double an1=0,an2=0,an3=0,an=0;
953    for (tn=0 ; tn<T_MAX ; tn++) {
954        int livrablenb=0,subtasknb=0;
955        int task_n,subtask_n;
956        double  t_sum1=0, t_sum2=0, t_sum3=0, t_sum=0;
957        double st_sum1=0,st_sum2=0,st_sum3=0,st_sum=0;
958        if (curr->ls[tn][0][0][0]==0) break;
959        for (stn=0; stn<S_MAX; stn++) {
960          st_sum1=st_sum2=st_sum3=st_sum=0;
961          livrablenb=0;
962          for (dn=0; dn<D_MAX; dn++) {
963            int linenb = 0;
964            Tlivrable* top=curr->ls[tn][stn][dn][0];
965            if ( top==0 ) break;
966            if ( !( from_task<=top->tn &&  top->tn<=to_task ) ) break;
967            double liv1=0,liv2=0,liv3=0,liv=0;
968            for (partner=1 ; partner_table[partner].key!=0 ; partner+=1) {
969                Tlivrable *lcurr,*leader;
970                if ( (lcurr=do_partner_table_getLivrable(&leader,top,partner))==0 )
971                    continue;
972                double sum1,sum2,sum3,sum=0;
973                sum1 = lcurr->hman[0]; sum +=sum1;
974                sum2 = lcurr->hman[1]; sum +=sum2;
975                sum3 = lcurr->hman[2]; sum +=sum3;
976                char label_lnk[1000],label[1000],title[1000];
977                gen_label_base(label,lcurr);
978                sprintf(label_lnk,"\\hyperlink{%s}{%s}",label,label);
979                sprintf(title,"\\resstablestyletitle{%s}",top->title);
980                fprintf(curr->os,"%10s & %50s & %10s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n",
981                   linenb==0 ? label_lnk : "",
982                   linenb==0 ? title : "",
983                   partner_table[lcurr->partner].key,
984                   sum1,sum2,sum3,sum);
985                linenb += 1;
986                liv1 += sum1 ; st_sum1 += sum1 ; t_sum1 += sum1 ; an1 += sum1 ;
987                liv2 += sum2 ; st_sum2 += sum2 ; t_sum2 += sum2 ; an2 += sum2 ;
988                liv3 += sum3 ; st_sum3 += sum3 ; t_sum3 += sum3 ; an3 += sum3 ;
989                liv  += sum  ; st_sum  += sum  ; t_sum  += sum  ; an  += sum  ;
990            }
991            if (linenb>1)
992                fprintf(curr->os,"%10s & %50s & %10s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n",
993                    "","","total",liv1,liv2,liv3,liv);
994            if (linenb>=0) {
995                livrablenb +=1;
996                task_n=top->tn;
997                subtask_n=top->stn;
998            }
999          }
1000          if ( livrablenb>0) {
1001                char name[100];
1002                char title[1000];
1003                sprintf(name,"st%d-%d",task_n,subtask_n);
1004                sprintf(title,"\\resstablestyletitle{%s}",get_subtask_name(task_n,subtask_n));
1005                fprintf(curr->os,"%10s & %50s & %10s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n",
1006                    name,title,"total",st_sum1,st_sum2,st_sum3,st_sum);
1007                subtasknb += 1;
1008          }
1009       }
1010       if ( subtasknb>0 ) {
1011                char name[100];
1012                char title[1000];
1013                sprintf(name,"task-%d",task_n);
1014                sprintf(title,"\\resstablestyletitle{%s}",task_names[task_n]);
1015                fprintf(curr->os,"%10s & %50s & %10s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\\hline\n",
1016                    name,title,"total",t_sum1,t_sum2,t_sum3,t_sum);
1017       }
1018    }
1019    fprintf(curr->os,"\\end{tabular}\n");
1020    fclose(curr->os);
1021    curr->os=0;
1022}
1023
1024void do_partner_by_subtask()
1025{
1026    char filename[2000];
1027    int tn,stn,dn,partner;
1028    for (tn=0 ; tn<T_MAX ; tn++) {
1029        int livrablenb=0,subtasknb=0;
1030        int task_n,subtask_n;
1031        double  t_sum1=0, t_sum2=0, t_sum3=0, t_sum=0;
1032        double st_sum1=0,st_sum2=0,st_sum3=0,st_sum=0;
1033        if (curr->ls[tn][0][0][0]==0) break;
1034        for (stn=0; stn<S_MAX; stn++) {
1035          int parts[100]; memset(parts,0,sizeof(parts));
1036          int partnb=0;
1037          for (dn=0; dn<D_MAX; dn++) {
1038            int linenb = 0;
1039            Tlivrable* top=curr->ls[tn][stn][dn][0];
1040            if ( top==0 ) break;
1041            double liv1=0,liv2=0,liv3=0,liv=0;
1042            for (partner=1 ; partner_table[partner].key!=0 ; partner+=1) {
1043                Tlivrable *lcurr,*leader;
1044                if ( (lcurr=do_partner_table_getLivrable(&leader,top,partner))==0 ) {
1045                    continue;
1046                }
1047                parts[partner]=1; partnb+=1;
1048                task_n = top->tn;
1049                subtask_n = top->stn;
1050            }
1051          }
1052          if (partnb==0) continue;
1053          sprintf(filename,"tmp/st%d-%d-partner.tex",task_n,subtask_n);
1054          if ( (curr->os=fopen(filename,"w"))==0 ) {
1055              fprintf(stderr,"can not open %s file for writing.\n",filename);
1056              fprintf(stderr,"generation of %s file is skipped.\n",filename);
1057              continue;
1058          }
1059          for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) {
1060            if ( parts[partner]==0) continue;
1061            fprintf(curr->os,"\\S%s\n",partner_table[partner].key);
1062          }
1063          fclose(curr->os);
1064          curr->os=0;
1065       }
1066    }
1067}
1068
1069#if 1
1070void do_effort_par_livrable_xls(char* filename,int from_task, int to_task)
1071{
1072    //struct partner_def* part;
1073    if ( (curr->os=fopen(filename,"w"))==0 ) {
1074        fprintf(stderr,"can not open %s file for writing.\n",filename);
1075        fprintf(stderr,"generation of %s file is skipped.\n",filename);
1076        return;
1077    }
1078    int tn,stn,dn,partner;
1079    fprintf(curr->os,"\"task\";\"sub-task\";\"delivrable\";");
1080    fprintf(curr->os,"\"cumul\";;;;");
1081    for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) {
1082        fprintf(curr->os,"\"%s\";;;;",partner_table[partner].key);
1083    }
1084    fprintf(curr->os,"\"description\";\n");
1085    fprintf(curr->os,";;;");
1086    fprintf(curr->os,"\"an 1\";\"an 2\";\"an 3\";\"sum\";");
1087    for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) {
1088        fprintf(curr->os,"\"an 1\";\"an 2\";\"an 3\";\"sum\";");
1089    }
1090    fprintf(curr->os,";\n");
1091    double an1=0,an2=0,an3=0,anA=0;
1092    double an1p[100], an2p[100], an3p[100], anAp[100];
1093    memset(an1p,0,sizeof(an1p)); memset(an2p,0,sizeof(an2p));
1094    memset(an3p,0,sizeof(an3p)); memset(anAp,0,sizeof(anAp));
1095    for (tn=0 ; tn<T_MAX ; tn++) {
1096        int livrablenb=0,subtasknb=0;
1097        int task_n,subtask_n;
1098        double  t_sum1=0,     t_sum2=0,     t_sum3=0,     t_sumA=0;
1099        double  t_sum1p[100], t_sum2p[100], t_sum3p[100], t_sumAp[100];
1100        memset(t_sum1p,0,sizeof(t_sum1p)); memset(t_sum2p,0,sizeof(t_sum2p));
1101        memset(t_sum3p,0,sizeof(t_sum3p)); memset(t_sumAp,0,sizeof(t_sumAp));
1102        if (curr->ls[tn][0][0][0]==0) break;
1103        for (stn=0; stn<S_MAX; stn++) {
1104          double st_sum1=0,     st_sum2=0,     st_sum3=0,     st_sumA=0;
1105          double st_sum1p[100], st_sum2p[100], st_sum3p[100], st_sumAp[100];
1106          memset(st_sum1p,0,sizeof(st_sum1p)); memset(st_sum2p,0,sizeof(st_sum2p));
1107          memset(st_sum3p,0,sizeof(st_sum3p)); memset(st_sumAp,0,sizeof(st_sumAp));
1108         
1109          livrablenb=0;
1110          for (dn=0; dn<D_MAX; dn++) {
1111            int linenb = 0;
1112            Tlivrable* top=curr->ls[tn][stn][dn][0];
1113            if ( top==0 ) break;
1114            if ( !( from_task<=top->tn &&  top->tn<=to_task ) ) break;
1115            double liv1=0,liv2=0,liv3=0,liv=0;
1116            char label_lnk[1000],label[1000],title[1000];
1117            gen_label_base(label,top);
1118            sprintf(label_lnk,"\\hyperlink{%s}{%s}",label,label);
1119            sprintf(title,"%s",top->title);
1120            double sum1p[20], sum2p[20], sum3p[20], sumAp[20];
1121            memset(sum1p,0,sizeof(sum1p)); memset(sum2p,0,sizeof(sum2p));
1122            memset(sum3p,0,sizeof(sum3p)); memset(sumAp,0,sizeof(sumAp));
1123            task_n=top->tn;
1124            subtask_n=top->stn;
1125            for (partner=1 ; partner_table[partner].key!=0 ; partner+=1) {
1126                Tlivrable *lcurr,*leader;
1127                if ( (lcurr=do_partner_table_getLivrable(&leader,top,partner))==0 )
1128                    continue;
1129                double sum1,sum2,sum3,sum=0;
1130                sum1 = lcurr->hman[0]; sum +=sum1;
1131                sum2 = lcurr->hman[1]; sum +=sum2;
1132                sum3 = lcurr->hman[2]; sum +=sum3;
1133                linenb += 1;
1134                liv1 += sum1 ; st_sum1 += sum1 ; t_sum1 += sum1 ; an1 += sum1 ;
1135                liv2 += sum2 ; st_sum2 += sum2 ; t_sum2 += sum2 ; an2 += sum2 ;
1136                liv3 += sum3 ; st_sum3 += sum3 ; t_sum3 += sum3 ; an3 += sum3 ;
1137                liv  += sum  ; st_sumA += sum  ; t_sumA += sum  ; anA += sum  ;
1138                sum1p[partner] += sum1 ; st_sum1p[partner] += sum1 ; t_sum1p[partner] += sum1 ; an1p[partner] += sum1 ;
1139                sum2p[partner] += sum2 ; st_sum2p[partner] += sum2 ; t_sum2p[partner] += sum2 ; an2p[partner] += sum2 ;
1140                sum3p[partner] += sum3 ; st_sum3p[partner] += sum3 ; t_sum3p[partner] += sum3 ; an3p[partner] += sum3 ;
1141                sumAp[partner] += sum  ; st_sumAp[partner] += sum  ; t_sumAp[partner] += sum  ; anAp[partner] += sum  ;
1142            }
1143            if (linenb>=1) {
1144                livrablenb+=1;
1145                fprintf(curr->os,";;\"%s\";",label);
1146                fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;",liv1,liv2,liv3,liv);
1147                for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) {
1148                    fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;",
1149                        sum1p[partner],sum2p[partner],sum3p[partner],sumAp[partner]);
1150                }
1151                fprintf(curr->os,"\"%s\";",title);
1152                fprintf(curr->os,"\n");
1153            }
1154          }
1155          if ( livrablenb>0) {
1156                subtasknb += 1;
1157                char name[100];
1158                char title[1000];
1159                sprintf(name,"st%d-%d",task_n,subtask_n);
1160                sprintf(title,"%s",get_subtask_name(task_n,subtask_n));
1161                fprintf(curr->os,";\"%s\";;",name);
1162                fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;",st_sum1,st_sum2,st_sum3,st_sumA);
1163                for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) {
1164                    fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;",
1165                        st_sum1p[partner],st_sum2p[partner],st_sum3p[partner],st_sumAp[partner]);
1166                }
1167                fprintf(curr->os,"\"%s\";",title);
1168                fprintf(curr->os,"\n");
1169          }
1170       }
1171       if ( subtasknb>0 ) {
1172                char name[100];
1173                char title[1000];
1174                sprintf(name,"task-%d",task_n);
1175                sprintf(title,"%s",task_names[task_n]);
1176                fprintf(curr->os,"\"%s\";;;",name);
1177                fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;",t_sum1,t_sum2,t_sum3,t_sumA);
1178                for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) {
1179                    fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;",
1180                        t_sum1p[partner],t_sum2p[partner],t_sum3p[partner],t_sumAp[partner]);
1181                }
1182                fprintf(curr->os,"\"%s\";",title);
1183                fprintf(curr->os,"\n");
1184       }
1185    }
1186                char name[100];
1187                char title[1000];
1188                sprintf(name,"total");
1189                sprintf(title,"%s","");
1190                fprintf(curr->os,"\"%s\";;;",name);
1191                fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;",an1,an2,an3,anA);
1192                for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) {
1193                    fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;",
1194                        an1p[partner],an2p[partner],an3p[partner],anAp[partner]);
1195                }
1196                fprintf(curr->os,"\"%s\";",title);
1197                fprintf(curr->os,"\n");
1198    fclose(curr->os);
1199    curr->os=0;
1200}
1201#endif
1202
1203int main()
1204{
1205    int tnplus[10] =  { 1, 2, 3, 4, 5, 6, -1 };
1206    int tnmoins[10] = { 1, 2, 3, 4, 5, 6, -1 };
1207
1208    yylex();
1209    do_gantt("gantt.tex",0,0);
1210    do_gantt("gantt1.tex",tnplus,0);
1211    do_gantt("gantt2.tex",0,tnmoins);
1212
1213    curr = data_new(0,0);
1214    prepare0(curr);
1215    prepare1(curr);
1216    prepare2(curr);
1217    prepare3(curr);
1218    do_partner_table_full(1);  do_partner_table_short(1);
1219    do_partner_table_full(2);  do_partner_table_short(2);
1220    do_partner_table_full(3);  do_partner_table_short(3);
1221    do_partner_table_full(4);  do_partner_table_short(4);
1222    do_partner_table_full(5);  do_partner_table_short(5);
1223    do_partner_table_full(6);  do_partner_table_short(6);
1224    do_partner_table_full(7);  do_partner_table_short(7);
1225    do_partner_table_full(8);  do_partner_table_short(8);
1226
1227    curr = data_new(0,0);
1228    prepare0(curr);
1229    prepare1(curr);
1230    prepare2(curr);
1231    prepare3(curr);
1232    do_livrable_tables(44);
1233
1234    curr = data_new(0,0);
1235    prepare0(curr);
1236    prepare1(curr);
1237    prepare2(curr);
1238    prepare3(curr);
1239    do_effort_par_livrable("effort-par-livrable-1.tex",1,3);
1240    do_effort_par_livrable("effort-par-livrable-2.tex",4,7);
1241    do_effort_par_livrable("effort-par-livrable-3.tex",8,8);
1242    do_effort_par_livrable_xls("tmp/effort-par-livrable.csv",1,8);
1243
1244    curr = data_new(0,0);
1245    prepare0(curr);
1246    prepare1(curr);
1247    prepare2(curr);
1248    prepare3(curr);
1249    do_partner_by_subtask();
1250    return 0;
1251}
Note: See TracBrowser for help on using the repository browser.