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

📄 dbf.c

📁 用于F3200掌机抄表设表
💻 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 + -