1: /* $Id: 1048609.html,v 1.1.1.1 2000/08/28 11:39:25 hidetosi Exp $ */
   2: #include <btron/hmi.h>
   3: #include <btron/vobj.h>
   4: #include <btron/file.h>
   5: #include <bstdlib.h>
   6: #include <typedef.h>
   7: #include "paperbox.h"
   8: #include "file.h"
   9: #include "view.h"
  10: #include "databox.h"
  11: 
  12: extern void ErrEnd(); /* view.c */
  13: 
  14: /* #define FORMAL_TAD */
  15: #define SEMI_TAD
  16: 
  17: int ReadData(FILECONTEXT* afcFile,B* apData,int aiSize)
  18: {
  19:         W lRestSize;
  20: 
  21:         rea_rec(afcFile->fd,afcFile->offset,apData,aiSize,
  22:                      &lRestSize,NULL);
  23:         afcFile->offset+=aiSize;
  24:         if(lRestSize<aiSize) /* ファイルの最後に達したら */
  25:         { /* 次の主TAD レコードを探す */
  26:                W lNextTAD;
  27: 
  28:                if(fnd_rec(afcFile->fd,F_NFWD,2,0,&lNextTAD)!=1)
  29:                      return lRestSize;
  30:                afcFile->offset=0;
  31:                afcFile->TADRecode=lNextTAD;
  32:                rea_rec(afcFile->fd,afcFile->offset,apData+lRestSize,
  33:                           aiSize-lRestSize,NULL,NULL);
  34:                afcFile->offset+=aiSize-lRestSize;
  35:                return aiSize;
  36:         }else
  37:                return aiSize;
  38: }
  39: 
  40: 
  41: /* TAD 読み書きの準備 */
  42: FILECONTEXT* StartFile(W awFileDscr,W alRecode)
  43: /* W alRecode; 主TAD レコード */
  44: {
  45:         FILECONTEXT* fcNew;
  46: 
  47:         /* if(get_lmb(&fcNew,(LONG)sizeof(FILECONTEXT),NOCLR)<0) */
  48:         if((fcNew=(FILECONTEXT*)malloc(sizeof(FILECONTEXT)))==NULL)
  49:         {
  50:                ErrPanel(0,FALSE); /* メモリ割り当てエラー */
  51:                return NULL;
  52:         }
  53:         fcNew->fd=awFileDscr;
  54:         fcNew->offset=0;
  55:         fcNew->SegOffset=0;
  56:         fcNew->NextOffset=0;
  57:         fcNew->length=0;
  58:         fcNew->TADRecode=alRecode;
  59:         fcNew->LinkRecode=0;
  60: 
  61:         return fcNew;
  62: }
  63: 
  64: 
  65: BOOL EndFile(FILECONTEXT* afcFile)
  66: {
  67:     /* rel_lmb(afcFile); */
  68:         free(afcFile);
  69:         return TRUE;
  70: }
  71: 
  72: 
  73: void SkipData(FILECONTEXT* afcFile,int aiSize)
  74: {
  75:         afcFile->offset+=aiSize;
  76: }
  77: 
  78: 
  79: /* 次のリンクレコードを探して読み込む */
  80: BOOL ReadLinkRecode(FILECONTEXT* afcFile,VLINK* apLink)
  81: {
  82:         W lLinkRecode;
  83: 
  84:         see_rec(afcFile->fd,afcFile->LinkRecode,1,NULL);
  85:         if(fnd_rec(afcFile->fd,F_FWD,1,0,&lLinkRecode)<0)
  86:         {
  87:                static BOOL isCameFirst=TRUE; /* エラーパネルを出すのは1回だけ */
  88: 
  89:                if(isCameFirst)
  90:                {
  91:                      ErrPanel(ID_ST_NFNDLINK,FALSE);
  92:                      isCameFirst=FALSE;
  93:                }
  94:                return FALSE;
  95:         }
  96:         afcFile->LinkRecode=lLinkRecode;
  97: 
  98:         if(rea_rec(afcFile->fd,0,(B*)apLink,sizeof(VLINK),NULL,NULL) < 0)
  99:         {
 100:                static BOOL isCameFirst=TRUE; /* エラーパネルを出すのは1回だけ */
 101: 
 102:                if(isCameFirst)
 103:                {
 104:                      ErrPanel(ID_ST_NREADLINK,FALSE);
 105:                      isCameFirst=FALSE;
 106:                }
 107:                return FALSE;
 108:         }
 109: 
 110:         afcFile->LinkRecode++;
 111: 
 112:         return TRUE;
 113: }
 114: 
 115: /* 次のセグメントに移動し、ID,長さを調べる
 116:    文字かどうかも調べる */
 117: BOOL NextSegment(FILECONTEXT* afcFile,BOOL isDoubleByte)
 118: {
 119:         UH IDCheck;
 120:         W lRecode;
 121: 
 122:         afcFile->offset=afcFile->NextOffset; /* オフセットを進める */
 123:         afcFile->SegOffset=afcFile->offset;
 124: 
 125:         /* レコード番号が異なっていたら元に戻す */
 126:         see_rec(afcFile->fd,0,0,&lRecode);
 127:         if(lRecode!=afcFile->TADRecode)
 128:                see_rec(afcFile->fd,afcFile->TADRecode,1,NULL);
 129: 
 130: #ifdef SEMI_TAD
 131:         if(ReadData(afcFile,(B*)&IDCheck,2)<2) /* 読み込めなかったら */
 132:                return FALSE;
 133: 
 134:         if( (IDCheck&0xff00)>>8 == 0x00ff )
 135:         {
 136:                UH SegID;
 137: 
 138:                SegID = IDCheck & 0x00ff ;
 139:                if(0x21<=SegID && SegID<=0x7f) /* TRON 仕様特殊コードの時 */
 140:                {
 141:                      afcFile->offset-=2;
 142:                      afcFile->ID=TS_SPECIAL;
 143:                      afcFile->length=2;
 144:                      afcFile->code=SegID;
 145:                }else{ /* 可変長セグメントなら */
 146:                      UH LengthCheck;
 147: 
 148:                      afcFile->ID=SegID;
 149:                      if(ReadData(afcFile,(B*)&LengthCheck,2)<2)
 150:                           return FALSE;
 151:                      if(LengthCheck!=0xffff) /* 通常セグメントなら */
 152:                           afcFile->length=LengthCheck;
 153:                      else{ /* ラージセグメントなら */
 154:                           if(ReadData(afcFile,(B*)&(afcFile->length),4)<4)
 155:                               return FALSE;
 156:                      }
 157:                }
 158:         }else if((IDCheck&0xff00)==0xfe00) /* 言語指定コードなら */
 159:         {
 160:                BOOL flag;
 161:                int count;
 162:                UB lang;
 163: 
 164:                flag=TRUE;
 165:                for(count=0; flag; count++);
 166:                {
 167:                      if(ReadData(afcFile,(B*)&lang,1)<1)
 168:                           return FALSE;
 169:                      if(lang!=0xfe) /* 連鎖でないなら */
 170:                           flag=FALSE;
 171:                }
 172:                afcFile->offset-=count+2;
 173:                afcFile->ID=TS_LANGUAGE;
 174:                afcFile->subID=count;
 175:                afcFile->attribute=lang;
 176:                afcFile->length=0;
 177:         }else{ /* 固定長セグメント(文字コード)なら */
 178:                afcFile->offset-=2;
 179:                afcFile->ID=TS_FIXED;
 180:                afcFile->length=2;
 181:                afcFile->code=IDCheck;
 182:         }
 183:         afcFile->NextOffset=afcFile->offset+afcFile->length;
 184: 
 185: #endif
 186: #ifdef FORMAL_TAD
 187: #endif
 188: 
 189:         return TRUE;
 190: }
 191: 
 192: 
 193: 
 194: