home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Fun CD 26
/
OTACD26.ISO
/
archive
/
game
/
updtdiv
/
updtdiv.lzh
/
UPDTDIV.C
< prev
next >
Wrap
Text File
|
1998-08-26
|
6KB
|
279 lines
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <jctype.h>
#include <dos.h>
#include <dir.h>
#define LOADERNAME "UPDTDIV"
#define LOADERVER LOADERNAME ## " ver 1.0"
#define DEFAULTDNAME "dat.dat"
/* definition */
#define OPT_OUTDIR 1
void title(void){
fprintf(stderr,LOADERVER "\n\n");
}
void usage(void){
fprintf(stderr,"USAGE: " LOADERNAME " [-?] [-o<outdir>] <inputfile>\n\n");
fprintf(stderr," -o<outdir> :出力先ディレクトリを指定\n");
fprintf(stderr," -i<inputfile>:入力ファイル(ワイルドカード可)\n");
fprintf(stderr," -? :簡易ヘルプ(これ)\n");
}
void decodeheader(char *buf){
unsigned int counter,magic;
unsigned char bh,bl;
int a;
for(counter=0;counter<0x1e;counter++){
a=*(unsigned int *)buf;
magic=counter*2+1;
bl=a&0xff;
bh=a>>8;
bl=(~bl)-magic;
bh=bh-(1<<magic);
*(unsigned int *)buf=(bh<<8)|(bl);
buf+=2;
}
}
void makeouttop(char *fntop,char *indir,char *inname,char *outdir){
char nametop[8];
if(*outdir!='\0')
sprintf(fntop,"%s\\",outdir);
else if(*indir!='\0')
sprintf(fntop,"%s\\",indir);
else
*fntop='\0';
if(strlen(inname)>5){
strcat(fntop,inname+5);
strcat(fntop,"_");
}else
strcat(fntop,inname);
}
void cut_one(char *indir,char *inname,char *inopt,char *outdir){
FILE *fp,*fpw;
char buf[0x204];
char fntop[256];
char fnbuf[256];
char fdbuf[1024];
unsigned long *ptl;
unsigned long ul,lnum,ulp,datsize;
unsigned int ut,uiw;
unsigned int tmpi;
unsigned long tmpl;
if(*indir!='\0')
sprintf(fnbuf,"%s\\%s%s",indir,inname,inopt);
else
sprintf(fnbuf,"%s%s",inname,inopt);
fp=fopen(fnbuf,"rb");
makeouttop(fntop,indir,inname,outdir);
if(fp==NULL){
printf("cannot open input file[%s]!\n",fnbuf);
return;
}
fread(buf,1,0x204,fp);
if((memcmp(buf,"KGBG",4)!=0) && (memcmp(buf,"kgbG",4)!=0)){
fclose(fp);
printf("[%s] is not support archive\n",fnbuf);
return;
}
lnum=*(unsigned long *)(buf+4);
ptl=(unsigned long *)(buf+8);
ulp=0x204;
ut =0;
for(ul=0;ul<lnum;ul++){
datsize=*ptl;
if(datsize>(0x1e*2+8)){
fread(fdbuf,1,0x1e*2+8,fp);
datsize-=0x1e*2+8;
if((memcmp(fdbuf,"kgb2",4)==0)
|| (memcmp(fdbuf,"kgb3",4)==0)){
decodeheader(fdbuf+8);
fdbuf[0]=toupper(fdbuf[0]);
fdbuf[1]=toupper(fdbuf[1]);
fdbuf[2]=toupper(fdbuf[2]);
fdbuf[3]=toupper(fdbuf[3]);
}
if(memcmp(fdbuf,"KGB2",4)==0){
sprintf(fnbuf,"%s%d.jpg",fntop,ut);
fpw=fopen(fnbuf,"wb");
if(fpw==NULL){
fclose(fp);
fprintf(stderr,"Output File Open Error!\n");
return;//error
}
printf("\t(%02d)/jpg\n",ut,fnbuf);
}else if (memcmp(fdbuf,"KGB3",4)==0){
sprintf(fnbuf,"%s%d.bmp",fntop,ut);
fpw=fopen(fnbuf,"wb");
if(fpw==NULL){
fclose(fp);
fprintf(stderr,"Output File Open Error!\n");
return;//error
}
/* make BMP headdr */
fwrite("BM",1,2,fpw); //2|0-1|2
tmpl=datsize+0x1e*2+0x0e;
fwrite(&tmpl,4,1,fpw); //4|2-5|6
tmpi=0;
fwrite(&tmpi,2,1,fpw); //2|6-7|8
fwrite(&tmpi,2,1,fpw); //2|8-9|a
tmpl=0x036; //fullcolor
fwrite(&tmpl,4,1,fpw); //4|a-d|e
printf("\t(%02d)/bmp\n",ut,fnbuf);
}else{
sprintf(fnbuf,"%s%d.tmp",fntop,ut);
fpw=fopen(fnbuf,"wb");
if(fpw==NULL){
fprintf(stderr,"Output File Open Error!\n");
fclose(fp);
return;//error
}
printf("\t(%02d)/unknown\n",ut,fnbuf);
}
fwrite(fdbuf+8,1,0x1e*2,fpw);
while(datsize>0){
uiw=(datsize>1024)?1024:datsize;
fread(fdbuf,1,uiw,fp);
if(fwrite(fdbuf,1,uiw,fpw)!=uiw){
fprintf(stderr,"Error / Disk full?\n");
fclose(fpw);
fclose(fp);
return;
}
datsize-=uiw;
}
fclose(fpw);
}else{
printf("Not Supported Type! / Skip This File\n");
fseek(fp,datsize,SEEK_CUR);
}
ut++;
ulp+=*ptl++;
}
fclose(fp);
}
void modifydirname(char *str){
unsigned int ui=strlen(str);
if(ui!=0 && (nthctype(str,ui-1) != CT_ANK || str[ui-1]=='\\')){
str[ui-1]='\0';
}
}
int optnum;
int argnum;
void change_arg(int c,unsigned char **v){
int i,j;
unsigned char *tmp;
for(i=c-1;i>=2;i--)
for(j=c-1;j>=c-i+1;j--)
if((v[j][0] == '-')||(v[j][0] == '/'))
if((v[j-1][0]!='-')&&(v[j-1][0]!='/')){
tmp=v[j];
v[j]=v[j-1];
v[j-1]=tmp;
}
optnum=0;
argnum=0;
for(i=1;i<c;i++)
if( (v[i][0] == '-') || (v[i][0] == '/'))
optnum ++;
else
argnum ++;
#if 0
printf("\c= %d nopt %d arg %d\n",c,optnum,argnum);
#endif
}
void main(int argc,char **argv){
struct ffblk ffblk;
char *outdirpt;
unsigned int ui;
int loadf;
char indrive[MAXDRIVE];
char indir[MAXDIR];
char infile[MAXFILE];
char inext[MAXEXT];
char inpath[MAXPATH];
char outdir[MAXPATH];
int optflag=0;
title();
change_arg(argc,(unsigned char **)argv);
argv ++;
if(argnum==0){
usage();
return;
}
while(optnum --){
if((**argv =='-') || (**argv =='/')){
switch(toupper((*argv)[1])){
case 'O':
outdirpt=*argv+2;
optflag|=OPT_OUTDIR;
break;
default:
usage();
return;
}
}else{
usage();
return;
}
argv ++;
}
if(optflag&OPT_OUTDIR){
strcpy(outdir,outdirpt);
modifydirname(outdir);
}else{
strcpy(outdir, "?:\\");
outdir[0] = 'A' + getdisk();
getcurdir(0, outdir+3);
modifydirname(outdir);
}
for(ui=0;ui<argnum;ui++){
fnsplit(*argv,indrive,indir,infile,inext);
sprintf(inpath,"%s%s",indrive,indir);
modifydirname(inpath);
loadf = findfirst(*(argv),&ffblk
,FA_RDONLY | FA_HIDDEN | FA_SYSTEM | FA_ARCH);
if(loadf!=0)
fprintf(stderr,"cannot open [%s]\n",*argv);
argv ++;
while (!loadf){
fnsplit(ffblk.ff_name,indrive,indir,infile,inext);
cut_one(inpath,infile,inext,outdir);
loadf = findnext(&ffblk);
}
}
}