00001
00012 #include <unistd.h>
00013
00014 #include "op_fileio.h"
00015
00016 #include "op_libiberty.h"
00017
00018 #include <errno.h>
00019 #include <string.h>
00020 #include <stdlib.h>
00021
00022 static FILE * op_do_open_file(char const * name, char const * mode, int fatal)
00023 {
00024 FILE * fp;
00025
00026 fp = fopen(name, mode);
00027
00028 if (!fp) {
00029 if (fatal) {
00030 fprintf(stderr,"oprofiled:op_do_open_file: %s: %s",
00031 name, strerror(errno));
00032 exit(EXIT_FAILURE);
00033 }
00034 }
00035
00036 return fp;
00037 }
00038
00039
00040 FILE * op_try_open_file(char const * name, char const * mode)
00041 {
00042 return op_do_open_file(name, mode, 0);
00043 }
00044
00045
00046 FILE * op_open_file(char const * name, char const * mode)
00047 {
00048 return op_do_open_file(name, mode, 1);
00049 }
00050
00051
00052 void op_close_file(FILE * fp)
00053 {
00054 if (fclose(fp))
00055 perror("oprofiled:op_close_file: ");
00056 }
00057
00058
00059 void op_write_file(FILE * fp, void const * buf, size_t size)
00060 {
00061 size_t written;
00062
00063 if (size == 0)
00064 return;
00065
00066 written = fwrite(buf, size, 1, fp);
00067
00068 if (written != 1) {
00069 fprintf(stderr,
00070 "oprofiled:op_write_file: wrote less than expected: %lu bytes.\n",
00071 (unsigned long)size);
00072 exit(EXIT_FAILURE);
00073 }
00074 }
00075
00076
00077 void op_write_u8(FILE * fp, u8 val)
00078 {
00079 op_write_file(fp, &val, sizeof(val));
00080 }
00081
00082
00083 void op_write_u32(FILE * fp, u32 val)
00084 {
00085 op_write_file(fp, &val, sizeof(val));
00086 }
00087
00088
00089 void op_write_u64(FILE * fp, u64 val)
00090 {
00091 op_write_file(fp, &val, sizeof(val));
00092 }
00093
00094
00095 u32 op_read_int_from_file(char const * filename, int fatal)
00096 {
00097 FILE * fp;
00098 u32 value;
00099
00100 fp = fopen(filename, "r");
00101 if (fp == NULL) {
00102 if (!fatal)
00103 return (u32)-1;
00104 fprintf(stderr,
00105 "op_read_int_from_file: Failed to open %s, reason %s\n",
00106 filename, strerror(errno));
00107 exit(EXIT_FAILURE);
00108 }
00109
00110 if (fscanf(fp, "%u", &value) != 1) {
00111 fclose(fp);
00112 if (!fatal)
00113 return (u32)-1;
00114 fprintf(stderr,
00115 "op_read_int_from_file: Failed to convert contents of file %s to integer\n",
00116 filename);
00117 exit(EXIT_FAILURE);
00118 }
00119
00120 fclose(fp);
00121
00122 return value;
00123 }
00124
00125
00126 char * op_get_line(FILE * fp)
00127 {
00128 char * buf;
00129 char * cp;
00130 int c;
00131 size_t max = 512;
00132
00133 buf = xmalloc(max);
00134 cp = buf;
00135
00136 while (1) {
00137 switch (c = getc(fp)) {
00138 case EOF:
00139 free(buf);
00140 return NULL;
00141 break;
00142
00143 case '\n':
00144 case '\0':
00145 *cp = '\0';
00146 return buf;
00147 break;
00148
00149 default:
00150 *cp = (char)c;
00151 cp++;
00152 if (((size_t)(cp - buf)) == max) {
00153 buf = xrealloc(buf, max + 128);
00154 cp = buf + max;
00155 max += 128;
00156 }
00157 break;
00158 }
00159 }
00160 }
00161
00162
00163
00164 unsigned long
00165 calc_crc32(unsigned long crc, unsigned char * buf, size_t len)
00166 {
00167 static const unsigned long crc32_table[256] =
00168 {
00169 0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
00170 0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
00171 0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
00172 0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
00173 0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
00174 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
00175 0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
00176 0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
00177 0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
00178 0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
00179 0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
00180 0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
00181 0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
00182 0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
00183 0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
00184 0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
00185 0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
00186 0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
00187 0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
00188 0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
00189 0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
00190 0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
00191 0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
00192 0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
00193 0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
00194 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
00195 0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
00196 0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
00197 0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
00198 0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
00199 0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
00200 0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
00201 0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
00202 0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
00203 0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
00204 0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
00205 0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
00206 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
00207 0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
00208 0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
00209 0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
00210 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
00211 0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
00212 0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
00213 0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
00214 0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
00215 0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
00216 0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
00217 0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
00218 0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
00219 0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
00220 0x2d02ef8d
00221 };
00222 unsigned char * end;
00223
00224 crc = ~crc & 0xffffffff;
00225 for (end = buf + len; buf < end; ++buf)
00226 crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
00227 return ~crc & 0xffffffff;
00228 }