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 + -
显示快捷键?