Imported Upstream version 0.9.8
[platform/upstream/oprofile.git] / libutil / op_fileio.c
1 /**
2  * @file op_fileio.c
3  * Reading from / writing to files
4  *
5  * @remark Copyright 2002 OProfile authors
6  * @remark Read the file COPYING
7  *
8  * @author John Levon
9  * @author Philippe Elie
10  */
11
12 #include <unistd.h>
13
14 #include "op_fileio.h"
15
16 #include "op_libiberty.h"
17
18 #include <errno.h>
19 #include <string.h>
20 #include <stdlib.h>
21
22 static FILE * op_do_open_file(char const * name, char const * mode, int fatal)
23 {
24         FILE * fp;
25
26         fp = fopen(name, mode);
27
28         if (!fp) {
29                 if (fatal) {
30                         fprintf(stderr,"oprofiled:op_do_open_file: %s: %s",
31                                 name, strerror(errno));
32                         exit(EXIT_FAILURE);
33                 }
34         }
35
36         return fp;
37 }
38
39
40 FILE * op_try_open_file(char const * name, char const * mode)
41 {
42         return op_do_open_file(name, mode, 0);
43 }
44
45
46 FILE * op_open_file(char const * name, char const * mode)
47 {
48         return op_do_open_file(name, mode, 1);
49 }
50
51
52 void op_close_file(FILE * fp)
53 {
54         if (fclose(fp))
55                 perror("oprofiled:op_close_file: ");
56 }
57
58
59 void op_write_file(FILE * fp, void const * buf, size_t size)
60 {
61         size_t written;
62
63         if (size == 0)
64                 return;
65
66         written = fwrite(buf, size, 1, fp);
67
68         if (written != 1) {
69                 fprintf(stderr,
70                         "oprofiled:op_write_file: wrote less than expected: %lu bytes.\n",
71                         (unsigned long)size);
72                 exit(EXIT_FAILURE);
73         }
74 }
75
76
77 void op_write_u8(FILE * fp, u8 val)
78 {
79         op_write_file(fp, &val, sizeof(val));
80 }
81
82
83 void op_write_u32(FILE * fp, u32 val)
84 {
85         op_write_file(fp, &val, sizeof(val));
86 }
87
88
89 void op_write_u64(FILE * fp, u64 val)
90 {
91         op_write_file(fp, &val, sizeof(val));
92 }
93
94
95 u32 op_read_int_from_file(char const * filename, int fatal)
96 {
97         FILE * fp;
98         u32 value;
99
100         fp = fopen(filename, "r");
101         if (fp == NULL) {
102                 if (!fatal)
103                         return (u32)-1;
104                 fprintf(stderr,
105                         "op_read_int_from_file: Failed to open %s, reason %s\n",
106                         filename, strerror(errno));
107                 exit(EXIT_FAILURE);
108         }
109
110         if (fscanf(fp, "%u", &value) != 1) {
111                 fclose(fp);
112                 if (!fatal)
113                         return (u32)-1;
114                 fprintf(stderr,
115                         "op_read_int_from_file: Failed to convert contents of file %s to integer\n",
116                         filename);
117                 exit(EXIT_FAILURE);
118         }
119
120         fclose(fp);
121
122         return value;
123 }
124
125
126 char * op_get_line(FILE * fp)
127 {
128         char * buf;
129         char * cp;
130         int c;
131         size_t max = 512;
132
133         buf = xmalloc(max);
134         cp = buf;
135
136         while (1) {
137                 switch (c = getc(fp)) {
138                         case EOF:
139                                 free(buf);
140                                 return NULL;
141                                 break;
142
143                         case '\n':
144                         case '\0':
145                                 *cp = '\0';
146                                 return buf;
147                                 break;
148
149                         default:
150                                 *cp = (char)c;
151                                 cp++;
152                                 if (((size_t)(cp - buf)) == max) {
153                                         buf = xrealloc(buf, max + 128);
154                                         cp = buf + max;
155                                         max += 128;
156                                 }
157                                 break;
158                 }
159         }
160 }
161
162
163 /* FIXME the debug info stuff should be handled by binutils */
164 unsigned long
165 calc_crc32(unsigned long crc, unsigned char * buf, size_t len)
166 {
167         static const unsigned long crc32_table[256] =
168         {
169                 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
170                 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
171                 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
172                 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
173                 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
174                 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
175                 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
176                 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
177                 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
178                 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
179                 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
180                 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
181                 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
182                 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
183                 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
184                 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
185                 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
186                 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
187                 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
188                 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
189                 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
190                 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
191                 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
192                 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
193                 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
194                 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
195                 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
196                 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
197                 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
198                 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
199                 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
200                 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
201                 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
202                 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
203                 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
204                 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
205                 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
206                 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
207                 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
208                 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
209                 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
210                 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
211                 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
212                 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
213                 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
214                 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
215                 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
216                 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
217                 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
218                 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
219                 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
220                 0x2d02ef8d
221         };
222         unsigned char * end;
223
224         crc = ~crc & 0xffffffff;
225         for (end = buf + len; buf < end; ++buf)
226                 crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
227         return ~crc & 0xffffffff;
228 }