FireBirdLib - Topfield TMS PVR TAP Programming Library
infData_Delete.c
Go to the documentation of this file.
1#include <stdio.h>
2#include "FBLib_rec.h"
3
4extern FILE *infDatainfFile;
5
6bool infData_Delete(const char *infFileName, const char *NameTag)
7{
8 bool ret;
9 dword SourcePos, DestPos, Len;
10 tTFRPlusHdr TFRPlusHdr;
11 char NameTagHdr[512];
12 byte *Data;
13
14 TRACEENTER();
15
16 ret = FALSE;
17
18 if(NameTag && *NameTag && infData_OpenFile(infFileName) && infData_LocateSig(NameTag, NULL))
19 {
20 ret = TRUE;
21
22 //Now the file pointer is located at the beginning of the data block
23 //which should be deleted.
24 DestPos = ftell(infDatainfFile);
25 fread(&TFRPlusHdr, sizeof(tTFRPlusHdr), 1, infDatainfFile);
26 Len = sizeof(tTFRPlusHdr) + TFRPlusHdr.NameTagLen + TFRPlusHdr.PayloadSize;
27 SourcePos = DestPos + Len;
28 fseek(infDatainfFile, SourcePos, SEEK_SET);
29
30 while(SourcePos < infData_Flen())
31 {
32 //Stop if we're unable to read the whole header
33 if(fread(&TFRPlusHdr, sizeof(tTFRPlusHdr), 1, infDatainfFile) == 0) break;
34
35 //Stop parsing if the magic is invalid
36 if(memcmp(TFRPlusHdr.Magic, INFDATMAGIC, 4) != 0) break;
37
38 Len = sizeof(tTFRPlusHdr) + TFRPlusHdr.NameTagLen + TFRPlusHdr.PayloadSize;
39
40 fread(NameTagHdr, TFRPlusHdr.NameTagLen, 1, infDatainfFile);
41
42 if(TFRPlusHdr.PayloadSize)
43 {
44 Data = TAP_MemAlloc(TFRPlusHdr.PayloadSize);
45 if(Data)
46 {
47 fread(Data, TFRPlusHdr.PayloadSize, 1, infDatainfFile);
48 }
49 else
50 {
51 LogEntryFBLibPrintf(TRUE, "infData: failed to reserve %lu bytes for deletion of %s:%s", TFRPlusHdr.PayloadSize, infFileName, NameTagHdr);
52 TFRPlusHdr.PayloadSize = 0;
53 }
54 }
55 else
56 Data = NULL;
57
58 fseek(infDatainfFile, DestPos, SEEK_SET);
59 fwrite(&TFRPlusHdr, sizeof(tTFRPlusHdr), 1, infDatainfFile);
60 fwrite(NameTagHdr, TFRPlusHdr.NameTagLen, 1, infDatainfFile);
61
62 if(Data)
63 {
64 fwrite(Data, TFRPlusHdr.PayloadSize, 1, infDatainfFile);
65 TAP_MemFree(Data);
66 }
67
68 DestPos += Len;
69 SourcePos += Len;
70
71 fseek(infDatainfFile, SourcePos, SEEK_SET);
72 }
73 infData_Truncate(infFileName, DestPos);
74 }
75
77
78 TRACEEXIT();
79 return ret;
80}
struct __STDIO_FILE_STRUCT FILE
Definition: FBLib_hdd.h:137
#define INFDATMAGIC
Definition: FBLib_rec.h:18
void infData_Truncate(const char *infFileName, dword Position)
bool infData_LocateSig(const char *NameTag, dword *PayloadSize)
bool infData_OpenFile(const char *infFileName)
void infData_CloseFile(void)
dword infData_Flen(void)
Definition: infData_Flen.c:6
void LogEntryFBLibPrintf(bool Console, char *format,...)
FILE * infDatainfFile
bool infData_Delete(const char *infFileName, const char *NameTag)
Definition: infData_Delete.c:6
#define SEEK_SET
Definition: libFireBird.h:1875
#define TRACEEXIT()
Definition: libFireBird.h:1244
#define TRACEENTER()
Definition: libFireBird.h:1243
dword NameTagLen
Definition: FBLib_rec.h:23
char Magic[4]
Definition: FBLib_rec.h:22
dword PayloadSize
Definition: FBLib_rec.h:24