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: