Imported Upstream version 1.0.0
[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 unsigned long op_read_long_from_file(char const * filename, int fatal)
95 {
96         FILE * fp;
97         unsigned long value;
98
99         fp = fopen(filename, "r");
100         if (fp == NULL) {
101                 if (!fatal)
102                         return (unsigned long)-1;
103                 fprintf(stderr,
104                         "op_read_long_from_file: Failed to open %s, reason %s\n",
105                         filename, strerror(errno));
106                 exit(EXIT_FAILURE);
107         }
108
109         if (fscanf(fp, "%lu", &value) != 1) {
110                 fclose(fp);
111                 if (!fatal)
112                         return (unsigned long)-1;
113                 fprintf(stderr,
114                         "op_read_long_from_file: Failed to convert contents of file %s to unsigned long\n",
115                         filename);
116                 exit(EXIT_FAILURE);
117         }
118
119         fclose(fp);
120
121         return value;
122 }
123
124
125 u32 op_read_int_from_file(char const * filename, int fatal)
126 {
127         FILE * fp;
128         u32 value;
129
130         fp = fopen(filename, "r");
131         if (fp == NULL) {
132                 if (!fatal)
133                         return (u32)-1;
134                 fprintf(stderr,
135                         "op_read_int_from_file: Failed to open %s, reason %s\n",
136                         filename, strerror(errno));
137                 exit(EXIT_FAILURE);
138         }
139
140         if (fscanf(fp, "%u", &value) != 1) {
141                 fclose(fp);
142                 if (!fatal)
143                         return (u32)-1;
144                 fprintf(stderr,
145                         "op_read_int_from_file: Failed to convert contents of file %s to integer\n",
146                         filename);
147                 exit(EXIT_FAILURE);
148         }
149
150         fclose(fp);
151
152         return value;
153 }
154
155
156 char * op_get_line(FILE * fp)
157 {
158         char * buf;
159         char * cp;
160         int c;
161         size_t max = 512;
162
163         buf = xmalloc(max);
164         cp = buf;
165
166         while (1) {
167                 switch (c = getc(fp)) {
168                         case EOF:
169                                 free(buf);
170                                 return NULL;
171                                 break;
172
173                         case '\n':
174                         case '\0':
175                                 *cp = '\0';
176                                 return buf;
177                                 break;
178
179                         default:
180                                 *cp = (char)c;
181                                 cp++;
182                                 if (((size_t)(cp - buf)) == max) {
183                                         buf = xrealloc(buf, max + 128);
184                                         cp = buf + max;
185                                         max += 128;
186                                 }
187                                 break;
188                 }
189         }
190 }
191
192
193 /* FIXME the debug info stuff should be handled by binutils */
194 unsigned long
195 calc_crc32(unsigned long crc, unsigned char * buf, size_t len)
196 {
197         static const unsigned long crc32_table[256] =
198         {
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,
250                 0x2d02ef8d
251         };
252         unsigned char * end;
253
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;
258 }