/* RBBS FILE CONDENSE */

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>

#include "defs.h"

static char dirct[30];
static char fbuff1[256],fbuff2[256],fbuff3[256],fname[40];
static long ptr;
static char td[8];
static char svdir[41];
static char ddir[41];
static char msgpass[41];
static char pdspass[41];
static char datpass[41];
static int  fnumb_max;

FILE *fp1;
FILE *fp2;
FILE *fp3;

main(argc,argv)
   int argc;
   char *argv[];
   
     {
     int i,ti = 0,pi = 0,savecnt = 0,dltcnt = 0,okcnt = 0;
     char wch[10];
     
     if ( argc <= 1 ) { printf("using SAVE VOLUME DRIVE (ex. A: B:..) \n");
                        return(0);
                      }
     
     printf("\nＲＢＢＳファイル更新処理 \n\n");

     nwtime();           /* ｾｰﾌﾞｻｷ ﾃﾞｨﾚｸﾄﾘ ﾒｲ ﾍﾝｼｭｳ  sv######..ﾋｽﾞｹ */
     
     sprintf(dirct,"%s\\sv%02d%02d%02d",argv[1],td[0],td[1],td[2]);
     
     printf("1.セーブ先ディレクトリ %s 作成\n",dirct);
     strcpy(fbuff1,"MD "); strcat(fbuff1,dirct);
     system(fbuff1);   /* ﾃﾞｨﾚｸﾄﾘ ｻｸｾｲ */  
     
     strcpy(fbuff1,"CD "); strcat(fbuff1,dirct);
     system(fbuff1);                 /* ﾜｰｸ･ﾃﾞｨﾚｸﾄﾘ ﾍﾝｺｳ */

     dirct[2] = NULL; system(dirct);
     
     if ( config_read() )  exit(1);
     printf("2.見出しファイル (HDR) バックアップ\n");
     makfna(HDR_FIL);
     fp1 = fopen(fname,"r");     /* ﾍｯﾀﾞ ﾌｧｲﾙ open */
     if ( fp1 == NULL ) 
        { printf("err001 HDR FILE OPEN INPUT ERROR \n"); exit(1); }
     
     fp2 = fopen("HDR","w");
     if ( fp2 == NULL )
        { printf("err002 HDR SAVE FILE OPEN OUTPUT ERROR \n"); exit(1); }
     
     while(1)                     /* ﾍｯﾀﾞ ﾌｧｲﾙ ｾｰﾌﾞ */
        { if ( fgets(fbuff1,255,fp1) == NULL ) break;
        
          if ( islower(*(fbuff1 + 4)) ) *(fbuff1 + 4) -= 0x20;
          if ( *(fbuff1 + 4) != 'B' && /* 5ｹﾀ ﾒ ｶﾞ 'B' 'D' ﾃﾞ ﾅｹﾚﾊﾞ SAVE ｼﾅｲ */
               *(fbuff1 + 4) != 'D'    )  continue;
          strcpy(fbuff2,fbuff1);
          fputs(fbuff2,fp2);
        }
     fclose(fp1); fclose(fp2);
     
     printf("3.ファイル本体保存処理\n");
     fp1 = fopen("HDR","r");      /* ﾒｯｾｰｼﾞ ﾌｧｲﾙ ｾｰﾌﾞ */
     if ( fp1 == NULL )
        { printf("err003 HDR SAVE FILE OPEN INPUT ERROR \n"); exit(1); }
     
     while(1)
        { if ( fgets(fbuff1,255,fp1) == NULL ) break;                  
          *(wch) = *(fbuff1);
          *(wch + 1) = *(fbuff1 + 1);
          *(wch + 2) = *(fbuff1 + 2);
          *(wch + 3) = *(fbuff1 + 3);
          *(wch + 4) = NULL;
          i = atoi(wch);    /* ﾒｯｾｰｼﾞ ﾌｧｲﾙ No. ﾄ ﾃﾞｨﾚｸﾄﾘ ﾉ ﾊｱｸ */
     
          makfname("MSG",i,fbuff2);
          if ( *(fbuff1 + 4) == 'B' )
           {                                     /* ﾒｯｾｰｼﾞ ﾌｧｲﾙ open */
            fp2 = fopen(fbuff2,"r");
            if ( fp2 == NULL )
               { printf("err004 MSG_FIL OPEN INPUT ERROR %s\n",fbuff2); continue; }
     
            sprintf(fbuff3,"msg%04d",i);    /* ｾｰﾌﾞ･ﾌｧｲﾙ open */
            fp3 = fopen(fbuff3,"w");
            if ( fp3 == NULL )
               { printf("err005 MSG SAVE FILE OPEN OUTPUT ERROR %s\n",fbuff3);
                 fclose(fp2); continue; }
                      
            while(1)                        /* ﾒｯｾｰｼﾞ ﾌｧｲﾙ ｾｰﾌﾞ */
               { if ( fgets(fbuff2,255,fp2) == NULL ) break;
                 strcpy(fbuff3,fbuff2);
                 fputs(fbuff3,fp3);  }
               
            fclose(fp2); fclose(fp3);                              
            savecnt++;  }
         else
            {  dltcnt++; }
         makfname("MSG",i,fbuff2);
         remove(fbuff2);
          
                        /* PDS ﾌｧｲﾙ ｾｰﾌﾞ */
          if ( *(fbuff1 + 5) == 'P' && *(fbuff1 + 6) == 'D' && *(fbuff1 + 7) == 'S' ) 
             {    
                if ( *(fbuff1 + 4 ) == 'B' )
                {  
				  makfname("PDS",i,fbuff2);
                                                /* PDS ﾌｧｲﾙ open */
                  fp2 = fopen(fbuff2,"r");
                  if ( fp2 == NULL )
                     { printf("err006 PDS_FIL OPEN INPUT ERROR %s\n",fbuff2); continue; }
       
                  sprintf(fbuff3,"pds%04d",i);    /* PDS ｾｰﾌﾞ･ﾌｧｲﾙ open */
                  fp3 = fopen(fbuff3,"w");
                  if ( fp3 == NULL )
                     { printf("err007 PDS SAVE FILE OPEN OUTPUT ERROR %s\n",fbuff3);
                       fclose(fp2); continue; }
                      
                  while(1)                        /* PDS ﾌｧｲﾙ ｾｰﾌﾞ */
                     { if ( fgets(fbuff2,255,fp2) == NULL ) break;
                       strcpy(fbuff3,fbuff2);
                       fputs(fbuff3,fp3);  }
               
                  fclose(fp2); fclose(fp3);
                                                /* PDS ﾌｧｲﾙ ｻｸｼﾞｮ */
               }
			    makfname("PDS",i,fbuff2);
                remove(fbuff2);
              }       

                        /* DATALIB ﾌｧｲﾙ ｾｰﾌﾞ */
          if ( *(fbuff1 + 5) == 'D' && *(fbuff1 + 6) == 'A' 
            && *(fbuff1 + 7) == 'T' && *(fbuff1 + 8) == 'A'
            && *(fbuff1 + 9) == 'L' && *(fbuff1 + 10) == 'I'
            && *(fbuff1 + 11) == 'B' )
             {    
                if ( *(fbuff1 + 4 ) == 'B' )
                {  
				  makfname("DAT",i,fbuff2);
                                 /* DATALIB ﾌｧｲﾙ open */
                  fp2 = fopen(fbuff2,"r");
                  if ( fp2 == NULL )
                     { printf("err008 DATALIB_FIL OPEN INPUT ERROR %s\n",fbuff2); continue; }
       
                  sprintf(fbuff3,"dat%04d",i);    /* DATALIB ｾｰﾌﾞ･ﾌｧｲﾙ open */
                  fp3 = fopen(fbuff3,"w");
                  if ( fp3 == NULL )
                     { printf("err009 DATALIB SAVE FILE OPEN OUTPUT ERROR %s\n",fbuff3);
                       fclose(fp2); continue; }
                      
                  while(1)                        /* DATALIB ﾌｧｲﾙ ｾｰﾌﾞ */
                     { if ( fgets(fbuff2,255,fp2) == NULL ) break;
                       strcpy(fbuff3,fbuff2);
                       fputs(fbuff3,fp3);  }
               
                  fclose(fp2); fclose(fp3);
                                                /* DATALIB ﾌｧｲﾙ ｻｸｼﾞｮ */
               }
				makfname("DAT",i,fbuff2);
                remove(fbuff2);
              }       

        }
             
     /* ﾍｯﾀﾞ ﾌｧｲﾙ ｱｯｼｭｸ */
     
     printf("4.見出しファイル (HDR) 圧縮\n");
     makfna(HDR_FIL);     
     fp1 = fopen(fname,"r");                 /* ﾍｯﾀﾞ ﾌｧｲﾙ open */
     if ( fp1 == NULL ) 
        { printf("err010 HDR FILE OPEN INPUT ERROR \n"); exit(1) ; }
     
     fp2 = fopen("HDR.BAK","w");
     if ( fp2 == NULL )
        { printf("err011 HDR BACKUP FILE OPEN OUTPUT ERROR \n"); exit(1) ; }
     
     while(1)                     /* ﾍｯﾀﾞ ﾌｧｲﾙ BACKUP */
        { if ( fgets(fbuff1,255,fp1) == NULL ) break;
          if ( islower(*(fbuff1 + 4)) ) *(fbuff1 + 4) -= 0x20;
        
          if ( *(fbuff1 + 4) == 'B' )  continue;  /* 1ｹﾀ ﾒ ｶﾞ 'B' ﾃﾞ ｱﾚﾊﾞ BACKUP ｼﾅｲ */
          if ( *(fbuff1 + 4) == 'D' )  continue;
          if ( ! isdigit(*fbuff1)   )  continue;
          
          strcpy(fbuff2,fbuff1);
          fputs(fbuff2,fp2);
        }
     fclose(fp1); fclose(fp2);
     
     makfna(KANRI_FIL);
     fp3 = fopen(fname,"w");
     if ( fp3 == NULL )
        { printf("err012 KANRI FILE OPEN OUTPUT ERROR \n"); exit(1) ; }
     
     /* ﾌｧｲﾙ No. ｶﾝﾘ ﾃｰﾌﾞﾙ ﾌｱｲﾙ ｸﾘｱ */
     printf("5.ファイル番号管理ファイル初期化\n");
     for ( i = 0 ; i <= fnumb_max ; i++ )
        { fputs("0",fp3); }
     fclose(fp3);
     
     fp3 = fopen(fname,"r+");
     if ( fp3 == NULL )
        { printf("err013 KANRI FILE OPEN REWRITE ERROR \n"); exit(1); }
     
     fp1 = fopen("HDR.BAK","r");     /* ﾍｯﾀﾞ ﾌｧｲﾙ open */
     if ( fp1 == NULL ) 
        { printf("err014 HDR BACKUP FILE OPEN INPUT ERROR \n"); exit(1); }
     
     makfna(HDR_FIL);
     fp2 = fopen(fname,"w");
     if ( fp2 == NULL )
        { printf("err015 HDR FILE OPEN OUTPUT ERROR \n"); exit(1); }
     
     makfna(KANRI_FIL);
     fp3 = fopen(fname,"r+");
     if ( fp3 == NULL )
        { printf("err016 KANRI FILE OPEN INPUT ERROR \n"); exit(1); }
     
     printf("6.見出しファイル構築 & ファイル番号管理ファイル更新\n");
     while(1)                     /* ﾍｯﾀﾞ ﾌｧｲﾙ RESTORE & ﾌｧｲﾙ No.ｶﾝﾘ ﾃｰﾌﾞﾙ ﾌｧｲﾙ ｺｳｼﾝ */
        { if ( fgets(fbuff1,255,fp1) == NULL ) break;
        
          *(wch) = *(fbuff1);
          *(wch + 1) = *(fbuff1 + 1);
          *(wch + 2) = *(fbuff1 + 2);
          *(wch + 3) = *(fbuff1 + 3);
          *(wch + 4) = NULL;
          i = atoi(wch);

          ptr = i;
          fseek(fp3,ptr,0);
          fputs("1",fp3);
               
          strcpy(fbuff2,fbuff1);
          fputs(fbuff2,fp2);
          okcnt++;
        }
     fclose(fp1);
     makfna(MAIL_HDR);
     fp1 = fopen(fname,"r");
     if ( fp1 == NULL )
        { printf("err017 MAIL HDR FILE OPEN OUTPUT ERROR \n"); exit(1); }
     while(1)                     /* mail ﾍｯﾀﾞ ﾌｧｲﾙ RESTORE & ﾌｧｲﾙ No.ｶﾝﾘ ﾃｰﾌﾞﾙ ﾌｧｲﾙ ｺｳｼﾝ */
        { if ( fgets(fbuff1,255,fp1) == NULL ) break;
        
          if ( ! isdigit(*(fbuff1)) )  
             {  continue; } /* 1ｹﾀ ﾒ ｶﾞ ｽｳｼﾞ ﾃﾞ ﾅｹﾚﾊﾞ ﾉｺｻﾅｲ */
          
          *(wch) = *(fbuff1);
          *(wch + 1) = *(fbuff1 + 1);
          *(wch + 2) = *(fbuff1 + 2);
          *(wch + 3) = *(fbuff1 + 3);
          *(wch + 4) = NULL;
          i = atoi(wch);

          ptr = i;
          fseek(fp3,ptr,0);
          fputs("1",fp3);
               
        }
     
     fclose(fp1); fclose(fp2); fclose(fp3);
     
     /* ｶﾝﾘ ﾌｱｲﾙ ﾖﾘ ﾌﾖｳ ﾒｯｾｰｼﾞ , PDS DATALIB ﾌｧｲﾙ ｻｸｼﾞｮ */
     
/*   printf("6.MSG FILES & PDS FILES DELETE\n");
     makfna(KANRI_FIL);
     fp1 = fopen(fname,"r");
     if ( fp1 == NULL )
        { printf("KANRI FILE OPEN INPUT FOR REFRESH ERROR \n"); return(0) ; }
     
       for ( i = 0 ; i <= fnumb_max ; i++ )
        { if ( fgets(fbuff1,1,fp1) == NULL )  break;
          if ( *(fbuff1) == 0x0d )  break;
          
          if ( *(fbuff1) != '0' )   continue;

          drn = i / 100;
          makfna(MSG_FIL");
          sprintf(fbuff2,"%s%02d/msg%04d",fname,drn,i); 
          drn = open(fbuff2,1);
          if ( drn != (-1) )  { close(fp2); unlink(fbuff2); }
          
          makfna(PDS_FIL");
          sprintf(fbuff2,"%s%04d",fname,i); 
          drn = open(fbuff2,1);
          if ( drn != (-1) )  { close(fp2); unlink(fbuff2); }
          
          makfna(DATA_FIL");
          sprintf(fbuff2,"%s%04d",fname,i); 
          drn = open(fbuff2,1);
          if ( drn != (-1) )  { close(fp2); unlink(fbuff2); }
        }        
           
     fclose(fp1);
*/
     /* ﾛｸﾞ ﾌｧｲﾙ save */
     
     printf("7.ログ退避\n");
     makfna(LOG_FIL);
     i = 0;
     fp1 = fopen(fname,"r");                 /* ﾛｸﾞ ﾌｧｲﾙ open */
     if ( fp1 != NULL ) 
        { 
     
         fp2 = fopen("RBBS.LOG","w");
         if ( fp2 == NULL )
            { printf("err018 LOG SAVE FILE OPEN OUTPUT ERROR \n"); exit(1); }
     
         while(1)                     /* ﾛｸﾞ ﾌｧｲﾙ SAVE */
            { if ( fgets(fbuff1,255,fp1) == NULL ) break;
        
              strcpy(fbuff2,fbuff1);
              fputs(fbuff2,fp2);
              i++;
            }
         fclose(fp1); fclose(fp2);
     
         remove(fname);
        }
     makfna(FORWARD_LOG);
     fp1 = fopen(fname,"r");                 /* ﾃﾝｿｳ ﾛｸﾞ ﾌｧｲﾙ open */
     if ( fp1 != NULL ) 
        { 
     
         fp2 = fopen("FORWARD.LOG","w");
         if ( fp2 == NULL )
            { printf("err019 LOG SAVE FILE OPEN OUTPUT ERROR \n"); exit(1); }
     
         while(1)                     /* ﾛｸﾞ ﾌｧｲﾙ SAVE */
            { if ( fgets(fbuff1,255,fp1) == NULL ) break;
        
              strcpy(fbuff2,fbuff1);
              fputs(fbuff2,fp2);
              ti++;
            }
         fclose(fp1); fclose(fp2);
     
         remove(fname);
        }
     makfna(PHONE_LOG);
     fp1 = fopen(fname,"r");                 /* ﾃﾞﾝﾜ ﾛｸﾞ ﾌｧｲﾙ open */
     if ( fp1 != NULL ) 
        { 
     
         fp2 = fopen("PHONE.LOG","w");
         if ( fp2 == NULL )
            { printf("err020 LOG SAVE FILE OPEN OUTPUT ERROR \n"); exit(1); }
     
         while(1)                     /* ﾛｸﾞ ﾌｧｲﾙ SAVE */
            { if ( fgets(fbuff1,255,fp1) == NULL ) break;
        
              strcpy(fbuff2,fbuff1);
              fputs(fbuff2,fp2);
              pi++;
            }
         fclose(fp1); fclose(fp2);
     
         remove(fname);
        }
     
     makfna(USER_FIL);
     fp1 = fopen(fname,"a");
     fclose(fp1);
        
     printf("\n更新処理は終了しました\n");
     printf("保有ﾌｧｲﾙ=%d  削除ﾌｧｲﾙ=%d  保存ﾌｧｲﾙ=%d  ｺﾈｸﾄ回数=%d 交換回数=%d\n",okcnt,dltcnt,savecnt,i,ti);
     
     exit(0);
     }           
     
nwtime()
  {  
    struct TIM_CALEN {
    int year;
    char  month;
	char day;
	char what_day;
	char hour;
	char minute;
	char sec;
	char msec;
	char ext;
	}  calender;

	TIM_rdcalender(&calender);

	td[0] = calender.year - 1900; td[1] = calender.month;
	td[2] = calender.day; td[3] = calender.hour; td[4] = calender.minute;
	td[5] = calender.sec; td[6] = NULL;

	return(0);
  }


makfna(filname)
     char filname[];
     {    strcpy(fname,ddir);
          strcat(fname,"\\");
          strcat(fname,filname);
          return(0);
     }


config_read()
     {  int i,j;
        char fbuff[255];

		*(fname) = NULL;
		strcpy(fname,getenv("BBS"));
		if ( getenv("BBS") )  strcat(fname,"\\");
		strcat(fname,CONFIG_FIL);
        fp1 = fopen(fname,"r");

        if ( fp1 == NULL ) { printf("CONFIG.BBSがありません\n");
                             exit(1); }

        for ( i = 1 ; i <= 11 ; i++ )
        { if ( fgets( fbuff,255,fp1) == NULL )
                           { fclose(fp1);
                             conf_err(i);
                           }
        
          switch(i)
	     {
                case 4: strcpy(ddir,fbuff);
                        j = strlen(ddir); j--;
                        *(ddir + j) = NULL; break;
                case 5: strncpy(msgpass,fbuff,strlen(fbuff) - 1);
					 	*(msgpass + strlen(msgpass) ) = NULL; break;
                case 6: strncpy(pdspass,fbuff,strlen(fbuff) - 1);
						*(pdspass + strlen(pdspass) ) = NULL; break;
                case 7: strncpy(datpass,fbuff,strlen(fbuff) - 1);
						*(datpass + strlen(datpass) ) = NULL; break;
                case 9:  fnumb_max = atoi(fbuff); break;
                default: break;
             }
        }
        fclose(fp1);
        return(0);
     }


conf_err(errno)
     int errno;
     {
        printf("CONFIG_FILE ERROR   ERR No.=%d\n",errno);
        return(0);
     }

makfname(fdir,fno,fnam)
	char fdir[];
	int fno;
	char fnam[];
	{    char  fdata[41],offset;
	     int   drn;

	      drn = fno / 100;
	      strcpy(fdata,msgpass); strcat(fdata,MSG_FIL);
              sprintf(fnam,"%s%02d\\msg%04d",fdata,drn,fno);
			  offset = fno / 1000;
			  fnam[0] = fnam[0] + offset;
             
	      if ( ! strncmp(fdir,"PDS",3))
	              { strcpy(fdata,pdspass); strcat(fdata,PDS_FIL);
                        sprintf(fnam,"%s%02d\\pds%04d",fdata,drn,fno);
                       }

              if ( ! strncmp(fdir,"DAT",3))
	              { strcpy(fdata,datpass); strcat(fdata,DAT_FIL);
                        sprintf(fnam,"%s%02d\\dat%04d",fdata,drn,fno);
                       }

	    return(0);
	}

