files.c

来自「redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是B」· C语言 代码 · 共 475 行

C
475
字号
#include <CsAgb.h>
#include <rb_stdio.h>
#include <rbasic.h>
#include <rb_string.h>
#include <text.h>
#include <graph.h>
#include <rb_string.h>
#define isUnk 0 //未知格式
#define isTxt 1 //文本格式
#define isBas 2 //BASIC源程序
#define isEbk 3 //ebk格式
#define isDic 4 //電子詞典格式
#define isDat 5 //數據文件
#define isBmp 6 //BMP文件
#define isDir 64 //文件夾
#define isRom 65 //文件系統
#define isWav 7 //wave音频文件
#define isFml 8 //公式集文件
#define isCrd 9 //名片文件
#define isPbk 10 //PBK漫画
#define isJpg 11 //Jpeg图片格式
#define FL 40 //文件名最大長度
#define isFnt 12//字体文件
#define maxFiles 250 //最大文件個數
#define mesLen sizeof(fileMes)
#define fbase 0x080E1000
#define root_mes 32

#define isFolder 16
#define isFile 32

extern u8 basic_auto_run;
extern menu(char *items,int n);
extern void rbasic(u32 loc);
extern int open_wav(u32 loc);
extern void nsh_text(char *tit,char *txt,u32 size);
extern void new_scroll(u32 lc,u32 len);
extern void cbmp(u32 loc,u8 x,u8 y);
extern int jpeg1(u8 xp,u8 yp,u32 loc);

extern int sys_pass(u32 pid,char *tit);
extern void chg_psw(u32 pid);
extern void del_psw(u32 pid);

typedef struct //文件屬性
{
	u8 type;//文件類型
	u8 mask;//數據加密類型
	char name[40];//文件名
	u32 size;//文件大小
	u32 loc;//文件地址
} fileMes;
extern void show_bmp(u32 loc);
extern void basic_txt(u32 loc);
extern void dic(u32 loc);
extern void jpeg(u8 xp,u8 yp,u32 loc);
u32 _folder=0;//当前目录
char _file[40];//选定文件
u32 _file_loc=0;
extern u32 _fid,_iid,_line;
const char bas_menu[2][15]={"1.运行程序","2.查看代码"};

u32 find_file(char *fname,u32 loc)//查询
{
   fileMes mes=*(fileMes *)(fbase+loc);
   fileMes item;
   u32 i,cnt;
   cnt=mes.size>>16;
   cnt+=mes.size&0xFFFF;
   if (mes.type!=isFolder) return 0;//不是目录
   str_up(fname);
   for (i=0;i<cnt;i++)
   {
      item=*(fileMes *)(fbase+mes.loc+i*sizeof(fileMes));
      str_up(item.name);
      if (strcmp(fname,item.name)==0) return mes.loc+i*sizeof(fileMes);//返回fid
   }
   return 0;
}

u32 get_floc(u32 fid)
{
   fileMes mes=*(fileMes *)(fbase+fid);
   return fbase+mes.loc;
}
u32 myfopen(char *fname,u32 *size)
{
   u32 fid=_folder;
   int i=0,j=0;
   fileMes mes;
   char name[str_max_len];
   if (fname[0]=='/') {i++;fid=0;}
   while (fname[i]!='\0')
   {
      if (fname[i]=='/')
      {
         if (j)
         {
            name[j]='\0';
            j=0;
            fid=find_file(name,fid);
         }
      }
      else {name[j]=fname[i];j++;}
      i++;
   }
   if (j==0) return 0;
   name[j]='\0';
   fid=find_file(name,fid);
   mes=*(fileMes *)(fbase+fid);
   *size=mes.size;
   return fbase+mes.loc;
}
u8 get_file_type(char *fname)
{
	u8 i=0;
	u8 loc=0;
	char type[50];
	while (fname[i]!='\0')
	{
		if (fname[i]=='.') loc=i;
		i++;
	}
	if (loc==0) return isUnk;
	i=loc+1;
	while (fname[i]!='\0')
	{
		type[i-loc-1]=fname[i];
		i++;
	}
	type[i-loc-1]='\0';
	str_up(type);
	if (strcmp(type,"TXT")==0) return isTxt;
	else if(strcmp(type,"BMP")==0) return isBmp;
	else if(strcmp(type,"EBK")==0) return isEbk;
	else if(strcmp(type,"DIC")==0) return isDic;
	else if(strcmp(type,"ROM")==0) return isRom;
	else if(strcmp(type,"DIR")==0) return isDir;
	else if(strcmp(type,"BAS")==0) return isBas;
	else if(strcmp(type,"DAT")==0) return isDat;
	else if(strcmp(type,"WAV")==0) return isWav;
	else if(strcmp(type,"FML")==0) return isFml;
	else if(strcmp(type,"CRD")==0) return isCrd;
	else if(strcmp(type,"PBK")==0) return isPbk;
	else if(strcmp(type,"JPG")==0) return isJpg;
	else if(strcmp(type,"FNT")==0) return isFnt;
	else return isUnk;
}
   
u32 cal_loc(char *loc)
{
   return loc[0]*100000000+loc[1]*1000000+loc[2]*10000+loc[3]*100+loc[4];
}
void get_name(char *mes,char *name)
{
   u8 i=0;
   while (mes[i]!='#' && i<30)
   {
      name[i]=mes[i];
      i++;
   }
   name[i]='\0';
}

void show_folder_mes(fileMes mes,u8 loc)
{
   u32 fdloc=mes.loc;
   u32 files=mes.size;
   u32 i=0;
   char fdname[5];
   loc=loc%10;
   cwrite(2,18+13*loc,RGB(30,30,30),mes.name);
   fdname[0]=files/10+48;
   fdname[1]=files%10+48;
   fdname[2]='\0';
   cwrite(150,18+13*loc,RGB(30,30,30),fdname);
   cwrite(180,18+13*loc,RGB(30,30,30),"个文件\0");
}
void show_file_mes(fileMes mes,u8 loc)
{
   u32 fdloc=mes.loc;
   double size=mes.size;
   char size_mes[40]="大小:";
   //char name[80];
   //u32 i=0;
   u32 flag=0;
   if (size>=1024 && size<1048576)
   {
      flag=1;
      size=size/1024;
   }
   else if(size>=1048576)
   {
      flag=2;
      size=size/1048576;
   }
   num_to_str(size,size_mes+5);
   *(size_mes+10)='\0';
   if (flag==1) strcat(size_mes,"K");
   else if(flag==2) strcat(size_mes,"M");
   else strcat(size_mes,"B");
   if (mes.type==isFolder) strcpy(size_mes,"文件夹");
   cwrite(2,18+13*loc,RGB(3,7,15),mes.name);
   cwrite(150,18+13*loc,RGB(3,7,15),size_mes);
}

void fd_mes(fileMes *mes)
{
   char m[70];
   int len,fcnt,fdcnt;
   r_box(1,147,238,158,32459,1);
   r_line(0,147,239,147,28160,1);
   fcnt=(mes->size)&0xffff;
   fdcnt=(mes->size)>>16;
   strcpy(m,"/");
   strcpy(m+1,mes->name);
   len=str_len(m);
   strcpy(m+len,"[");
   len++;
   m[len]=48+(int)(fdcnt/100);
   fdcnt%=100;
   len++;
   m[len]=48+(int)(fdcnt/10);
   len++;
   m[len]=48+fdcnt%10;
   len++;
   m[len]='/';
   len++;
   m[len]=48+(int)(fcnt/100);
   len++;
   fcnt%=100;
   m[len]=48+(int)(fcnt/10);
   len++;
   m[len]=48+fcnt%10;
   m[len+1]=']';
   m[len+2]='\0';
   cwrite(2,148,RGB(30,30,30),m);
}
u16 find_next_pic(u16 np,u16 cnt,u32 loc,int act)//寻找下一张图片
{
   u8 tp;
   int i;
   fileMes mes;
   switch (act)
   {
      case 0:
      return np;
      case 1://下一张
      for (i=np+1;i<cnt;i++)
      {
         mes=*(fileMes *)(loc+i*mesLen);
         tp=get_file_type(mes.name);
         if (tp==isBmp || tp==isJpg) return i;
      }
      return np;//找不到
      case -1://上一张
      for (i=np-1;i>=0;i--)
      {
         mes=*(fileMes *)(loc+i*mesLen);
         tp=get_file_type(mes.name);
         if (tp==isBmp || tp==isJpg) return i;
      }
      return np;//找不到
      default:
      return np;
   }
}

int wait_pic()
{
   while (1)
   {
      readkey();
      if (CS_IsKeyDown(KEY_R)) return 1;//下一张
      else if(CS_IsKeyDown(KEY_L)) return -1;
      else if(CS_IsKeyDown(KEY_A) || CS_IsKeyDown(KEY_B)) return 0;//退出
   }
}
u32 list_fsys(u32 adr)//列文件系统
{
   fileMes mes=*(fileMes *)(fbase+adr);
   fileMes item;
   u16 fdcnt,fcnt;
   u16 np=0,sel=0,old=0;
   u16 i,count,ftype;
   u8 done=2;
   u8 start=1;
   int npic;
   fdcnt=mes.size>>16;
   fcnt=mes.size&0xFFFF;
   if (mes.type!=isFolder)
   {
      arlt("系统提示:","文件系统数据异常,请重新安装.");
      _file_loc=0;
      return;
   }
   fd_mes(&mes);
   while (1)
   {
      if (start) {CS_ReadKey();start=0;} else readkey();
      
      if(CS_IsKeyDown(KEY_UP) && np+sel>0)//上一行
      {
         if (sel) {sel--;done=1;}
         else if (np) {np--;done=2;}
      }
      else if(CS_IsKeyDown(KEY_DOWN) && np+sel+1<fdcnt+fcnt)//下一行
      {
         if (sel<9) {sel++;done=1;}
         else {np++;done=2;}
      }
      else if(CS_IsKeyDown(KEY_LEFT) && np+sel)//上一页
      {
         if (np>9) {np-=10;done=2;}
         else {np=0;sel=0;done=2;}
      }
      else if(CS_IsKeyDown(KEY_RIGHT) && np+10<fdcnt+fcnt)//下一页
      {
         done=2;
         np+=10;
         if (np+sel+1>=fdcnt+fcnt) sel=(fdcnt+fcnt-np-1);
      }
      else if(CS_IsKeyDown(KEY_L))//设置密码
      {
         chg_psw(fbase+mes.loc+(np+sel)*sizeof(fileMes));
         done=2;
         goto noact;
      }
      else if(CS_IsKeyDown(KEY_R))//删除密码
      {
         del_psw(fbase+mes.loc+(np+sel)*sizeof(fileMes));
         done=2;
         goto noact;
      }
      else if(CS_IsKeyDown(KEY_START))//清除所有输入的密码
      {
         no_pass();
      }
      else if(CS_IsKeyDown(KEY_A))//查看文件
      {
         if (!sys_pass(fbase+mes.loc+(np+sel)*sizeof(fileMes),"请输入密码:"))
         {
            done=2;
            goto noact;
         }
         next_pic:
         item=*(fileMes *)(fbase+mes.loc+(np+sel)*sizeof(fileMes));
         if (item.type==isFolder)//是目录
         {
            list_fsys(mes.loc+(np+sel)*sizeof(fileMes));
            if (is_basic_run && _file_loc) return _file_loc;
            done=2;
            fd_mes(&mes);
         }
         else if (item.type==isFile)//是文件
         {
            _file_loc=fbase+item.loc;
            if (is_basic_run)//获得文件
            {
               strcpy(_file,item.name);
               _folder=adr;//设置当前面目录
               return _file_loc;
            }
            else
            {
               ftype=get_file_type(item.name);
               if (ftype==isBas)
               {
                  ftype=menu(bas_menu,2);
                  if (ftype==1) {rb_cls();basic_auto_run=1;rbasic(fbase+item.loc);}
                  else if (ftype==2)
                  {
                     strcpy(_file,item.name);
                     basic_txt(fbase+item.loc);
                  }
               }
               else if(ftype==isEbk)
               {
                  _fid=fbase+mes.loc+(np+sel)*sizeof(fileMes);
                  _iid=0;
                  ebook(item.name,(char *)(fbase+item.loc));
                  _fid=0;
                  _iid=0;
               }
               else if(ftype==isBmp)
               {
                  /*DmaClear(3,32459,mVRAM,240*160*2,16);
                  DmaWait(3);*/
                  cbmp(fbase+item.loc,255,255);
                  npic=wait_pic();
                  npic=find_next_pic(np+sel,fdcnt+fcnt,fbase+mes.loc,npic);
                  if (npic!=np+sel)
                  {
                     np=npic;
                     sel=0;
                     goto next_pic;
                  }
               }
               else if(ftype==isJpg)
               {
                  /*DmaClear(3,32459,mVRAM,240*160*2,16);
                  DmaWait(3);*/
                  jpeg1(255,0,fbase+item.loc);
                  npic=wait_pic();
                  npic=find_next_pic(np+sel,fdcnt+fcnt,fbase+mes.loc,npic);
                  if (npic!=np+sel)
                  {
                     np=npic;
                     sel=0;
                     goto next_pic;
                  }
               }
               else if(ftype==isDic) dic(item.loc);
               else if(ftype==isWav) open_wav(item.loc+fbase);
               else if(ftype==isFml) set_to_fml();
               else if(ftype==isCrd) {set_to_be_card();card_main();}
               else if(ftype==isPbk) pbk(fbase+item.loc);
               else if (ftype==isTxt)
               {
                  _fid=fbase+mes.loc+(np+sel)*sizeof(fileMes);
                  _iid=0xFFFFFFF0;
                  nsh_text(item.name,(char *)(fbase+item.loc),item.size);
                  _fid=0;
                  _iid=0;
               }
               noact:
               //else show_text(item.name,(char *)(fbase+item.loc));
               Q_box(1,17,238,158,28160);
               Q_box(1,147,238,158,28160);
               r_line(0,147,239,147,28160,1);
               r_box(0,16,239,159,28160,0);
               title("文件管理器V1.0版");
               fd_mes(&mes);
               _file_loc=0;
               done=2;
            }
         }
      }
      else if(CS_IsKeyDown(KEY_B)) {_file_loc=0;return 0;}//退出浏览
      if (done==2)//更新页面
      {
         count=(fdcnt+fcnt-np>=9)?10:(fdcnt+fcnt-np);
         for (i=0;i<count;i++)
         {
            r_box(1,17+i*13,238,29+i*13,31644,1);
            item=*(fileMes *)(fbase+(np+i)*mesLen+mes.loc);
            show_file_mes(item,i);
         }
         while (i<10)
         {
            r_box(1,17+i*13,238,29+i*13,31644,1);
            i++;
         }
         old=sel;
      }
      if (done)
      {
         if (old!=sel) r_box(1,4+(old+1)*13,238,16+(old+1)*13,0,5);
         r_box(1,4+(sel+1)*13,238,16+(sel+1)*13,0,5);
         old=sel;
         done=0;
         new_scroll(np+sel,fdcnt+fcnt);
      }
   }
}

void dir()
{
   Q_box(0,16,239,159,RGB(30,30,30));
   r_box(0,16,239,159,28160,0);
   title("文件管理器V1.0版");
   //list_folder(0);
   list_fsys(0);
}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?