#define americano 0 #define europeo 1 #define lmax 200 #define posin 18 #define ladat 82+posin #define estac 38+posin // llamadas entrantes #define linea 23+posin #define durac 29+posin #define hor 15+posin #define fech 5+posin #define tranf 0+posin #define numero 44+posin #define ccost 0 #define proye 70+posin #define cuenta 0 #define pulsos 0 #define ruta 0 #define prinum 0 #define ring 63+posin #define antran 0 // anexo transferido (pendiente) #define fofech europeo // formato de fecha #define num_tra 600 extern void gua_rut(char *buf); char ruanex[(lmax+1)*2][7] ; /* Rutas Consideradas como Anexos */ struct Llamad { char Hor[8],lin[3],num[17],pry[5] ; } lla_tra[num_tra+1] ; int max_tra ; /* incrementar hora + duraci˘n */ void inc_hor(char *chor, int Hor, int dur, char *buf) { int i,ihor_h,ihor_m,ihor_s,idur_h,idur_m,idur_s ; char chor_h[3],chor_m[3],chor_s[3],cdur_h[3],cdur_m[3],cdur_s[3] ; for(i=0;i<2;i++) chor_h[i-0]=buf[Hor+i] ; chor_h[2]='\0' ; for(i=3;i<5;i++) chor_m[i-3]=buf[Hor+i] ; chor_m[2]='\0' ; for(i=6;i<8;i++) chor_s[i-6]=buf[Hor+i] ; chor_s[2]='\0' ; for(i=0;i<2;i++) cdur_h[i-0]=buf[dur+i] ; cdur_h[2]='\0' ; for(i=3;i<5;i++) cdur_m[i-3]=buf[dur+i] ; cdur_m[2]='\0' ; for(i=6;i<8;i++) cdur_s[i-6]=buf[dur+i] ; cdur_s[2]='\0' ; ihor_h=atoi(chor_h) ; ihor_m=atoi(chor_m) ; ihor_s=atoi(chor_s) ; idur_h=atoi(cdur_h) ; idur_m=atoi(cdur_m) ; idur_s=atoi(cdur_s) ; if ((ihor_s += idur_s)>=60) { ihor_s -= 60 ; ihor_m++ ;} if ((ihor_m += idur_m)>=60) { ihor_m -= 60 ; ihor_h++ ;} if ((ihor_h += idur_h)>=24) { ihor_h -= 24 ;} itoa(ihor_h,chor_h,10) ; itoa(ihor_m,chor_m,10) ; itoa(ihor_s,chor_s,10) ; if (ihor_h<10) {chor[0]='0' ; chor[1]=chor_h[0] ;} else { chor[0]=chor_h[0] ; chor[1]=chor_h[1] ;} chor[2]=':' ; if (ihor_m<10) {chor[3]='0' ; chor[4]=chor_m[0] ;} else { chor[3]=chor_m[0] ; chor[4]=chor_m[1] ;} chor[5]=':' ; if (ihor_s<10) {chor[6]='0' ; chor[7]=chor_s[0] ;} else { chor[6]=chor_s[0] ; chor[7]=chor_s[1] ;} } /* abrir archivo de llamadas posibles de ser transferidas */ void abr_tra() { FCHAN t_arch ; char bufp[sizeof(struct Llamad)+10] ; int i,j=0,lim=sizeof(struct Llamad) ; max_tra=-1 ; if( (t_arch = _FOpen("ptelf.tra",FO_READONLY)) != -1 ) { while ( !_FEOF(t_arch) && j<=num_tra ) { i=_FGets(t_arch,bufp,lim+4); if (i==lim) { max_tra=j ; for(i=0 ;i<8 ;i++) lla_tra[j].Hor[i- 0] = bufp[i] ; for(i=8 ;i<11;i++) lla_tra[j].lin[i- 8] = bufp[i] ; for(i=11;i<28;i++) lla_tra[j].num[i-11] = bufp[i] ; for(i=28;i<33;i++) lla_tra[j].pry[i-28] = bufp[i] ; j++ ; } } _FClose(t_arch); } } /* cerrar archivo de llamadas posibles de transferir */ void cer_tra() { int j=0,lim=sizeof(struct Llamad) ; FCHAN t_arch; t_arch = _FCreate("ptelf.tra",FC_NORMAL); while (j<=max_tra) { _FWrite(t_arch,(char *)&lla_tra[j],lim); _FWrite(t_arch,"\r\n",2); j++ ; } _FClose(t_arch) ; } /* agregar llamada */ void agr_tra(int Hor,int lin,int num, int pry, int dur, char *buf) { int i,j ; char chor[8] ; inc_hor(chor,hor,dur,buf) ; if (max_tra>=num_tra) { j=0 ; while (j2 || i_lin!=3 ) && j>=0 ) { for(i=0;i<2;i++) thor_h[i-0]=lla_tra[j].Hor[i] ; thor_h[2]='\0' ; for(i=3;i<5;i++) thor_m[i-3]=lla_tra[j].Hor[i] ; thor_m[2]='\0' ; for(i=6;i<8;i++) thor_s[i-6]=lla_tra[j].Hor[i] ; thor_s[2]='\0' ; t_hor = atoi(thor_h)*3600+atoi(thor_m)*60+atoi(thor_s) ; for(i=0;i<3 && lla_tra[j].lin[i]==buf[lin+i];i++) ; i_lin = i ; if (abs(c_hor-t_hor)>2 || i_lin!=3 ) j-- ; } if (abs(c_hor-t_hor)<=2 && i_lin==3) { inc_hor(chor,hor,durac,buf) ; for(i=0;i<8 ;i++) lla_tra[j].Hor[i] = chor[i] ; for(i=0;i<17;i++) num[i] = lla_tra[j].num[i] ; for(i=0;i<5 ;i++) pry[i] = lla_tra[j].pry[i] ; } else { num[0] = '*' ; for(i=1;i<17;i++) num[i] = ' ' ; for(i=0;i<5;i++) pry[i] = '*' ; } } extern char rgua[]; // Procesos Inicialiales (Inicializar Variables, Abrir // Archivos especiales, etc) void in_central() { rgua[0] = '\0'; // abr_tra(); } // Procesos de Finalización (Cerrar Archivos especiales, etc) void fi_central() { // cer_tra(); } // Driver Propiamente tal. Las posiciones de los campos se // ingresan como parámetros, lo que permite modificar desde // Aplicación de Tarificación la posición de estos en el // Registro de Llamados. void DatCentral(char *buf, char *tel, int vestac, int vlinea,int vdurac,int vhor, int vfech, int vtranf, int vnumero, int vccost,int vproye, int vcuenta, int vpulsos, int vruta, int vprinum, int vring, int vantran, int vfofech) { char anum[20],apry[5], spry[6] ; int i=strlen(buf),it,k,ka; char aux; aux = 0; strcpy(spry,"*****"); if (i>(vestac+2) && buf[vfech+2]=='/' && buf[vfech+5]=='/' && buf[vhor+2]==':' && buf[vdurac+2]==':' && buf[vdurac+5]==':' && (buf[vtranf]=='I' || buf[vtranf]=='O')) { k = 0 ; // tel[k++] = buf[vestac+0] ;tel[k++] = buf[vestac+1] ;tel[k++] = buf[vestac+2] ; for (i=0;i<4;i++) { if (buf[vestac+i]!=' ') tel[k++] = buf[vestac+i] ; } tel[k++] = ' ' ; for (i=0;i<6;i++) { if (buf[vlinea+i]!=' ') tel[k++] = buf[vlinea+i] ; } tel[k++] = ' ' ; if (buf[vdurac+0]!=' ') tel[k++]=buf[vdurac+0] ; else tel[k++]='0' ; if (buf[vdurac+1]!=' ') tel[k++]=buf[vdurac+1] ; else tel[k++]='0' ; tel[k++] = ':' ; if (buf[vdurac+3]!=' ') tel[k++]=buf[vdurac+3] ; else tel[k++]='0' ; if (buf[vdurac+4]!=' ') tel[k++]=buf[vdurac+4] ; else tel[k++]='0' ; tel[k++] = ':' ; if (buf[vdurac+6]!=' ') tel[k++]=buf[vdurac+6] ; else tel[k++]='0' ; if (buf[vdurac+7]!=' ') tel[k++]=buf[vdurac+7] ; else tel[k++]='0' ; tel[k++] = ' ' ; ka = k ; tel[k++] = buf[vhor] ; tel[k++] = buf[vhor+1] ; if (tel[ka]==' ') tel[ka]='0' ; tel[k++] = ':' ; tel[k++] = buf[vhor+3] ; tel[k++] = buf[vhor+4] ; tel[k++] = ' ' ; if (vfofech==europeo) { tel[k++] = buf[vfech+3] ; tel[k++] = buf[vfech+4] ; tel[k++] = '/'; tel[k++] = buf[vfech] ; tel[k++] = buf[vfech+1] ; } else { tel[k++] = buf[vfech] ; tel[k++] = buf[vfech+1] ; tel[k++] = '/'; tel[k++] = buf[vfech+3] ; tel[k++] = buf[vfech+4] ; } tel[k++] = '/'; tel[k++] = buf[vfech+6] ; tel[k++] = buf[vfech+7] ; tel[k++] = ' ' ; tel[k++] = buf[vtranf] ; tel[k++] = ' ' ; for (it=0;it<5 && (it+vproye)