📄 dbf.c
字号:
/******************************************************************************
(c) copyright 深圳市康卓电子技术有限公司 1999,2000,2001
ALL RIGHTS RESERVED
******************************************************************************
Project Name : F3200
Project No. : F3200-100
Title : F3200 File system
File Name : Key.c
Created On : 5/12/2003
Release :
Description :
*****************************************************************************/
#include "stdio.h"
#include "F3200.h" // F3200库函数头文件
/*****************************************************************************/
/*****************************************************************************/
OS_DBF *OSDBFOpen(UBYTE disk, LONG dirH, UBYTE *name)
{
OS_DBF *dbf;
UBYTE s[32];
LONG h;
dbf = (OS_DBF*)malloc(sizeof(OS_DBF)+8);
if(dbf==0) return 0;
dbf->h = OSfOpen(disk,dirH,name);
if(dbf->h<0){ free(dbf); return 0; } //打开失败
if(OSfRead(dbf->h,s,32)<0) { OSfClose(dbf->h); free(dbf); return 0; } //读文件失败
if((s[0]==0x03)||(s[0]==0x30)){ //
dbf->RecordNumMax = s[4]+(s[5]<<8)+(s[6]<<16)+(s[7]<<24);
dbf->RecordOffset = s[8]+(s[9]<<8);
dbf->RecordLength = s[10]+(s[11]<<8);
// dbf->RecordNum=0; // 当前记录号
// dbf->FieldFlag=0; // 当前字段无效
return dbf;
}
else { OSfClose(h); free(dbf); return 0; } //不可识别的类型
}
void OSDBFClose(OS_DBF *dbf)
{
OSfClose(dbf->h);
free(dbf);
}
//--- 读指定记录(从0起始) ---
BYTE OSDBFRecordRead(OS_DBF *dbf, ULONG RecordNum, UBYTE *d)
{
if(RecordNum>=dbf->RecordNumMax) return -1;
if(OSfSeek(dbf->h, dbf->RecordOffset+(dbf->RecordLength*RecordNum),SEEK_SET)<0) return -2;
if(OSfRead(dbf->h,d,dbf->RecordLength)<0) return -3;
return 0;
}
//--- 写指定记录(从0起始) ---
BYTE OSDBFRecordWrite(OS_DBF *dbf, ULONG RecordNum, UBYTE *d)
{
if(RecordNum>=dbf->RecordNumMax) return -1;
if(OSfSeek(dbf->h, dbf->RecordOffset+(dbf->RecordLength*RecordNum),SEEK_SET)<0) return -2;
if(OSfWrite(dbf->h,d,dbf->RecordLength)<0) return -3;
return 0;
}
//--- 增加一条新记录 ---
BYTE OSDBFRecordAdd(OS_DBF *dbf)
{
UBYTE s[4];
ULONG i;
if(OSfSeek(dbf->h,dbf->RecordOffset+(dbf->RecordLength*dbf->RecordNumMax),SEEK_SET)<0) return -1; //文件尾
for(i=0;i<dbf->RecordLength;i++) {
if(OSfPutC(dbf->h,0)<0) return -2;
}
dbf->RecordNumMax++;
s[0] = (UBYTE)dbf->RecordNumMax;
s[1] = (UBYTE)(dbf->RecordNumMax>>8);
s[2] = (UBYTE)(dbf->RecordNumMax>>16);
s[3] = (UBYTE)(dbf->RecordNumMax>>24);
OSfSeek(dbf->h,4,SEEK_SET);
OSfWrite(dbf->h,s,4);
return 0;
}
//--- 找到字段 ---
OS_FIELD *OSDBFFieldSearch(OS_DBF *dbf, UBYTE *FldName)
{
OS_FIELD *fld;
UBYTE s[32],i;
fld = (OS_FIELD *)malloc(sizeof(OS_FIELD)+8);
if(fld==0) return 0;
OSfSeek(dbf->h,32,SEEK_SET);
while(1){
if(OSfRead(dbf->h,s,32)<0){ free(fld); return 0; }
if(s[0]==0x0D){ free(fld); return 0; }
s[10]=0;
if(strcmp(s,FldName)==0){ //find
strcpy(fld->Name,s);
fld->Type = s[11];
fld->Offset = s[12] + (s[13]<<8) + (s[14]<<16) + (s[15]<<24);
fld->Len = s[16];
fld->Dot = s[17];
return fld;
}
}
}
//--- 释放字段 ---
void OSDBFFieldFree(OS_FIELD *fld)
{
free(fld);
}
//--- 读指定记录字段: 不可识别类型字段,数据在字符型中不变 ---
BYTE OSDBFFieldRead(OS_DBF *dbf, OS_FIELD *fld, ULONG RecordNum, FIELD *d)
{
UBYTE i,j;
LLONG a;
ULONG b,c;
LONG x;
OS_CALENDAR p;
if(RecordNum>=dbf->RecordNumMax) return -1;
if(OSfSeek(dbf->h, dbf->RecordOffset+(dbf->RecordLength*RecordNum)+fld->Offset,SEEK_SET)<0) return -2;
if(OSfRead(dbf->h,d->C.data,fld->Len)<0) return -3;
//-- 处理类型 --
switch(fld->Type){
case 'N':
j = 0; a = 0;
for(i=0;i<fld->Len;i++){
if(d->C.data[i]==0x2D){ j =1; }
else if(isdigit(d->C.data[i])){
a = a*10 + (d->C.data[i]&0xF);
}
}
d->N.data = a;
d->N.dot = fld->Dot;
break;
case 'C':
break;
case 'D':
b = d->C.data[0] + (d->C.data[1]<<8) + (d->C.data[2]<<16) + (d->C.data[3]<<24);
OSOffsetToCalendar(b,0,&p);
d->D.year = p.year;
d->D.month = p.month;
d->D.day = p.day;
d->D.week = p.week;
break;
case 'T':
b = d->C.data[0] + (d->C.data[1]<<8) + (d->C.data[2]<<16) + (d->C.data[3]<<24);
c = d->C.data[4] + (d->C.data[5]<<8) + (d->C.data[6]<<16) + (d->C.data[7]<<24);
OSOffsetToCalendar(b,c,&p);
d->T.year = p.year;
d->T.month = p.month;
d->T.day = p.day;
d->T.week = p.week;
d->T.hour = p.hour;
d->T.minute = p.minute;
d->T.second = p.second;
d->T.ms = c%1000;
break;
case 'I':
x = d->C.data[0] + (d->C.data[1]<<8) + (d->C.data[2]<<16) + (d->C.data[3]<<24);
d->I.data = x;
break;
default:
break;
}
return 0;
}
//--- 写指定记录字段 ---
BYTE OSDBFFieldWrite(OS_DBF *dbf, OS_FIELD *fld, ULONG RecordNum, FIELD *d)
{
LLONG a;
ULONG b,c;
UBYTE i;
OS_CALENDAR p;
if(RecordNum>=dbf->RecordNumMax) return -1;
if(OSfSeek(dbf->h, dbf->RecordOffset+(dbf->RecordLength*RecordNum)+fld->Offset,SEEK_SET)<0) return -2;
//-- 处理类型 --
switch(fld->Type){
case 'N':
a = d->N.data;
if(a<0) {
a = (~a)+1;
for(i=0;i<fld->Len;i++){
if((fld->Dot>0)&&(i==fld->Dot)) d->C.data[fld->Len-1-i] = 0x2E;
else {
d->C.data[fld->Len-1-i] = (a%10)+0x30;
a = a/10;
}
}
for(i=1;i<fld->Len;i++){
if(d->C.data[i]==0x30) d->C.data[i]=0x20;
else{
d->C.data[i]=0x2D;
break;
}
}
}
else {
for(i=0;i<fld->Len;i++){
if((fld->Dot>0)&&(i==fld->Dot)) d->C.data[fld->Len-1-i] = 0x2E;
else {
d->C.data[fld->Len-1-i] = (a%10)+0x30;
a = a/10;
}
}
for(i=0;i<fld->Len;i++){
if(d->C.data[i]==0x30) d->C.data[i]=0x20;
else break;
}
}
break;
case 'C':
break;
case 'D':
p.year = d->D.year;
p.month = d->D.month;
p.day = d->D.day;
p.week = d->D.week;
OSCalendarToOffset(&p,&b,&c);
d->C.data[0] = (UBYTE)b;
d->C.data[1] = (UBYTE)(b>>8);
d->C.data[2] = (UBYTE)(b>>16);
d->C.data[3] = (UBYTE)(b>>24);
break;
case 'T':
p.year = d->T.year;
p.month = d->T.month;
p.day = d->T.day;
p.week = d->T.week;
p.hour = d->T.hour;
p.minute = d->T.minute;
p.second = d->T.second;
// p.ms = d->T.ms;
OSCalendarToOffset(&p,&b,&c);
d->C.data[0] = (UBYTE)b;
d->C.data[1] = (UBYTE)(b>>8);
d->C.data[2] = (UBYTE)(b>>16);
d->C.data[3] = (UBYTE)(b>>24);
d->C.data[4] = (UBYTE)c;
d->C.data[5] = (UBYTE)(c>>8);
d->C.data[6] = (UBYTE)(c>>16);
d->C.data[7] = (UBYTE)(c>>24);
break;
case 'I':
b = d->I.data;
d->C.data[0] = (UBYTE)b;
d->C.data[1] = (UBYTE)(b>>8);
d->C.data[2] = (UBYTE)(b>>16);
d->C.data[3] = (UBYTE)(b>>24);
break;
default:
break;
}
if(OSfWrite(dbf->h,d->C.data,fld->Len)<0) return -3;
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -