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

📄 rb_data.c

📁 redboy for gba 是BPNS为GBA编写的一个小软件。软件的邹形是BASIC高级语言解释执行器。几经修改和扩展
💻 C
字号:
#include <CsAgb.h>
#include <rb_mem.h>
#include <rbasic.h>
#include <rb_var.h>

#define rb_dat_num_cnt 128//data区最大数据个数
#define rb_dat_str_len 2048
extern u8 get_pstr(char lp,char rp,char *exp,char *sv);
double *rb_dat_num_M=NULL;//实型数据区
u8 rb_dat_num_p;
u8 rb_dat_num_np;
char *rb_dat_str_M=NULL;//字符数据区
u16 rb_dat_str_p;
u16 rb_dat_str_np;

void dat_add_num(double num)//置数字数据
{
   if (rb_dat_num_p+1>=rb_dat_num_cnt)
   {
      rb_error=25;
      return;
   }
   rb_dat_num_M[rb_dat_num_p]=num;
   rb_dat_num_p++;
}
double dat_read_num()//读数据
{
   if (rb_dat_num_np>=rb_dat_num_p)//无数据溢出
   {
      rb_error=26;
      return 0.0;
   }
   rb_dat_num_np++;
   return rb_dat_num_M[rb_dat_num_np-1];
}
void dat_add_str(char *str)//置字符串数据
{
   char len=str_len(str);
   if (rb_dat_str_p+len>=rb_dat_str_len)
   {
      rb_error=25;
      return;
   }
   rb_dat_str_M[rb_dat_str_p]=len;
   strcpy(rb_dat_str_M+rb_dat_str_p+1,str);
   rb_dat_str_p+=len+2;
}

char *dat_read_str()//读字符串数据
{
   if (rb_dat_str_np>=rb_dat_str_p)//无数据溢出
   {
      rb_error=26;
      return NULL;
   }
   rb_dat_str_np+=rb_dat_str_M[rb_dat_str_np]+2;
   return rb_dat_str_M+rb_dat_str_np+1;
}

void dat_restore()//数据重置
{
   rb_dat_str_np=0;
   rb_dat_num_np=0;
}

void rb_dat_mem()//数据区空间分配
{
   rb_dat_num_np=0;
   rb_dat_num_p=0;
   rb_dat_str_np=0;
   rb_dat_str_p=0;
   rb_dat_num_M=(double *)new_malloc(sizeof(double)*rb_dat_num_cnt);
   rb_dat_str_M=(char *)new_malloc(rb_dat_str_len);
   if (rb_dat_num_M==NULL || rb_dat_str_M==NULL)//分配空间失败
   {
      rb_error=1;
      return;
   }
}

void rb_dat_free()//释放数据空间
{
   new_free(rb_dat_num_M);
   new_free(rb_dat_str_M);
}
void dat_clean()//数据清除
{
   rb_dat_num_np=0;
   rb_dat_num_p=0;
   rb_dat_str_np=0;
   rb_dat_str_p=0;
   rb_dat_free();
}


void rb_data(char *exp) //置数据
{
   int i=0;
   int tp=0;
   u8 is_num=1;
   char temp[str_max_len];
   char str[str_max_len];
   if (rb_dat_num_M==NULL || rb_dat_str_M==NULL)//尚未分配数据区
   {
      rb_dat_mem();//分配数据空间
      if (rb_error) return;
   }
   while (1)
   {
      if (exp[i]=='\"')//是字符串常量
      {
         tp=0;
         i++;
         while (exp[i]!='\"' && exp[i]!='\0')
         {
            temp[tp]=exp[i];
            tp++;
            i++;
         }
         if (exp[i]!='\"')
         {
            rb_error=6;
            return;
         }
         temp[tp]='\0';
         dat_add_str(temp);
         i++;
      }
      else
      {
         tp=0;
         if (exp[i]=='S' || exp[i]=='C' || exp[i]=='c') is_num=0;
         while (exp[i]!=',' && exp[i]!='\0')
         {
            temp[tp]=exp[i];
            i++;
            tp++;
         }
         temp[tp]='\0';
         if (is_num) dat_add_num(rb_cal(temp));
         else
         {
            rb_get_str(temp,str);
            dat_add_str(str);
         }
      }
      if (exp[i]=='\0') return;
      if (exp[i]==',') i++;
      else
      {
         rb_error=6;
         return;
      }
   }
}
void rb_read(char *exp)//读数据
{
   int i=0;
   char temp[str_max_len];
   int id;
   u8 step;
   while (1)
   {
      switch (exp[i])
      {
         case 'F'://读与实数
         give_float_val(exp[i+1]-bg_id,dat_read_num());
         i+=2;
         break;
         case 'f'://读与实型数组元素
         id=exp[i+1]-bg_id;
         i+=3;
         step=get_pstr('[',']',exp+i,temp);
         if (step==0) {rb_error=6;return;}
         i+=step;
         give_float_dim_val(id,rb_cal(temp),dat_read_num());
         break;
         case 'I'://读与整数
         give_int_val(exp[i+1]-bg_id,dat_read_num());
         i+=2;
         break;
         case 'i'://整型数组
         id=exp[i+1]-bg_id;
         i+=3;
         step=get_pstr('[',']',exp+i,temp);
         if (step==0) {rb_error=6;return;}
         i+=step;
         give_int_dim_val(id,rb_cal(temp),dat_read_num());
         break;
         case 'C'://读字符
         give_str_val(exp[i+1]-bg_id,dat_read_str());
         i+=2;
         break;
         case 'c'://字符串数组
         id=exp[i+1]-bg_id;
         i+=3;
         step=get_pstr('[',']',exp+i,temp);
         if (step==0) {rb_error=6;return;}
         i+=step;
         give_str_val(id,dat_read_str());
         break;
         default:
         rb_error=6;
         return;
      }
      if (exp[i]=='\0') return;
      if (exp[i]==',') i++;
      else
      {
         rb_error=6;
         return;
      }
   }
}

⌨️ 快捷键说明

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