%{ #define COLOR_Milestone "gtcMilestone" #define COLOR_BOX_HEAVY "gtcBoxHeavy" #define COLOR_BOX_LIGHT "gtcBoxLight" #define PICT_TOPSEP 0.0 #define PICT_BOTSEP 3.0 #define PICT_LEFTSEP 2.0 #define PICT_RIGHTSEP 3.0 #define PICT_VSEP 2.0 #define PICT_HSEP 2.0 #define PICT_MONTHHEIGHT 5 // police height #define PICT_MONTHWIDTH (10./3.) #define TASK_VSEP 2 #define TASK_BGC0 "gtcTaskBG0" #define TASK_BGC1 "gtcTaskBG1" #define TASK_TITLEHEIGHT 6. #define TASK_TITLEFONTHEIGHT 2. #define DELIVRABLE_VSEP 1 #define DELIVRABLE_HEIGHT 3 #define DELIVRABLE_LABELWIDTH 7.5 #define DELIVRABLE_LABELHEIGHT DELIVRABLE_HEIGHT #define DELIVRABLE_TITLEWIDTH 38 #define DELIVRABLE_TITLEHEIGHT DELIVRABLE_HEIGHT #define DELIVRABLE_BOXHEIGHT (DELIVRABLE_HEIGHT) char* task_names[] = { 0, "Project management", "Backbone infrastructure", "System generation", "HAS front-end", "HAS back-end", "PC/FPGA communication middleware", "Industrial demonstrators", "Dissemination", 0 }; char* subtask_names[20][20]; char* get_subtask_name(int tn, int stn) { char* ret=subtask_names[tn][stn]; if (ret==0) { fprintf(stderr,"ERROR: no name found for st%d-%d sub-task.\n",tn,stn); return ""; } else return ret; } struct partner_def { char *key, *name, *fnfull, *fnshort; } partner_table[] = { { "UNKNOW" ,"relax" ,0 ,0 }, { "mds" ,"mds" ,"table_mds_full.tex" ,"table_mds_short.tex" }, { "upmc" ,"upmc" ,"table_upmc_full.tex" ,"table_upmc_short.tex" }, { "ubs" ,"ubs" ,"table_ubs_full.tex" ,"table_ubs_short.tex" }, { "lip" ,"lip" ,"table_inria_compsys_full.tex","table_inria_compsys_short.tex" }, { "tima" ,"tima" ,"table_tima_full.tex" ,"table_tima_short.tex" }, { "inria" ,"inria" ,"table_inria_cairn_full.tex" ,"table_inria_cairn_short.tex" }, { "bull" ,"bull" ,"table_bull_full.tex" ,"table_bull_short.tex" }, { "thales" ,"thales" ,"table_thales_full.tex" ,"table_thales_short.tex" }, { 0 ,0 ,0 ,0 }, }; typedef struct _Tlivrable { char v; // 0, 1, 2, ..., F char* kind; char* title; int bm,em; // mois de bebut et de fin double hman[3]; // nombre de mh par an int tn,stn,dn,vn; // task, sub-task, number int leader; // 1: the partner leads this livrable // 0: the partner helps for this livrable int partner; // index dans partner_table // these fields are filled by the program for data[tn][0][0][0] double task_y; // top of task double task_dy; // bot of task is task_y+task_dy double task_y_del; // delivrables start at task_y+task_y_del double nbma[3]; // durée en mois par annee // these fields are filled by the program for data[tn][stn][dn][0] struct _Tlivrable // versions of the livrable **vers; // null termiated (vers[i] = data[tn][stn][dn][j]) // this->leader == 1 // vers[0] = this // vers[i]->leadaer == this->leader // vers[i]->partner == this->partner int nbvers; // nombre de vers double height; // height of livrable // int del_bm,del_em; // mois de bebut et de fin cummule // these fields are filled by the program for all elements int nbTitleLines; char* titleLines[5]; // null termiated struct _Tlivrable // participant to the livrable **part; // null termiated (vers[i] = data[tn][stn][dn][j]) // this->leader == 1 // vers[i] != this // vers[i]->leader == 0 // vers[i]->partner != this->partner int nbpart; // nombre de vers } Tlivrable; #define T_MAX 10 #define S_MAX 10 #define D_MAX 10 #define V_MAX 10 typedef struct _Tdata { FILE* os; Tlivrable* ls[T_MAX][S_MAX][D_MAX][V_MAX]; } Tdata; Tdata data_org; Tdata* curr; Tdata* data_new(int *tnplus, int *tnmoins) { int i,skip; int tn,stn,dn,v; Tdata* data = malloc(sizeof(*data)); memset(data,0,sizeof(*data)); for (tn=0 ; tntn ) { skip=0; break; } } } if (skip) continue; // tnmoins treatment skip = 0; if (tnmoins!=0) { for (i=0 ; tnmoins[i]!=-1 ; i++) { //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]); if ( tnmoins[i]==data_org.ls[tn][stn][dn][v]->tn ) { skip=1; break; } } } //fprintf(stderr,"selected: [tn][stn][dn][v]=%d,%d,%d,%d skip=%d\n",tn,stn,dn,v,skip); if (skip) continue; Tlivrable* l=malloc(sizeof(*l)); *l = *data_org.ls[tn][stn][dn][v]; data->ls[tn][stn][dn][v] = l; //fprintf(stderr,"selected: [tn][stn][dn][v]=%d,%d,%d,%d\n",tn,stn,dn,v); } return data; } int milestones[100]; char* gen_label_base(char* buf,Tlivrable*p) { if (p->dn >=0) sprintf(buf,"D%d%d%d",p->tn,p->stn,p->dn); else sprintf(buf,""); return buf; } char* gen_label_vers(char* buf,Tlivrable*p) { if (p->nbvers<=1) strcpy(buf,""); else sprintf(buf,"V%c",p->v); return buf; } char* gen_label_full(char* buf,Tlivrable*p) { char b[100],v[100]; gen_label_base(b,p); gen_label_vers(v,p); sprintf(buf,"%s%s%s",b,*v?"-":"",v); return buf; } void print_put(double x,double y, const char* object) { fprintf(curr->os,"\\put(%.2f,%.2f){%s}\n",x,y,object); } void print_hline(double x,double y, double len, const char* color) { char object[1024]; if (color!=0) { fprintf(curr->os,"\\bgroup\\color{%s}\n",color); } sprintf(object,"\\line(1,0){%.2f}",len); print_put(x,y,object); if (color!=0) { fprintf(curr->os,"\\egroup\n"); } } void print_vline(double x,double y, double len, const char* color) { char object[1024]; if (color!=0) { fprintf(curr->os,"\\bgroup\\color{%s}\n",color); } sprintf(object,"\\line(0,1){%.2f}",len); print_put(x,y,object); if (color!=0) { fprintf(curr->os,"\\egroup\n"); } } void print_box( int filled, char* vers, // vers may be 0, double x,double y, double dx, double dy, const char* boxcolor, // may be 0 (default COLOR_BOX_HEAVY) const char* bgcolor, // may be 0 (not set) const char* textcolor // may be 0 (black) ){ double tn=.4; char object[1024]; if ( boxcolor==0 ) boxcolor = COLOR_BOX_HEAVY; if ( filled==1 ) { sprintf(object, "\\fcolorbox{black}{%s}{\\makebox(%.2f,%.2f){}}", boxcolor,dx-2-tn,dy-2-tn); print_put(x,y+1,object); } else { double tn2=tn/2; double e=.1; fprintf(curr->os,"\\bgroup\\color{%s}\n",boxcolor); fprintf(curr->os,"\\linethickness{%.2fmm}\n",tn); print_hline(x+tn2-e ,y, dx ,0); print_hline(x+tn2-e ,y+dy, dx ,0); print_vline(x+tn-e ,y+e, dy-2*e ,0); print_vline(x+dx-2*e,y+e, dy-2*e ,0); fprintf(curr->os,"\\egroup\n"); } if (vers) { sprintf(object,"\\begin{tiny}\\textbf{%s}\\end{tiny}",vers); print_put(x+1,y+.5,object); } } void gen_titleLines(Tlivrable*p) { const char* macro="\\ganttlf"; char* pc = p->title; char* pc2; if (pc==0) return; while ( (pc2=strstr(pc,macro))!=0 ) { char c = *pc2; *pc2 = 0; p->titleLines[p->nbTitleLines]=strdup(pc); p->nbTitleLines+=1; *pc2=c; pc=pc2+strlen(macro); } p->titleLines[p->nbTitleLines]=strdup(pc); p->nbTitleLines+=1; } %} %option noyywrap %% int tn,stn,dn,v,bm,em; char* title; char* kind; double an[3]; char* an_comment; int leader; int partner; #.*\n ; L=1 { leader=1; } L=0 { leader=0; } T=[0-9]+ { tn=atoi(yytext+2); } S=[0-9]+ { stn=atoi(yytext+2); } D=[0-9]+ { dn=atoi(yytext+2); } V=V[1-8F] { v=yytext[3]; } ML=[0-9]+ { int i; for (i=0 ; milestones[i]!=0 ; i++); milestones[i] = atoi(yytext+3); } STN=.* { int nb,tn, stn; char tmp[1000]; nb=sscanf(yytext+4,"%d%d%s",&tn,&stn,tmp); if ( nb==3 && 0<=tn && tn<10 && 0<=stn && stn<10 ) { char* p =strstr(yytext+4,tmp); subtask_names[tn][stn]=strdup(p); } else { fprintf(stderr, "bad formated ST rule (ignored): %s.\n",yytext); } } BM=[0-9]+ { bm=atoi(yytext+3); } EM=[0-9]+ { em=atoi(yytext+3); } R=none { an[0]=0; an[1]=0; an[2]=0; an_comment=0; } R=[0-9:.]+ { char tmp[1000]; int status = sscanf(yytext+2,"%lf:%lf:%lf:%s",an+0,an+1,an+2,tmp); if (status<3) { fprintf(stderr, "%s: is not resource definition, expected format \"N:N:N\" (near D%d%d%d-V%c)\n", yytext+2,tn,stn,dn,v); an[0]=0; an[1]=0; an[2]=0; an_comment=0; } else if (status==3) { an_comment = 0; } else an_comment = strdup(tmp); } PART="{"[^}]+"}" { int i; partner=-1; for (i=0; partner_table[i].key!=0 ; i++) { if (strstr(yytext,partner_table[i].key)!=0 ) { partner=i; break; } } if ( partner==-1 ) { fprintf(stderr,"%s: does not contains a partner key (near D%d%d%d-V%c)\n", yytext+5,tn,stn,dn,v); partner=0; } } KIND="{"[^}]+"}" { yytext[yyleng-1]=0; kind= strdup(yytext+6); if ( strcmp(kind,"x")!=0 && strcmp(kind,"d")!=0 && strcmp(kind,"h")!=0 && strcmp(kind,"d+x")!=0 ) fprintf(stderr,"ERROR:D%d%d%d invalid KIND: %s\n",tn,stn,dn,kind); } KIND="{}" { yytext[yyleng-1]=0; kind= strdup(yytext+6); } TITLE=.*\n { char* pc=yytext+6; yytext[yyleng-1]=0; while ( *pc==' ' || *pc=='\t' ) pc+=1; title=strdup(pc); Tlivrable* p= (Tlivrable*) calloc(sizeof(*p),1); p->tn = tn; p->stn = stn; p->dn = dn; p->v = v; p->hman[0] = an[0]; p->hman[1] = an[1]; p->hman[2] = an[2]; p->leader = leader; p->partner = partner; p->title = title; p->bm = bm; p->em = em; p->kind = kind; gen_titleLines(p); for (v=0; data_org.ls[tn][stn][dn][v]!=0 ; v++); data_org.ls[tn][stn][dn][v] = p; //fprintf(stderr,"ADDED: %d %d %d %d\n",tn,stn,dn,v); tn=stn=dn=v=bm=em=0; title=kind=0; an[0]= an[1]=an[1]=0; an_comment=0; partner=0; leader=0; } [ \t\n] ; . { fprintf(stderr,"%c: unexpected value in anr.gantt file (near D%d%d%d-V%c)\n", *yytext,tn,stn,dn,v); } %% void prepare0(Tdata* data) { int tn,stn,v; int i0,i1,i; for (tn=0 ; tnls[tn][stn][i][0]); fprintf(stderr,"\n"); while (1) { for (i0=0 ; i0ls[tn][stn][i0][0] == 0) break; for (i1=i0+1 ; i1ls[tn][stn][i1][0] != 0) break; if (i1>=D_MAX) break; // shift for (i=0 ; (i1+i)ls[tn][stn][i0+i][v] = data->ls[tn][stn][i1+i][v]; data->ls[tn][stn][i1+i][v] = 0; } } //fprintf(stderr,"AVANT:t=%d:%d:: ",tn,stn); for (i=0; ils[tn][stn][i][0]); fprintf(stderr,"\n"); } } void prepare1(Tdata* data) { int tn,dn,v; int i0,i1,i; for (tn=0 ; tnls[tn][i][0][0]); fprintf(stderr,"\n"); while (1) { for (i0=0 ; i0ls[tn][i0][0][0] == 0) break; for (i1=i0+1 ; i1ls[tn][i1][0][0] != 0) break; //fprintf(stderr,"%d %d %d\n",tn,i0,i1); if (i1>=S_MAX) break; // shift for (i=0 ; (i1+i)ls[tn][i0+i][dn][v] = data->ls[tn][i1+i][dn][v]; data->ls[tn][i1+i][dn][v] = 0; } } //fprintf(stderr,"APRES:t=%d:: ",tn,i0,i1); for (i=0; ils[tn][i][0][0]); fprintf(stderr,"\n"); } } void prepare2(Tdata* data) { int tn0,tn1,stn,dn,vn; int moved=1; while (moved) { moved=0; for (tn0=0 ; tn0ls[tn0][0][0][0] == 0) break; for (tn1=tn0+1 ; tn1ls[tn1][0][0][0] != 0) break; if (tn1==T_MAX) break; for (stn=0 ; stnls[tn0][stn][dn][vn] = data->ls[tn1][stn][dn][vn]; data->ls[tn1][stn][dn][vn] = 0; } moved=1; } } void prepare3(Tdata* data) { int tn,stn,dn,vn,cnt; Tlivrable* tmp; for (tn=0 ; tnls[tn][stn][dn][0]; if (p==0) continue; p->nbvers=0 ; p->nbpart=0 ; for (vn=0 ; vnls[tn][stn][dn][vn]; if (tmp==0) continue; if (tmp->leader==0) p->nbpart+=1; else p->nbvers+=1; } p->vers=(Tlivrable**)malloc(sizeof(*p->vers)*(p->nbvers+1)); for (vn=0,cnt=0 ; vnls[tn][stn][dn][vn]; if (tmp!=0 && tmp->leader==1) { p->vers[cnt++] = tmp; tmp->nbvers = p->nbvers; } } p->vers[cnt] = 0; if (p->nbpart!=0) { p->part=(Tlivrable**)malloc(sizeof(*p->part)*(p->nbpart+1)); for (vn=0,cnt=0 ; vnls[tn][stn][dn][vn]; if (tmp!=0 && tmp->leader==0) { p->part[cnt++] = tmp; } } p->part[cnt] = 0; } p->height = 1.0*DELIVRABLE_HEIGHT; if (p->nbTitleLines>=1) { double h=0; h += p->vers[p->nbvers-1]->nbTitleLines*DELIVRABLE_TITLEHEIGHT; h += (p->vers[p->nbvers-1]->nbTitleLines-1)*(DELIVRABLE_TITLEHEIGHT/5.); if ( h>p->height) p->height=h; } Tlivrable* lu= p->vers[p->nbvers-1]; int i; //fprintf(stderr,"--------------------\n"); for (i=0 ; inbvers ; i++) { Tlivrable* l= p->vers[i]; double bm= l->bm; double em= l->em; //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]); if (bm<12 && em>0) { lu->nbma[0] += (em>12?12:em)-bm; bm=12; } if (bm<24 && em>12) { lu->nbma[1] += (em>24?24:em)-bm; bm=24; } if (bm<36 && em>24) { lu->nbma[2] += em-bm; } //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); } } } double task_livrable_height(int tn, double* delivrable_y) { int stn,dn,nblivrables=0; double height=0; height += TASK_TITLEHEIGHT ; *delivrable_y = height; for (stn=0 ; curr->ls[tn][stn][0][0]!=0 ; stn++) for (dn=0 ; curr->ls[tn][stn][dn][0]!=0 ; dn++) { if ( curr->ls[tn][stn][dn][0]->leader==0 ) continue; nblivrables += 1; height+=curr->ls[tn][stn][dn][0]->height; } height += DELIVRABLE_VSEP/2; height += (nblivrables-1)*DELIVRABLE_VSEP; height += DELIVRABLE_VSEP/2; return height; } void task_box(double pictwidth) { int tn; for ( tn=0 ; curr->ls[tn][0][0][0]!=0 ; tn++ ) { const char* color= (tn%2)!=0 ? TASK_BGC1 : TASK_BGC0 ; fprintf(curr->os, "\\put(%.2f,%.2f){\\fcolorbox{black}{%s}{\\makebox(%5.2f,%5.2f){}}}\n", 0.0,curr->ls[tn][0][0][0]->task_y, color, pictwidth,curr->ls[tn][0][0][0]->task_dy ); } } void month_grid(double x, double y, double dx, double dy) { int i; for (i=0 ; i<=36 ; i+=1,x+=PICT_MONTHWIDTH) { if ( (i%3)!=0 ) continue; fprintf(curr->os, "\\put(%5.1f,%5.1f){\\line(0,1){%5.1f}}\\put(%5.1f,%5.1f){%d}\n", x,y,dy-PICT_MONTHWIDTH-PICT_VSEP, x-2,y+dy-PICT_MONTHHEIGHT, i ); } } void print_milestones(double x, double y, double dx, double dy) { int i; double tn=.3; //x=x-tn/2; fprintf(curr->os,"\\bgroup\n"); fprintf(curr->os,"\\color{red}\n"); fprintf(curr->os,"\\linethickness{%.2fmm}\n",tn); for (i=0 ; milestones[i]!=0 ; i+=1) { double xx= x + milestones[i]*PICT_MONTHWIDTH; print_vline(xx,y,dy-PICT_MONTHWIDTH-PICT_VSEP,0); char tmp[100]; sprintf(tmp,"M%d",i+1); print_put(xx-2,y-3,tmp); } fprintf(curr->os,"\\egroup\n"); } double delivrable( double label_x, double box_x, double title_x, double y, int tn, int stn, int dn) { Tlivrable* top=curr->ls[tn][stn][dn][0]; Tlivrable* last=curr->ls[tn][stn][dn][top->nbvers-1]; char tmp[1000],label[1000],title[1000]; double y0; int v; double label_dx = DELIVRABLE_LABELWIDTH ; double label_dy = DELIVRABLE_LABELHEIGHT ; double boxx,box_dx; double box_dy = DELIVRABLE_BOXHEIGHT ; double title_dx = DELIVRABLE_TITLEWIDTH ; double title_dy = DELIVRABLE_TITLEHEIGHT ; //print_hline(0,y,180,0); gen_label_base(label,top); // y -= DELIVRABLE_HEIGHT; y -= top->height ; //print_hline(0,y,180,0); fprintf(curr->os,"%% Delivrable %s (tn=%d stn=%d dn=%d\n",label,tn,stn,dn); // print label //y0 = (DELIVRABLE_HEIGHT-DELIVRABLE_LABELHEIGHT)/2; y0 = (top->height-DELIVRABLE_LABELHEIGHT)/2; sprintf(tmp,"\\ganttlabelstyle{%s}",label); print_put(label_x,y+y0,tmp); // print title if (last->nbTitleLines==1) { y0 = (DELIVRABLE_HEIGHT-DELIVRABLE_TITLEHEIGHT)/2; y0 += DELIVRABLE_TITLEHEIGHT/5. ; sprintf(tmp,"\\gantttitlestyle{%s}",last->title); print_put(title_x,y+y0,tmp); } else if (last->nbTitleLines>1) { int i; // y0 = (DELIVRABLE_HEIGHT-DELIVRABLE_TITLEHEIGHT)/2; y0=DELIVRABLE_TITLEHEIGHT/5.; sprintf(tmp,"\\gantttitlestyle{\\shortstack[l]{%s",last->titleLines[0]); for (i=1 ; inbTitleLines ; i+=1) { strcat(tmp,"\\\\"); strcat(tmp,last->titleLines[i]); } strcat(tmp,"}}"); print_put(title_x,y+y0,tmp); } // print box //y0 = (DELIVRABLE_HEIGHT-DELIVRABLE_BOXHEIGHT)/2; y0 = (top->height-DELIVRABLE_BOXHEIGHT)/2; if ( last==top ) { Tlivrable* l=top; boxx = box_x + l->bm*PICT_MONTHWIDTH ; box_dx = (l->em - l->bm) * PICT_MONTHWIDTH; print_box(1,0,boxx,y+y0,box_dx,box_dy,COLOR_BOX_LIGHT,0,0); print_box(0,0,boxx,y+y0,box_dx,box_dy,0,0,0); } else for (v=0 ; vnbvers ; v+=1) { Tlivrable* l=curr->ls[tn][stn][dn][v] ; gen_label_vers(tmp,l); boxx = box_x + l->bm*PICT_MONTHWIDTH ; box_dx = (l->em - l->bm) * PICT_MONTHWIDTH; print_box(1,0,boxx,y+y0,box_dx,box_dy,COLOR_BOX_LIGHT,0,0); print_box(0,tmp,boxx,y+y0,box_dx,box_dy,0,0,0); } y -= DELIVRABLE_VSEP; return y; } void task_delivrable(double label_x, double box_x, double title_x, int tn) { int stn,dn; Tlivrable* task=curr->ls[tn][0][0][0]; double y = task->task_y+task->task_dy-task->task_y_del; char tmp[1000]; sprintf(tmp,"\\textbf{Task-%d \\textit{%s}}",task->tn,task_names[task->tn]); print_put(label_x/2,y+(TASK_TITLEHEIGHT-TASK_TITLEFONTHEIGHT)/2,tmp); //y += DELIVRABLE_VSEP/2. ; for (stn=0 ; curr->ls[tn][stn][0][0]!=0 ; stn++) for (dn=0 ; curr->ls[tn][stn][dn][0]!=0 ; dn++) { if (curr->ls[tn][stn][dn][0]->dn >=0) y=delivrable(label_x,box_x,title_x,y,tn,stn,dn); } } void do_gantt(const char* fn, int* tnplus, int* tnmoins) { int tn; double pictwidth, pictheight; double gantt_x,gantt_y; double gantt_dx,gantt_dy; double label_x,title_x; curr = data_new(tnplus,tnmoins); if ( (curr->os=fopen(fn,"w"))==0 ) { fprintf(stderr,"can not open %s file for writing.\n",fn); fprintf(stderr,"generation of %s graph is skipped.\n",fn); return; } prepare0(curr); prepare1(curr); prepare2(curr); prepare3(curr); pictheight=0 ; pictheight += PICT_BOTSEP ; for ( tn=0 ; curr->ls[tn][0][0][0]!=0 ; tn++ ); for ( tn=tn-1 ; tn>=0 ; tn-- ) { double offset; curr->ls[tn][0][0][0]->task_y = pictheight; curr->ls[tn][0][0][0]->task_dy = task_livrable_height(tn,&offset); curr->ls[tn][0][0][0]->task_y_del = offset; pictheight += curr->ls[tn][0][0][0]->task_dy; pictheight += TASK_VSEP; } pictheight += PICT_MONTHHEIGHT; pictheight += PICT_TOPSEP ; gantt_y = PICT_BOTSEP ; gantt_dy = pictheight-PICT_TOPSEP-PICT_BOTSEP ; pictwidth=0; pictwidth += PICT_LEFTSEP; label_x = pictwidth; pictwidth += DELIVRABLE_LABELWIDTH; pictwidth += PICT_HSEP; gantt_x = pictwidth ; gantt_dx = 36*PICT_MONTHWIDTH ; pictwidth += gantt_dx ; pictwidth += PICT_HSEP; title_x = pictwidth; pictwidth += DELIVRABLE_TITLEWIDTH; pictwidth += PICT_RIGHTSEP; fprintf(curr->os,"\\setlength{\\unitlength}{0.9mm}\n"); fprintf(curr->os,"\\begin{picture}(%.1f,%.1f)\n",pictwidth,pictheight); //print_hline(0,0,pictwidth,0); //print_hline(0,pictheight,pictwidth,0); task_box(pictwidth); month_grid(gantt_x,gantt_y,gantt_dx,gantt_dy); for ( tn=0 ; curr->ls[tn][0][0][0]!=0 ; tn++ ) { task_delivrable(label_x,gantt_x,title_x,tn); } print_milestones(gantt_x,0,gantt_dx,gantt_dy+gantt_y); fprintf(curr->os,"\\end{picture}\n"); fclose(curr->os); curr->os=0; } Tlivrable* do_partner_table_getLivrable(Tlivrable** leader, Tlivrable* top, int partner) { int i; Tlivrable* ret; *leader=top->vers[top->nbvers-1]; if (leader[0]->partner==partner) return *leader; for (i=0; inbpart ; i+=1) { ret= top->part[i]; if ( ret->partner==partner ) return ret; } return 0; } void do_partner_table_full(int partner) { struct partner_def* part = partner_table+partner; if ( (curr->os=fopen(part->fnfull,"w"))==0 ) { fprintf(stderr,"can not open %s file for writing.\n",part->fnfull); fprintf(stderr,"generation of %s partner table is skipped.\n",part->fnfull); return; } fprintf(curr->os,"\\begin{tabular}{|c|l||r|r|r||r|}\\hline\n"); fprintf(curr->os, "number & \\multicolumn{1}{c||}{title} & \\multicolumn{3}{c||}{years } & total \\\\\\cline{3-5}\n"); fprintf(curr->os, " & & \\multicolumn{1}{c|}{1} & \\multicolumn{1}{c|}{2} & " "\\multicolumn{1}{c||}{3} & \\\\\\hline\\hline\n"); int tn,stn,dn,v=0; double an1=0,an2=0,an3=0,an=0; double tsk1,tsk2,tsk3,tsk; int newlineadded=1; for (tn=0 ; tnls[tn][0][0][0]==0) break; if (tn!=0 && newlineadded==0 ) { newlineadded = 1; fprintf(curr->os,"\\hline "); } tsk1=tsk2=tsk3=tsk=0; for (stn=0; stnls[tn][stn][dn][v]; if (top==0) continue; if ( (lcurr=do_partner_table_getLivrable(&leader,top,partner))==0 ) continue; double sum1,sum2,sum3,sum=0; sum1 = lcurr->hman[0]; sum +=sum1; sum2 = lcurr->hman[1]; sum +=sum2; sum3 = lcurr->hman[2]; sum +=sum3; char label_lnk[1000],label[1000],title[1000]; gen_label_base(label,leader); sprintf(label_lnk,"\\hyperlink{%s}{%s}",label,label); sprintf(title,"\\resstablestyletitle{%s}",leader->title); fprintf(curr->os,"%s & %s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n", label_lnk,title,sum1,sum2,sum3,sum); an1 += sum1 ; tsk1 += sum1 ; an2 += sum2 ; tsk2 += sum2 ; an3 += sum3 ; tsk3 += sum3 ; an += sum ; tsk += sum ; newlineadded=0; if ( sum1==0 && leader->nbma[0]!=0) fprintf(stderr,"ERROR: %-10s:%s probleme sur l'an 1 (in table=%2.1f, in gantt=%2.1f\n", part->name,label,sum1,leader->nbma[0]); else if (sum1!=0 && leader->nbma[0]==0 ) fprintf(stderr,"ERROR: %-10s:%s probleme sur l'an 1 (in table=%2.1f, in gantt=%2.1f\n", part->name,label,sum1,leader->nbma[0]); else if (sum1!=0 && sum1>leader->nbma[0] ) fprintf(stderr,"WARNING: %-10s:%s probleme sur l'an 1 (in table=%2.1f, in gantt=%2.1f\n", part->name,label,sum1,leader->nbma[0]); if ( sum2==0 && leader->nbma[1]!=0) fprintf(stderr,"ERROR: %-10s:%s probleme sur l'an 2 (in table=%2.1f, in gantt=%2.1f\n", part->name,label,sum2,leader->nbma[1]); else if ( sum2!=0 && leader->nbma[1]==0) fprintf(stderr,"ERROR: %-10s:%s probleme sur l'an 2 (in table=%2.1f, in gantt=%2.1f\n", part->name,label,sum2,leader->nbma[1]); else if (sum2!=0 && sum2>leader->nbma[1]) fprintf(stderr,"WARNING: %-10s:%s probleme sur l'an 2 (in table=%2.1f, in gantt=%2.1f\n", part->name,label,sum2,leader->nbma[1]); if ( sum3==0 && leader->nbma[2]!=0) fprintf(stderr,"ERROR: %-10s:%s probleme sur l'an 3 (in table=%2.1f, in gantt=%2.1f\n", part->name,label,sum3,leader->nbma[2]); else if ( sum3!=0 && leader->nbma[2]==0) fprintf(stderr,"ERROR: %-10s:%s probleme sur l'an 3 (in table=%2.1f, in gantt=%2.1f\n", part->name,label,sum3,leader->nbma[2]); else if (sum3!=0 && sum3>leader->nbma[2]) fprintf(stderr,"WARNING: %-10s:%s probleme sur l'an 3 (in table=%2.1f, in gantt=%2.1f\n", part->name,label,sum3,leader->nbma[2]); } } if (tsk!=0) fprintf(curr->os,"%s & total Task-%d & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n", "",curr->ls[tn][0][0][0]->tn,tsk1,tsk2,tsk3,tsk); } if ( an!=(an1+an2+an3) ) { fprintf(stderr,"bad computation in %s table.\n",part->fnfull); } fprintf(curr->os,"\\hline\n"); fprintf(curr->os,"%s & %s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n", "","total",an1,an2,an3,an); fprintf(curr->os,"\\end{tabular}\n"); fclose(curr->os); curr->os=0; } void do_partner_table_short(int partner) { struct partner_def* part = partner_table+partner; if ( (curr->os=fopen(part->fnshort,"w"))==0 ) { fprintf(stderr,"can not open %s file for writing.\n",part->fnshort); fprintf(stderr,"generation of %s partner table is skipped.\n",part->fnshort); return; } fprintf(curr->os,"\\begin{center}\\begin{small}\\begin{tabular}{|c|l||r|r|r||r|}\\hline\n"); fprintf(curr->os, " & title & \\multicolumn{3}{c||}{years } & total \\\\\\cline{3-5}\n"); fprintf(curr->os, " & & \\multicolumn{1}{c|}{1} & \\multicolumn{1}{c|}{2} & " "\\multicolumn{1}{c||}{3} & \\\\\\hline\\hline\n"); int tn,stn,dn,v=0; double an1=0,an2=0,an3=0,an=0; double tsk1,tsk2,tsk3,tsk; int newlineadded=1; for (tn=0 ; tnls[tn][0][0][0]==0) break; tsk1=tsk2=tsk3=tsk=0; for (stn=0; stnls[tn][stn][dn][v]; if (top==0) continue; if ( (lcurr=do_partner_table_getLivrable(&leader,top,partner))==0 ) continue; double sum1,sum2,sum3,sum=0; sum1 = lcurr->hman[0]; sum +=sum1; sum2 = lcurr->hman[1]; sum +=sum2; sum3 = lcurr->hman[2]; sum +=sum3; an1 += sum1 ; tsk1 += sum1 ; an2 += sum2 ; tsk2 += sum2 ; an3 += sum3 ; tsk3 += sum3 ; an += sum ; tsk += sum ; newlineadded=0; } } if (tsk!=0) fprintf(curr->os,"Task-%d & %s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n", curr->ls[tn][0][0][0]->tn, task_names[curr->ls[tn][0][0][0]->tn],tsk1,tsk2,tsk3,tsk); } if ( an!=(an1+an2+an3) ) { fprintf(stderr,"bad computation in %s table.\n",part->fnshort); } fprintf(curr->os,"\\hline\n"); fprintf(curr->os," & %s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n", "total",an1,an2,an3,an); fprintf(curr->os,"\\end{tabular}\\end{small}\\end{center}\n"); fclose(curr->os); curr->os=0; } void do_livrable_tables_open(int tablenum, int last) { char fn[1024]; if (curr->os!=0) { fprintf(curr->os,"\\end{tabular}\n"); fclose(curr->os); curr->os = 0; } if ( last ) return; sprintf(fn,"table_livrable_%02d.tex",tablenum); if ( (curr->os=fopen(fn,"w"))==0 ) { fprintf(stderr,"FATAL: can not open %s file for writing.\n",fn); exit(1); } fprintf(curr->os,"\\begin{tabular}[t]{|l|c|c|c|p{\\desclen}|}\\hline\n"); fprintf(curr->os,"number"); fprintf(curr->os," & resp."); fprintf(curr->os," & \\makebox[2mm]{T0+}"); fprintf(curr->os," & \\makebox[2mm]{kind}"); fprintf(curr->os," & description\\\\\\hline\\hline\n"); } void do_livrable_tables(int maxlines) { int nblines=maxlines; int nbfile=1; int tn,stn,dn,v; do_livrable_tables_open(nbfile,0); nbfile +=1 ; for (tn=0 ; tnls[tn][0][0][0]==0 ) break; for (stn=0; stnls[tn][stn][0][0]==0 ) break; for (dn=0; dnls[tn][stn][dn][0]; if ( top==0 ) break; Tlivrable* last=top->vers[top->nbvers-1]; if ( (nblines-top->nbvers) <= 0 ) { do_livrable_tables_open(nbfile,0); nbfile +=1 ; nblines = maxlines; } for (v=0; vls[tn][stn][dn][v]; if ( l==0 ) break; if ( l->leader==0 ) continue; char label_lnk[1000],label[1000],resp[100],date[100],kind[100],desc[1000]; gen_label_full(label,l); sprintf(label_lnk,"\\hyperlink{%s}{%s}",label,label); sprintf(resp,"\\S%s",partner_table[l->partner].key); sprintf(date,"\\makebox[2mm][r]{%d}",l->em); sprintf(kind,"\\makebox[1mm]{%s}",l->kind); if ( top->nbvers == 1 ) sprintf(desc,"%s \\\\\\hline\n",last->title); else if ( v==(top->nbvers-1) ) sprintf(desc, "\\multirow{-%d}{\\desclen}{%s}\\\\\\hline\n", top->nbvers,last->title); //else if ( v==(top->nbvers-1) ) // sprintf(desc, "\\\\\\hline\n"); else sprintf(desc, "\\\\\\cline{1-4}\n"); fprintf(curr->os,"%-15s", label_lnk); fprintf(curr->os," & %-10s", resp); fprintf(curr->os," & %-30s", date); fprintf(curr->os," & %-30s", kind); fprintf(curr->os," & %s", desc); nblines -= 1; } }}} do_livrable_tables_open(nbfile,1); } void do_effort_par_livrable(char* filename,int from_task, int to_task) { //struct partner_def* part; if ( (curr->os=fopen(filename,"w"))==0 ) { fprintf(stderr,"can not open %s file for writing.\n",filename); fprintf(stderr,"generation of %s file is skipped.\n",filename); return; } fprintf(curr->os,"\\begin{tabular}{|l|l||c|r|r|r||r|}\\hline\n"); fprintf(curr->os, "number & \\multicolumn{1}{c||}{title} & part. & \\multicolumn{3}{c||}{years } & total \\\\\\cline{4-6}\n"); fprintf(curr->os, " & & & \\multicolumn{1}{c|}{1} & \\multicolumn{1}{c|}{2} & " "\\multicolumn{1}{c||}{3} & \\\\\\hline\\hline\n"); int tn,stn,dn,partner; double an1=0,an2=0,an3=0,an=0; for (tn=0 ; tnls[tn][0][0][0]==0) break; for (stn=0; stnls[tn][stn][dn][0]; if ( top==0 ) break; if ( !( from_task<=top->tn && top->tn<=to_task ) ) break; double liv1=0,liv2=0,liv3=0,liv=0; for (partner=1 ; partner_table[partner].key!=0 ; partner+=1) { Tlivrable *lcurr,*leader; if ( (lcurr=do_partner_table_getLivrable(&leader,top,partner))==0 ) continue; double sum1,sum2,sum3,sum=0; sum1 = lcurr->hman[0]; sum +=sum1; sum2 = lcurr->hman[1]; sum +=sum2; sum3 = lcurr->hman[2]; sum +=sum3; char label_lnk[1000],label[1000],title[1000]; gen_label_base(label,lcurr); sprintf(label_lnk,"\\hspace{1.5cm}\\hyperlink{%s}{%s}",label,label); sprintf(title,"\\resstablestyletitle{%s}",top->title); fprintf(curr->os,"%s %10s & %50s & %10s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\n", linenb==0 ? "" : "\\cline{3-7}\n", linenb==0 ? label_lnk : "", linenb==0 ? title : "", partner_table[lcurr->partner].key, sum1,sum2,sum3,sum ); linenb += 1; liv1 += sum1 ; st_sum1 += sum1 ; t_sum1 += sum1 ; an1 += sum1 ; liv2 += sum2 ; st_sum2 += sum2 ; t_sum2 += sum2 ; an2 += sum2 ; liv3 += sum3 ; st_sum3 += sum3 ; t_sum3 += sum3 ; an3 += sum3 ; liv += sum ; st_sum += sum ; t_sum += sum ; an += sum ; } if (linenb>=0) { livrablenb +=1; task_n=top->tn; subtask_n=top->stn; if (linenb>1) { fprintf(curr->os,"\\cline{3-7}\n"); fprintf(curr->os,"%10s & %50s & %10s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n", "","","total",liv1,liv2,liv3,liv); } else fprintf(curr->os,"\\cline{1-7}\n"); } } if ( livrablenb>0) { char name[100]; char title[1000]; sprintf(name,"\\hspace{0.5cm}st%d-%d",task_n,subtask_n); sprintf(title,"\\resstablestyletitle{%s}",get_subtask_name(task_n,subtask_n)); fprintf(curr->os,"%10s & %50s & %10s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\n", name,title,"total",st_sum1,st_sum2,st_sum3,st_sum); subtasknb += 1; } } if ( subtasknb>0 ) { char name[100]; char title[1000]; sprintf(name,"task-%d",task_n); sprintf(title,"\\resstablestyletitle{%s}",task_names[task_n]); fprintf(curr->os,"%10s & %50s & %10s & %2.1f & %2.1f & %2.1f & %2.1f \\\\\\hline\\hline\n", name,title,"total",t_sum1,t_sum2,t_sum3,t_sum); } } fprintf(curr->os,"\\end{tabular}\n"); fclose(curr->os); curr->os=0; } void do_partner_by_subtask() { char filename[2000]; int tn,stn,dn,partner; for (tn=0 ; tnls[tn][0][0][0]==0) break; for (stn=0; stnls[tn][stn][dn][0]; if ( top==0 ) break; double liv1=0,liv2=0,liv3=0,liv=0; for (partner=1 ; partner_table[partner].key!=0 ; partner+=1) { Tlivrable *lcurr,*leader; if ( (lcurr=do_partner_table_getLivrable(&leader,top,partner))==0 ) { continue; } parts[partner]=1; partnb+=1; task_n = top->tn; subtask_n = top->stn; } } if (partnb==0) continue; sprintf(filename,"tmp/st%d-%d-partner.tex",task_n,subtask_n); if ( (curr->os=fopen(filename,"w"))==0 ) { fprintf(stderr,"can not open %s file for writing.\n",filename); fprintf(stderr,"generation of %s file is skipped.\n",filename); continue; } for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) { if ( parts[partner]==0) continue; fprintf(curr->os,"\\S%s\n",partner_table[partner].key); } fclose(curr->os); curr->os=0; } } } #if 1 void do_effort_par_livrable_xls(char* filename,int from_task, int to_task) { //struct partner_def* part; if ( (curr->os=fopen(filename,"w"))==0 ) { fprintf(stderr,"can not open %s file for writing.\n",filename); fprintf(stderr,"generation of %s file is skipped.\n",filename); return; } int tn,stn,dn,partner; fprintf(curr->os,"\"task\";\"sub-task\";\"delivrable\";"); fprintf(curr->os,"\"cumul\";;;;"); for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) { fprintf(curr->os,"\"%s\";;;;",partner_table[partner].key); } fprintf(curr->os,"\"description\";\n"); fprintf(curr->os,";;;"); fprintf(curr->os,"\"an 1\";\"an 2\";\"an 3\";\"sum\";"); for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) { fprintf(curr->os,"\"an 1\";\"an 2\";\"an 3\";\"sum\";"); } fprintf(curr->os,";\n"); double an1=0,an2=0,an3=0,anA=0; double an1p[100], an2p[100], an3p[100], anAp[100]; memset(an1p,0,sizeof(an1p)); memset(an2p,0,sizeof(an2p)); memset(an3p,0,sizeof(an3p)); memset(anAp,0,sizeof(anAp)); for (tn=0 ; tnls[tn][0][0][0]==0) break; for (stn=0; stnls[tn][stn][dn][0]; if ( top==0 ) break; if ( !( from_task<=top->tn && top->tn<=to_task ) ) break; double liv1=0,liv2=0,liv3=0,liv=0; char label_lnk[1000],label[1000],title[1000]; gen_label_base(label,top); sprintf(label_lnk,"\\hyperlink{%s}{%s}",label,label); sprintf(title,"%s",top->title); double sum1p[20], sum2p[20], sum3p[20], sumAp[20]; memset(sum1p,0,sizeof(sum1p)); memset(sum2p,0,sizeof(sum2p)); memset(sum3p,0,sizeof(sum3p)); memset(sumAp,0,sizeof(sumAp)); task_n=top->tn; subtask_n=top->stn; for (partner=1 ; partner_table[partner].key!=0 ; partner+=1) { Tlivrable *lcurr,*leader; if ( (lcurr=do_partner_table_getLivrable(&leader,top,partner))==0 ) continue; double sum1,sum2,sum3,sum=0; sum1 = lcurr->hman[0]; sum +=sum1; sum2 = lcurr->hman[1]; sum +=sum2; sum3 = lcurr->hman[2]; sum +=sum3; linenb += 1; liv1 += sum1 ; st_sum1 += sum1 ; t_sum1 += sum1 ; an1 += sum1 ; liv2 += sum2 ; st_sum2 += sum2 ; t_sum2 += sum2 ; an2 += sum2 ; liv3 += sum3 ; st_sum3 += sum3 ; t_sum3 += sum3 ; an3 += sum3 ; liv += sum ; st_sumA += sum ; t_sumA += sum ; anA += sum ; sum1p[partner] += sum1 ; st_sum1p[partner] += sum1 ; t_sum1p[partner] += sum1 ; an1p[partner] += sum1 ; sum2p[partner] += sum2 ; st_sum2p[partner] += sum2 ; t_sum2p[partner] += sum2 ; an2p[partner] += sum2 ; sum3p[partner] += sum3 ; st_sum3p[partner] += sum3 ; t_sum3p[partner] += sum3 ; an3p[partner] += sum3 ; sumAp[partner] += sum ; st_sumAp[partner] += sum ; t_sumAp[partner] += sum ; anAp[partner] += sum ; } if (linenb>=1) { livrablenb+=1; fprintf(curr->os,";;\"%s\";",label); fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;",liv1,liv2,liv3,liv); for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) { fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;", sum1p[partner],sum2p[partner],sum3p[partner],sumAp[partner]); } fprintf(curr->os,"\"%s\";",title); fprintf(curr->os,"\n"); } } if ( livrablenb>0) { subtasknb += 1; char name[100]; char title[1000]; sprintf(name,"st%d-%d",task_n,subtask_n); sprintf(title,"%s",get_subtask_name(task_n,subtask_n)); fprintf(curr->os,";\"%s\";;",name); fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;",st_sum1,st_sum2,st_sum3,st_sumA); for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) { fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;", st_sum1p[partner],st_sum2p[partner],st_sum3p[partner],st_sumAp[partner]); } fprintf(curr->os,"\"%s\";",title); fprintf(curr->os,"\n"); } } if ( subtasknb>0 ) { char name[100]; char title[1000]; sprintf(name,"task-%d",task_n); sprintf(title,"%s",task_names[task_n]); fprintf(curr->os,"\"%s\";;;",name); fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;",t_sum1,t_sum2,t_sum3,t_sumA); for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) { fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;", t_sum1p[partner],t_sum2p[partner],t_sum3p[partner],t_sumAp[partner]); } fprintf(curr->os,"\"%s\";",title); fprintf(curr->os,"\n"); } } char name[100]; char title[1000]; sprintf(name,"total"); sprintf(title,"%s",""); fprintf(curr->os,"\"%s\";;;",name); fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;",an1,an2,an3,anA); for ( partner=1 ; partner_table[partner].key!=0 ; partner+=1) { fprintf(curr->os,"%2.1f;%2.1f;%2.1f;%2.1f;", an1p[partner],an2p[partner],an3p[partner],anAp[partner]); } fprintf(curr->os,"\"%s\";",title); fprintf(curr->os,"\n"); fclose(curr->os); curr->os=0; } #endif int main() { int tnplus[10] = { 1, 2, 3, 4, 5, 6, -1 }; int tnmoins[10] = { 1, 2, 3, 4, 5, 6, -1 }; yylex(); do_gantt("gantt.tex",0,0); do_gantt("gantt1.tex",tnplus,0); do_gantt("gantt2.tex",0,tnmoins); curr = data_new(0,0); prepare0(curr); prepare1(curr); prepare2(curr); prepare3(curr); do_partner_table_full(1); do_partner_table_short(1); do_partner_table_full(2); do_partner_table_short(2); do_partner_table_full(3); do_partner_table_short(3); do_partner_table_full(4); do_partner_table_short(4); do_partner_table_full(5); do_partner_table_short(5); do_partner_table_full(6); do_partner_table_short(6); do_partner_table_full(7); do_partner_table_short(7); do_partner_table_full(8); do_partner_table_short(8); curr = data_new(0,0); prepare0(curr); prepare1(curr); prepare2(curr); prepare3(curr); do_livrable_tables(44); curr = data_new(0,0); prepare0(curr); prepare1(curr); prepare2(curr); prepare3(curr); do_effort_par_livrable("tmp/effort-par-livrable-1.tex",1,2); do_effort_par_livrable("tmp/effort-par-livrable-2.tex",3,5); do_effort_par_livrable("tmp/effort-par-livrable-3.tex",6,7); do_effort_par_livrable("tmp/effort-par-livrable-4.tex",8,8); do_effort_par_livrable_xls("tmp/effort-par-livrable.csv",1,8); curr = data_new(0,0); prepare0(curr); prepare1(curr); prepare2(curr); prepare3(curr); do_partner_by_subtask(); return 0; }