35{
36 assert(f!=NULL);
37
38 char *buf = NULL;
39 int bufSize = 0;
40
41 while (1)
42 {
44
45 int rd = fread(&rec, sizeof(rec), 1, f);
46 if (!rd)
47 break;
48
49#if 0
50 printf("HIST_RECORD:\n");
52 printf(
" Event ID: %d\n", rec.
event_id);
53 printf(
" Time: %d\n", rec.
time);
56#endif
57
59 {
60 default:
61 fprintf(stderr,
"Error: %s: Unexpected record type: 0x%x\n", filename, rec.
record_type);
62 if (buf)
63 free(buf);
64 return -1;
65 break;
66
67 case 0x46445348:
68 {
71
73 fprintf(stderr,
"Error: %s: Error reading RT_DEF record, fread(%d) returned %d, errno %d (%s)\n", filename,
NAME_LENGTH, rd, errno, strerror(errno));
74 if (buf)
75 free(buf);
76 return -1;
77 break;
78 }
79
80
82
84
85 }
86
88 int ntags = size/
sizeof(
TAG);
89
90
91
92 if (!((size > 0) &&
93 (size < 1*1024*1024) &&
94 (size == ntags*(
int)
sizeof(
TAG)))) {
95
96 fprintf(stderr, "Error: %s: Invalid length of RT_DEF record: %d (0x%x)\n", filename, size, size);
97 if (buf)
98 free(buf);
99 return -1;
100 break;
101 }
102
103 TAG *tags =
new TAG[ntags];
104 rd = fread(tags, 1, size, f);
105
106 if (rd != size) {
107 fprintf(stderr, "Error: %s: Error reading RT_DEF record, fread(%d) returned %d, errno %d (%s)\n", filename, size, rd, errno, strerror(errno));
108 if (buf)
109 free(buf);
110 return -1;
111 break;
112 }
113
114
115
116 for (
int i=0;
i<ntags;
i++) {
119 fprintf(stderr,
"Warning: %s: Event \"%s\": Fixed by truncation at forbidden TID_STRING tag \"%s\" at index %d\n", filename, event_name, tags[
i].
name,
i);
122 break;
123 }
124
125 if (strlen(tags[
i].
name) < 1) {
126 sprintf(tags[
i].
name,
"empty_%d",
i);
128 fprintf(stderr,
"Warning: %s: Event \"%s\": Fixed empty tag name for tag %d: replaced with \"%s\"\n", filename, event_name,
i, tags[
i].
name);
130 }
131
132 for (
int j=
i+1;
j<ntags;
j++) {
133 if (strcmp(tags[
i].
name, tags[
j].
name) == 0) {
135 sprintf(
str,
"_dup%d",
j);
138 fprintf(stderr,
"Warning: %s: Event \"%s\": Fixed duplicate tag names: tag \"%s\" at index %d duplicate at index %d replaced with \"%s\"\n", filename, event_name, tags[
i].
name,
i,
j, tags[
j].
name);
140 }
141 }
142 }
143
145
147
148 delete[] tags;
149 break;
150 }
151
152 case 0x41445348:
153 {
155
156 if (0)
157 printf("Data record, size %d.\n", size);
158
159 if (!((size > 0) &&
160 (size < 1*1024*1024))) {
161
162 fprintf(stderr, "Error: %s: Invalid length of RT_DATA record: %d (0x%x)\n", filename, size, size);
163 if (buf)
164 free(buf);
165 return -1;
166 break;
167 }
168
169 if (size > bufSize)
170 {
171 bufSize = 1024*((size+1023)/1024);
172 char *newbuf = (char*)realloc(buf, bufSize);
173
174 if (newbuf == NULL) {
175 fprintf(stderr, "Error: %s: Cannot realloc(%d), errno %d (%s)\n", filename, bufSize, errno, strerror(errno));
176 if (buf)
177 free(buf);
178 return -1;
179 break;
180 }
181
182 buf = newbuf;
183 }
184
185 rd = fread(buf, 1, size, f);
186
187 if (rd != size) {
188 fprintf(stderr, "Error: %s: Error reading RT_DATA record, fread(%d) returned %d, errno %d (%s)\n", filename, size, rd, errno, strerror(errno));
189 if (buf)
190 free(buf);
191 return -1;
192 break;
193 }
194
195 time_t t = (time_t)rec.
time;
196
198
199 break;
200 }
201 }
202
204 }
205
206 if (buf)
207 free(buf);
208
209 return 0;
210}
virtual int hs_write_event(const char *event_name, time_t timestamp, int data_size, const char *data)=0
see hs_write_event(), returns HS_SUCCESS or HS_FILE_ERROR
virtual int hs_define_event(const char *event_name, time_t timestamp, int ntags, const TAG tags[])=0
see hs_define_event(), returns HS_SUCCESS or HS_FILE_ERROR
INT cm_msg_flush_buffer()
std::map< int, const char * > gEventName