home *** CD-ROM | disk | FTP | other *** search
/ Fun CD 26 / OTACD26.ISO / archive / game / updtdiv / updtdiv.lzh / UPDTDIV.C < prev    next >
Text File  |  1998-08-26  |  6KB  |  279 lines

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5. #include <jctype.h>
  6. #include <dos.h>
  7. #include <dir.h>
  8.  
  9.  
  10. #define LOADERNAME "UPDTDIV"
  11. #define LOADERVER  LOADERNAME ## " ver 1.0"
  12. #define DEFAULTDNAME "dat.dat"
  13.  
  14. /* definition */
  15. #define OPT_OUTDIR 1
  16.  
  17. void title(void){
  18.     fprintf(stderr,LOADERVER "\n\n");
  19. }
  20.  
  21.  
  22. void usage(void){
  23.     fprintf(stderr,"USAGE: " LOADERNAME " [-?] [-o<outdir>] <inputfile>\n\n");
  24.     fprintf(stderr,"     -o<outdir>   :出力先ディレクトリを指定\n");
  25.     fprintf(stderr,"     -i<inputfile>:入力ファイル(ワイルドカード可)\n");
  26.     fprintf(stderr,"     -?           :簡易ヘルプ(これ)\n");
  27. }
  28.  
  29.  
  30. void decodeheader(char *buf){
  31.     unsigned int counter,magic;
  32.     unsigned char bh,bl;
  33.     int a;
  34.     for(counter=0;counter<0x1e;counter++){
  35.         a=*(unsigned int *)buf;
  36.         magic=counter*2+1;
  37.         bl=a&0xff;
  38.         bh=a>>8;
  39.         bl=(~bl)-magic;
  40.         bh=bh-(1<<magic);
  41.         *(unsigned int *)buf=(bh<<8)|(bl);
  42.         buf+=2;
  43.     }
  44. }
  45.  
  46.  
  47. void makeouttop(char *fntop,char *indir,char *inname,char *outdir){
  48.     char nametop[8];
  49.  
  50.     if(*outdir!='\0')
  51.         sprintf(fntop,"%s\\",outdir);
  52.     else if(*indir!='\0')
  53.         sprintf(fntop,"%s\\",indir);
  54.     else
  55.         *fntop='\0';
  56.     if(strlen(inname)>5){
  57.         strcat(fntop,inname+5);
  58.         strcat(fntop,"_");
  59.     }else
  60.         strcat(fntop,inname);
  61. }
  62.  
  63.  
  64. void cut_one(char *indir,char *inname,char *inopt,char *outdir){
  65.     FILE *fp,*fpw;
  66.     char buf[0x204];
  67.     char fntop[256];
  68.     char fnbuf[256];
  69.     char fdbuf[1024];
  70.  
  71.     unsigned long *ptl;
  72.     unsigned long ul,lnum,ulp,datsize;
  73.     unsigned int ut,uiw;
  74.     unsigned int tmpi;
  75.     unsigned long tmpl;
  76.  
  77.     if(*indir!='\0')
  78.         sprintf(fnbuf,"%s\\%s%s",indir,inname,inopt);
  79.     else
  80.         sprintf(fnbuf,"%s%s",inname,inopt);
  81.  
  82.     fp=fopen(fnbuf,"rb");
  83.     makeouttop(fntop,indir,inname,outdir);
  84.  
  85.     if(fp==NULL){
  86.         printf("cannot open input file[%s]!\n",fnbuf);
  87.         return;
  88.     }
  89.     fread(buf,1,0x204,fp);
  90.     if((memcmp(buf,"KGBG",4)!=0) && (memcmp(buf,"kgbG",4)!=0)){
  91.         fclose(fp);
  92.         printf("[%s] is not support archive\n",fnbuf);
  93.         return;
  94.     }
  95.  
  96.     lnum=*(unsigned long *)(buf+4);
  97.     ptl=(unsigned long *)(buf+8);
  98.  
  99.     ulp=0x204;
  100.     ut =0;
  101.     for(ul=0;ul<lnum;ul++){
  102.         datsize=*ptl;
  103.         if(datsize>(0x1e*2+8)){
  104.             fread(fdbuf,1,0x1e*2+8,fp);
  105.             datsize-=0x1e*2+8;
  106.             if((memcmp(fdbuf,"kgb2",4)==0)
  107.                 || (memcmp(fdbuf,"kgb3",4)==0)){
  108.                 decodeheader(fdbuf+8);
  109.                 fdbuf[0]=toupper(fdbuf[0]);
  110.                 fdbuf[1]=toupper(fdbuf[1]);
  111.                 fdbuf[2]=toupper(fdbuf[2]);
  112.                 fdbuf[3]=toupper(fdbuf[3]);
  113.             }
  114.             if(memcmp(fdbuf,"KGB2",4)==0){
  115.                 sprintf(fnbuf,"%s%d.jpg",fntop,ut);
  116.                 fpw=fopen(fnbuf,"wb");
  117.                 if(fpw==NULL){
  118.                     fclose(fp);
  119.                     fprintf(stderr,"Output File Open Error!\n");
  120.                     return;//error
  121.                 }
  122.                 printf("\t(%02d)/jpg\n",ut,fnbuf);
  123.             }else if (memcmp(fdbuf,"KGB3",4)==0){
  124.                 sprintf(fnbuf,"%s%d.bmp",fntop,ut);
  125.                 fpw=fopen(fnbuf,"wb");
  126.                 if(fpw==NULL){
  127.                     fclose(fp);
  128.                     fprintf(stderr,"Output File Open Error!\n");
  129.                     return;//error
  130.                 }
  131.                 /* make BMP headdr */
  132.                 fwrite("BM",1,2,fpw);    //2|0-1|2
  133.                 tmpl=datsize+0x1e*2+0x0e;
  134.                 fwrite(&tmpl,4,1,fpw);    //4|2-5|6
  135.                 tmpi=0;
  136.                 fwrite(&tmpi,2,1,fpw);    //2|6-7|8
  137.                 fwrite(&tmpi,2,1,fpw);    //2|8-9|a
  138.                 tmpl=0x036;    //fullcolor
  139.                 fwrite(&tmpl,4,1,fpw);    //4|a-d|e
  140.                 printf("\t(%02d)/bmp\n",ut,fnbuf);
  141.             }else{
  142.                 sprintf(fnbuf,"%s%d.tmp",fntop,ut);
  143.                 fpw=fopen(fnbuf,"wb");
  144.                 if(fpw==NULL){
  145.                     fprintf(stderr,"Output File Open Error!\n");
  146.                     fclose(fp);
  147.                     return;//error
  148.                 }
  149.                 printf("\t(%02d)/unknown\n",ut,fnbuf);
  150.             }
  151.  
  152.             fwrite(fdbuf+8,1,0x1e*2,fpw);
  153.             while(datsize>0){
  154.                 uiw=(datsize>1024)?1024:datsize;
  155.                 fread(fdbuf,1,uiw,fp);
  156.                 if(fwrite(fdbuf,1,uiw,fpw)!=uiw){
  157.                     fprintf(stderr,"Error / Disk full?\n");
  158.                     fclose(fpw);
  159.                     fclose(fp);
  160.                     return;
  161.                 }
  162.                 datsize-=uiw;
  163.             }
  164.             fclose(fpw);
  165.         }else{
  166.             printf("Not Supported Type! / Skip This File\n");
  167.             fseek(fp,datsize,SEEK_CUR);
  168.         }
  169.         ut++;
  170.         ulp+=*ptl++;
  171.     }
  172.     fclose(fp);
  173. }
  174.  
  175.  
  176. void modifydirname(char *str){
  177.     unsigned int ui=strlen(str);
  178.     if(ui!=0 && (nthctype(str,ui-1) != CT_ANK || str[ui-1]=='\\')){
  179.         str[ui-1]='\0';
  180.     }
  181. }
  182.  
  183.  
  184. int optnum;
  185. int argnum;
  186.  
  187. void change_arg(int c,unsigned char **v){
  188.     int i,j;
  189.     unsigned char *tmp;
  190.     for(i=c-1;i>=2;i--)
  191.         for(j=c-1;j>=c-i+1;j--)
  192.             if((v[j][0] == '-')||(v[j][0] == '/'))
  193.                 if((v[j-1][0]!='-')&&(v[j-1][0]!='/')){
  194.                     tmp=v[j];
  195.                     v[j]=v[j-1];
  196.                     v[j-1]=tmp;
  197.                 }
  198.         optnum=0;
  199.         argnum=0;
  200.     for(i=1;i<c;i++)
  201.         if( (v[i][0] == '-') || (v[i][0] == '/'))
  202.             optnum ++;
  203.         else
  204.             argnum ++;
  205. #if 0
  206.     printf("\c= %d nopt %d arg %d\n",c,optnum,argnum);
  207. #endif
  208. }
  209.  
  210.  
  211. void main(int argc,char **argv){
  212.     struct ffblk ffblk;
  213.     char *outdirpt;
  214.     unsigned int ui;
  215.     int loadf;
  216.  
  217.     char indrive[MAXDRIVE];
  218.     char indir[MAXDIR];
  219.     char infile[MAXFILE];
  220.     char inext[MAXEXT];
  221.     char inpath[MAXPATH];
  222.     char outdir[MAXPATH];
  223.  
  224.     int optflag=0;
  225.  
  226.     title();
  227.     change_arg(argc,(unsigned char **)argv);
  228.     argv ++;
  229.  
  230.     if(argnum==0){
  231.         usage();
  232.         return;
  233.     }
  234.  
  235.     while(optnum --){
  236.         if((**argv =='-') || (**argv =='/')){
  237.             switch(toupper((*argv)[1])){
  238.                 case 'O':
  239.                     outdirpt=*argv+2;
  240.                     optflag|=OPT_OUTDIR;
  241.                     break;
  242.                 default:
  243.                     usage();
  244.                     return;
  245.             }
  246.         }else{
  247.             usage();
  248.             return;
  249.         }
  250.         argv ++;
  251.     }
  252.  
  253.     if(optflag&OPT_OUTDIR){
  254.         strcpy(outdir,outdirpt);
  255.         modifydirname(outdir);
  256.     }else{
  257.         strcpy(outdir, "?:\\");
  258.         outdir[0] = 'A' + getdisk();
  259.         getcurdir(0, outdir+3);
  260.         modifydirname(outdir);
  261.     }
  262.  
  263.     for(ui=0;ui<argnum;ui++){
  264.         fnsplit(*argv,indrive,indir,infile,inext);
  265.         sprintf(inpath,"%s%s",indrive,indir);
  266.         modifydirname(inpath);
  267.         loadf = findfirst(*(argv),&ffblk
  268.             ,FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_ARCH);
  269.         if(loadf!=0)
  270.             fprintf(stderr,"cannot open [%s]\n",*argv);
  271.         argv ++;
  272.         while (!loadf){
  273.             fnsplit(ffblk.ff_name,indrive,indir,infile,inext);
  274.             cut_one(inpath,infile,inext,outdir);
  275.             loadf = findnext(&ffblk);
  276.         }
  277.     }
  278. }
  279.