3 * Reading from / writing to files
5 * @remark Copyright 2002 OProfile authors
6 * @remark Read the file COPYING
9 * @author Philippe Elie
14 #include "op_fileio.h"
16 #include "op_libiberty.h"
22 static FILE * op_do_open_file(char const * name, char const * mode, int fatal)
26 fp = fopen(name, mode);
30 fprintf(stderr,"oprofiled:op_do_open_file: %s: %s",
31 name, strerror(errno));
40 FILE * op_try_open_file(char const * name, char const * mode)
42 return op_do_open_file(name, mode, 0);
46 FILE * op_open_file(char const * name, char const * mode)
48 return op_do_open_file(name, mode, 1);
52 void op_close_file(FILE * fp)
55 perror("oprofiled:op_close_file: ");
59 void op_write_file(FILE * fp, void const * buf, size_t size)
66 written = fwrite(buf, size, 1, fp);
70 "oprofiled:op_write_file: wrote less than expected: %lu bytes.\n",
77 void op_write_u8(FILE * fp, u8 val)
79 op_write_file(fp, &val, sizeof(val));
83 void op_write_u32(FILE * fp, u32 val)
85 op_write_file(fp, &val, sizeof(val));
89 void op_write_u64(FILE * fp, u64 val)
91 op_write_file(fp, &val, sizeof(val));
94 unsigned long op_read_long_from_file(char const * filename, int fatal)
99 fp = fopen(filename, "r");
102 return (unsigned long)-1;
104 "op_read_long_from_file: Failed to open %s, reason %s\n",
105 filename, strerror(errno));
109 if (fscanf(fp, "%lu", &value) != 1) {
112 return (unsigned long)-1;
114 "op_read_long_from_file: Failed to convert contents of file %s to unsigned long\n",
125 u32 op_read_int_from_file(char const * filename, int fatal)
130 fp = fopen(filename, "r");
135 "op_read_int_from_file: Failed to open %s, reason %s\n",
136 filename, strerror(errno));
140 if (fscanf(fp, "%u", &value) != 1) {
145 "op_read_int_from_file: Failed to convert contents of file %s to integer\n",
156 char * op_get_line(FILE * fp)
167 switch (c = getc(fp)) {
182 if (((size_t)(cp - buf)) == max) {
183 buf = xrealloc(buf, max + 128);
193 /* FIXME the debug info stuff should be handled by binutils */
195 calc_crc32(unsigned long crc, unsigned char * buf, size_t len)
197 static const unsigned long crc32_table[256] =
199 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
200 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
201 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
202 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
203 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
204 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
205 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
206 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
207 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
208 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
209 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
210 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
211 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
212 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
213 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
214 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
215 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
216 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
217 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
218 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
219 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
220 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
221 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
222 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
223 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
224 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
225 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
226 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
227 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
228 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
229 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
230 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
231 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
232 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
233 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
234 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
235 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
236 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
237 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
238 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
239 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
240 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
241 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
242 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
243 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
244 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
245 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
246 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
247 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
248 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
249 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
254 crc = ~crc & 0xffffffff;
255 for (end = buf + len; buf < end; ++buf)
256 crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
257 return ~crc & 0xffffffff;