⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 rb_file.c

📁 redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是BASIC高级语言解释执行器。几经修改和扩展
💻 C
字号:
#include <CsAgb.h>
#include <rbasic.h>
#include <rb_mem.h>
#include <string.h>
#include <rb_stdio.h>
#include <rb_string.h>
#define mod_rd 1 //只读方式
#define mod_wt 2 //只写方式
#define mod_rn 3 //随机方式
#define mod_ap 4 //追加方式
#define mod_cl 5 //关闭文件
#define mod_er 6 //错误文件

#define max_fid 4 //最大文件号

extern u32 myfopen(char *fname,u32 *size);

typedef struct
{
   char *loc;//文件起始处
   u32 size;//文件大小
   u32 np;//当前指针
   u8 mod;//打开模式
} rb_file;

rb_file *rb_files;//文件打开信息

void rb_fopen(char *name,u8 fid,u8 fmod)
{
   if (fid>3) return;
   if (rb_files[fid].mod!=mod_cl)//文件打开错误
   {
      rb_error=17;
      return;
   }
   str_up(name);
   if (strcmp(name,"MEMORY")==0) {rb_files[fid].loc=rb_peek_M;rb_files[fid].size=2048;}//内存文件
   else rb_files[fid].loc=(char *)myfopen(name,&rb_files[fid].size);
   if (fmod==mod_ap) rb_files[fid].np=rb_files[fid].size-1;
   else rb_files[fid].np=0;
   rb_files[fid].mod=fmod;
}

void rb_fclose(u8 fid)
{
   if (fid>3)
   {
      rb_error=19;
      return;
   }
   rb_files[fid].mod=mod_cl;
}

void rb_fseek(u8 fid,u32 loc)
{
   if (rb_files[fid].mod==mod_cl || rb_files[fid].mod==mod_er || fid>3)
   {
      rb_error=18;
      return;
   }
   if (loc<rb_files[fid].size) rb_files[fid].np=loc;
   else rb_files[fid].np=rb_files[fid].size;
}

u32 rb_ftell(u8 fid)
{
   if (fid>3 || rb_files[fid].mod==mod_cl
         || rb_files[fid].mod==mod_er) return 0;
   return rb_files[fid].np;
}

u8 rb_feof(u8 fid)
{
   if (fid>3 || rb_files[fid].mod==mod_cl || rb_files[fid].mod==mod_er
         || rb_files[fid].np>=rb_files[fid].size ) return 1;
    return 0;
}

void rb_fread(u8 fid,void *sv,u32 size)
{
   int sp=0;
   if (fid>3 || rb_files[fid].mod==mod_wt || rb_files[fid].mod==mod_er
         || rb_files[fid].np==mod_cl || rb_files[fid].np>=rb_files[fid].size)
   {
      rb_error=20;
      return;
   }
   while (sp<size && rb_files[fid].np<rb_files[fid].size)
   {
      *((char *)sv+sp)=*(char *)(rb_files[fid].loc+rb_files[fid].np);
      rb_files[fid].np++;
      sp++;
   }
}

void rb_fwrite(u8 fid,void *sv,u32 size)
{
   int sp=0;
   if (fid>3 || rb_files[fid].mod==mod_rd || rb_files[fid].mod==mod_er
         || rb_files[fid].mod==mod_cl || rb_files[fid].np>=rb_files[fid].size)
   {
      rb_error=21;
      return;
   }
   while (sp<size && rb_files[fid].np<rb_files[fid].size)
   {
      rb_files[fid].loc[rb_files[fid].np]=*((char *)sv+sp);
      rb_files[fid].np++;
      sp++;
   }
}

void rb_file_init()
{
   int i;
   rb_files=(rb_file *)mymalloc(sizeof(rb_file)*max_fid);
   if (rb_files==NULL) {rb_error=1;return;}
   for (i=0;i<max_fid;i++) rb_files[i].mod=mod_cl;
}

void rb_file_free()
{
   myfree(rb_files);
}
void rb_close_files()
{
   int i;
   for (i=0;i<4;i++) rb_files[i].mod=mod_cl;
}

⌨️ 快捷键说明

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