#include"harulib.h" /********************************************************************************/ /* */ /* ある文字列で分割 mysplit(aaa<>bbb<<>ccc<>ddd,"<>",1,buf) ---> buf = "bbb<" */ /* */ /********************************************************************************/ void mysplit(char *line,char *c,int turn,char *a){ int i,j,k; BOOL search_flag; int count=0; k=0; for(i=0;line[i]!='\0';i++){ if(line[i] == c[0]){ search_flag = TRUE; for(j=0;c[j]!='\0';j++){ if(line[i+j] != c[j]){ search_flag = FALSE; break; } } if(search_flag){ if(turn == count){break;} i+=strlen(c)-1; count++; k=0; a[k]='\0'; continue; } } a[k] = line[i]; k++; a[k] = '\0'; } } /********************************************************************************/ /* */ /* 累乗 */ /* */ /********************************************************************************/ int mypow(int a,int b){ int ans=1; int i; for(i=0;i255,00a->10) */ /* */ /********************************************************************************/ int atohex(const char *str){ int i; int ans=0; int keta; keta=0; for(i=strlen(str);i>=0;i--){ if(isxdigit(str[i])){ if(str[i] >= '0' && str[i] <= '9'){ ans+=(str[i]-'0')*mypow(16,keta); }else{ ans+=(10+tolower(str[i])-'a')*mypow(16,keta); } keta++; } } return ans; } /********************************************************************************/ /* */ /* 0からd未満の整数乱数を返す */ /* */ /********************************************************************************/ int myrand(int d){ /* (int)((double)rand() / ((double)RAND_MAX + 1) * d) */ return rand()%d; } /********************************************************************************/ /* */ /* strncpy関数に'\0'を付けるver */ /* */ /********************************************************************************/ char *strncpy2(char *str,const char *cstr,size_t size){ strncpy(str,cstr,size); str[size]='\0'; return str; } /********************************************************************************/ /* */ /* エラーをファイルに出力して終了 */ /* (文字列、モード(0=普通,1=ファイルオープン,2=メモリ確保)) */ /* */ /********************************************************************************/ void Error(const char *str,const int mode){ FILE *fout; if((fout=fopen("error.txt","w"))==NULL)exit(1); if(mode==1){fprintf(fout,"%sが開けません。\n",str);} else if(mode==2){fprintf(fout,"%sメモリが確保出来ません。\n",str);} else{fputs(str,fout);} fclose(fout); exit(1); } /********************************************************************************/ /* */ /* ファイルが存在しているかチェック(存在->TRUE,NOT存在->FALSE) */ /* */ /********************************************************************************/ BOOL CheckExistFile(char *filename){ FILE *fin; char str[64]; if((fin = fopen(filename,"r"))==NULL){ sprintf(str,"ファイル:%sが存在しません。",filename); Dump(str,"a"); return FALSE; } fclose(fin); return TRUE; } /*画像の横幅取得*/ int BmpGetWidth(const char *file){ FILE *fin; int width; if((fin=fopen(file,"rb"))==NULL)Error(file,1); fseek(fin,18,0); width=fgetc(fin); width+=256*fgetc(fin); fclose(fin); return width; } /*画像の高さ取得*/ int BmpGetHeight(const char *file){ FILE *fin; int info,height; if((fin=fopen(file,"rb"))==NULL)Error(file,1); fseek(fin,14,0); info=fgetc(fin); if(info == 0x28)fseek(fin,22,0); else fseek(fin,20,0); height=fgetc(fin); height+=256*fgetc(fin); fclose(fin); return height; } /*二文字の16進数を整数型に変換(0a->10,0A->10)*/ int ChangeHex(const char *str){ int in[2]; if(str[0]>='a' && str[0]<='f')in[1]=((str[0]-'a')+10)*16; else if(str[0]>='A' && str[0]<='F')in[1]=((str[0]-'A')+10)*16; else in[1]=(str[0]-'0')*16; if(str[1]>='a' && str[1]<='f')in[0]=(str[1]-'a')+10; else if(str[1]>='A' && str[1]<='F')in[0]=(str[1]-'A')+10; else in[0]=str[1]-'0'; return in[0]+in[1]; } /*最後の文字を削除*/ void Chop(char *str){if(strlen(str)>=1)str[strlen(str)-1]='\0';} /*改行削除*/ void Chomp(char *str){if(str[strlen(str)-1] == '\n')str[strlen(str)-1]='\0';} /*ある文字を区切りにして二つに分割(aaa=bbb=ccc -> aaa bbb=ccc)*/ void Split(const char c,const char *str,char *str1,char *str2){ int i=0; while(str[i]!='\0' && str[i] != c){i++;} strncpy2(str1,str,i); if(str[i]=='\0'){strcpy(str2,"");} else{strcpy(str2,&str[i+1]);} } /*大文字小文字を区別しない文字列探索(対象文字列、探索文字列)*/ char *strstr2(const char *str,const char *sword){ int i,j; BOOL flag; for(i=0;str[i]!='\0';i++){ /*str[i]とsword[0]を小文字に変換*/ if(tolower(str[i])==tolower(sword[0])){/*最初の文字が見つかった*/ flag=TRUE; for(j=0;sword[j]!='\0';j++){ if(tolower(str[i+j])!=tolower(sword[j])){ flag=FALSE; } } if(flag){return (char *)&str[i];} } } return NULL; } /*親ディレクトリの名前を得る(c:\aa\bb.lzh -> c:\aa\)*/ char *GetParentDirName(char *buf,const char *cmdline){ int i; for(i=(int)strlen(cmdline);i>=0;i--){ if(cmdline[i] == '\\' || cmdline[i] == '/'){ strncpy2(buf,cmdline,i+1); break; } } return buf; } /*絶対パスからファイルの名前を得る(c:\aa\bb.lzh -> bb.lzh)*/ char *PathToFile(const char *path){ int i; for(i=(int)strlen(path);i>=0;i--){ if(path[i] == '\\' || path[i] == '/'){return (char *)&path[i+1];} } return (char *)path; } /*テキスト連結("aaa","bbb" -> "aaabbb")*/ char *AddText(const char *str1,const char *str2){ static char *temp; if(temp!=NULL)free(temp); temp=(char *)malloc(strlen(str1)+strlen(str2)+1); printf("temp=%p\n",&temp[0]); if(temp==NULL)Error("AddText()",2); strcpy(temp,str1); strcat(temp,str2); return temp; } /*拡張子を得る(c:\aa\bb.lzh -> .lzh)*/ char *GetExpName(const char *file){ int i; for(i=(int)strlen(file);i>=0;i--){ if(file[i] == '.'){return (char *)&file[i];} } return NULL; } /*拡張子を取り除く(c:\aa\bb.lzh -> c:\aa\bb)*/ char *RemoveExp(char *buf,const char *file){ int i; strcpy(buf,file); for(i=(int)strlen(file);i>=0;i--){ if(file[i] == '.'){ strncpy2(buf,file,i); break; } } return buf; } /*文字列をダンプ(文字列、書き込みモード(w=新規,a=追加))*/ void Dump(const char *str,const char *mode){ FILE *fout; if(strcmp(mode,"a")==0){fout=fopen("dump.txt","a");} else{ if((fout=fopen("dump.txt","w"))==NULL)Error("dump.txt",1); } fprintf(fout,"%s\n",str); fclose(fout); } /*任意の文字で区切る関数('=','*'など。)*/ void Camma(const char c,const char *str,...){ va_list ptr; int start,i=0; va_start(ptr,str); while(TRUE){ char *a = va_arg(ptr,char *); if(!a)break; start=i; while(str[i] != c && str[i] != '\0')i++; strncpy2(a,&str[start],i); if(str[i] == '\0')break; ++i; } va_end(ptr); } /*ファイル分割(ファイル名、分割サイズ、純粋分割か(yes=1,no=0))*/ void SplitFile(char *file,unsigned long size,int pure){ unsigned int count=0,num; FILE *fin,*fout; unsigned char *buf; char makefile[FILENAME_MAX]; char bufs[FILENAME_MAX]; if((fin=fopen(file,"rb"))==NULL)Error(file,1); buf=(unsigned char *)malloc(size); if(buf==NULL)Error("buf",2); /*ヘッダ付加*/ if(pure==0){ sprintf(makefile,"%s.%.3d",RemoveExp(bufs,file),count); if((fout=fopen(makefile,"wb"))==NULL)Error(makefile,1); fwrite(GetExpName(file),1,strlen(GetExpName(file))+1,fout); num=fread(buf,1,size-strlen(GetExpName(file))-1,fin); fwrite(buf,1,num,fout); fclose(fout); count++; } while(TRUE){ num=fread(buf,1,size,fin); if(num==0)break; sprintf(makefile,"%s.%.3d",RemoveExp(bufs,file),count); if((fout=fopen(makefile,"wb"))==NULL)Error(makefile,1); fwrite(buf,1,num,fout); fclose(fout); if(num!=size)break; count++; } free(buf); fclose(fin); } /*ファイル結合(ファイル名、純粋分割か(yes=1,no=0))*/ void JoinFile(char *file,int pure){ unsigned int count=0,num,point,size; FILE *fin,*fout; unsigned char *buf; char loadfile[FILENAME_MAX]; char bufs[FILENAME_MAX]; /*ヘッダが付加したファイルの読み込み*/ sprintf(loadfile,"%s.%.3d",RemoveExp(bufs,file),count); if((fin=fopen(loadfile,"rb"))==NULL)Error(loadfile,1); /*バッファ確保*/ fseek(fin,0,SEEK_END); size=ftell(fin); buf=(unsigned char *)malloc(size); if(buf==NULL)Error("buf",2); fseek(fin,0,SEEK_SET); /*ヘッダ付加の場合*/ if(pure==0){ while(fgetc(fin)!='\0');/*ファイルポインタをヌルまで進める*/ point=ftell(fin); /*拡張子の読み込み*/ fseek(fin,0,SEEK_SET); fread(buf,1,point,fin); fout=fopen(AddText(RemoveExp(bufs,file),(const char*)buf),"wb");/*作成ファイル*/ /*拡張子以降から書き込み*/ fread(buf,1,size-point,fin); fwrite(buf,1,size-point,fout); count++; }else{ fout=fopen(RemoveExp(bufs,file),"wb");/*作成ファイル*/ } fclose(fin); while(TRUE){ /*ファイルの読み込み*/ sprintf(loadfile,"%s.%.3d",RemoveExp(bufs,file),count); if((fin=fopen(loadfile,"rb"))==NULL)break; num=fread(buf,1,size,fin); fwrite(buf,1,num,fout); fclose(fin); count++; } fclose(fout); }