/*********************************************************************/
// << CatCnts2w32.c >> : 複数のcntファイル1を一つのw32ファイルにする
/*********************************************************************/
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <string.h>
#include <stdlib.h>
int AtoToI(char *dec, int byt); //
time_t IncDayTim(char *dDayTim, char *sDayTim); //
int SplitLin(int max_n,char *bf,char *argv[]);
long XtoL(char *dt);
void CharCpy(char *dbf, char *sbf, int n); // キャラクタ コピ-
/*********************************************************************/
int main(int argc ,char *argv[])
{
FILE *fp0,*fp2;
char cntFnm[360][32],winFnm[64],daytim[16];
char bf0[256],bf1[256];
int i,mint;
if((argc<3)||(0==strcmp("--h",argv[1]))){
printf("CatCnts2w32 cnt_file minute [win32_file]\n");
printf(" cnt_file : first win32file (*****.cnt)\n");
printf(" minute : 1..60 (default: minute=1)\n");
printf(" win32_file: win32 file name\n");
printf(" .. 2008/10/14 ..\n");
exit(0);
}
if(0==(mint=atoi(argv[2]))){ printf("syntax error\n"); exit(0); }
for(i=0;i<mint;i++){ // get 先頭 cnt ファイル名
strncpy(cntFnm[i],argv[1],31); cntFnm[i][31]=16;
}
if(argc>=4){ strcpy(winFnm,argv[3]); }
else{ strcpy(winFnm,argv[1]); }
CharCpy(daytim,cntFnm[0],12); daytim[12]=0; // get 先頭時刻
for(i=1;i<mint;i++){ // 次の1分時刻
IncDayTim(daytim, daytim); // set 次のcnt ファイル名
CharCpy(cntFnm[i],daytim,12);
}
sprintf(bf0,"cp %s tmp0_w32.tmp\n",cntFnm[0]);
if(0==(fp0=popen(bf0,"r"))){ printf("error : %s\n",bf0); exit(0); }
do{
if(0==fgets(bf1,255,fp0)){ break; }
if(0==strncmp("***** ERR",bf1,9)){ printf("error %s\n",bf1); exit(0); }
}while(1);
pclose(fp0);
for(i=1; i<mint; i++){
// -- cat_win32
sprintf(bf0,"catwin32 tmp0_w32.tmp %s > tmp1_w32.tmp\n",cntFnm[i]);
printf("%s",bf0);
if(0==(fp0=popen(bf0,"r"))){ printf("error : %s\n",bf0); exit(0); }
do{
if(0==fgets(bf1,255,fp0)){ break; }
if(0==strncmp("***** ERR",bf1,9)){ printf("error %s\n",bf1); exit(0); }
}while(1);
pclose(fp0);
sprintf(bf0,"cp tmp1_w32.tmp tmp0_w32.tmp\n");
if(0==(fp0=popen(bf0,"r"))){ printf("error : %s\n",bf0); exit(0); }
do{
if(0==fgets(bf1,255,fp0)){ break; }
if(0==strncmp("***** ERR",bf1,9)){ printf("error %s\n",bf1); exit(0); }
}while(1);
pclose(fp0);
}
sprintf(bf0,"cp tmp1_w32.tmp %s\n",winFnm);
if(0==(fp0=popen(bf0,"r"))){ printf("error : %s\n",bf0); exit(0); }
do{
if(0==fgets(bf1,255,fp0)){ break; }
if(0==strncmp("***** ERR",bf1,9)){ printf("error %s\n",bf1); exit(0); }
}while(1);
pclose(fp0);
if(0==(fp0=popen("rm *.tmp\n","r"))){ printf("error : rm tmp1.w32\n"); exit(0); }
do{ if(0==fgets(bf1,255,fp0)) break; }while(1);
pclose(fp0);
printf("seiko\n");
exit(0);
}
//=====================================================================
//
int AtoToI(char *dec, int byt) //
{
char bf[6];
int d;
strncpy(bf,dec,byt); *(bf+byt)=0;
d=atol(bf);
return(d);
}
//=====================================================================
// yyyymmddhhmm+1
time_t IncDayTim(char *dTim, char *sTim)
{
time_t st,dt;
struct tm sT,*dT;
int ye,mo,dy,ho,mi,cy;
sT.tm_isdst = -1;
sT.tm_sec = 0;
sT.tm_min = (*(sTim+10) & 0x0F)*10+(*(sTim+11) & 0x0F);
sT.tm_hour= (*(sTim+8) & 0x0F)*10+(*(sTim+9) & 0x0F);
sT.tm_mday= (*(sTim+6) & 0x0F)*10+(*(sTim+7) & 0x0F);
sT.tm_mon = (*(sTim+4) & 0x0F)*10+(*(sTim+5) & 0x0F) - 1;
sT.tm_year= (*(sTim+2) & 0x0F)*10+(*(sTim+3) & 0x0F)
+ (*sTim & 0x0F)*1000 +(*(sTim+1) & 0x0F)*100 -1900;
st = mktime(&sT);
dt = st + (time_t)60;
dT = localtime(&dt);
sprintf(dTim,"%04d%02d%02d%02d%02d",
dT->tm_year+1900,dT->tm_mon+1,dT->tm_mday,dT->tm_hour,dT->tm_min);
return(0);
}
//=====================================================================
// 1ラインの文字列をデリミタ毎分割する 03/06/19
int SplitLin(int max_n,char *bf,char *argv[])
{
int n;
char *cp;
n=0;
cp=bf;
argv[0]=cp;
while(*cp!=0){
switch(*cp){
case 0: return(n);
case 0x0d:
*cp=0; return(n);
case 0x0a:
*cp=0; return(n);
case ' ': // 先頭がスペースなら
while(*cp==' '){ // スペースが続くかぎり
*cp=0; // 0を書込
cp++; // ポインタを++
if(*cp==0) return(n);
}
break;
case ',': // カンマなら
while(*cp==','){
*cp=0; cp++; // 0を書く、ポインタを++
if(*cp!=',') break;
argv[n]=cp; n++; // アドレスを保存、ポインタを++
if(n>=max_n) return(n);
if(*cp==0) return(n);
}
break;
default: // それ以外なら
argv[n]=cp; n++; // 先頭アドレスを保存、ポインタを++
if(n>=max_n) return(n);
while((*cp!=' ')&&(*cp!=',')){
if((*cp==0x0a)||(*cp==0x0d)){
*cp=0; return(n);
}
if(*cp==0) return(n);
cp++;
};
break;
}
}
return(n);
}
//-------------------------------------------------------------------------------
long XtoL(char *dt)
{
int i,j,l,n;
long a,c;
l=strlen(dt);
a=0; n=0;
for(i=l-1;i>=0;i--){
c=*(dt+i);
if(c<'0') return(-1);
if(c<='9'){
c =c & 0x0f;
}else{
c =c & 0x0f;
c =c + 9;
}
for(j=0;j<n;j++) c = c << 4;
a = a + c;
n++;
}
return(a);
}
//-------------------------------------------------------------------------------
void CharCpy(char *dbf, char *sbf, int n) // キャラクタ コピ-
{
int i;
for(i=0;i<n;i++) *dbf++=*sbf++;
return;
}