914aab6410366a12a319476fc1544032f2ba81de
[platform/upstream/rpm.git] / tools / utils.c
1 #include "system.h"
2
3 #include <stdarg.h>
4
5 #include "utils.h"
6
7 #include "debug.h"
8
9 static char *
10 my_stpcpy (char       *dest,
11            const char *src)
12 {
13   do
14     {
15       *dest++ = *src;
16     }
17   while (*src++ != '\0');
18
19   return dest - 1;
20 }
21
22
23 char *
24 strconcat (const char *string1, ...)
25 {
26   size_t          l;     
27   va_list args;
28   char    *s;
29   char    *concat;
30   char   *ptr;
31
32   l = 1 + strlen (string1);
33   va_start (args, string1);
34   s = va_arg (args, char*);
35   while (s)
36     {
37       l += strlen (s);
38       s = va_arg (args, char*);
39     }
40   va_end (args);
41
42   concat = malloc (sizeof (char) * l);
43   ptr = concat;
44
45   ptr = my_stpcpy (ptr, string1);
46   va_start (args, string1);
47   s = va_arg (args, char*);
48   while (s)
49     {
50       ptr = my_stpcpy (ptr, s);
51       s = va_arg (args, char*);
52     }
53   va_end (args);
54
55   return concat;
56 }
57
58 char *
59 path_basename (const char *filename)
60 {
61   char *slash;
62
63   slash = strrchr (filename, '/');
64   
65   if (slash)
66     return strdup (slash + 1);
67   else
68     return strdup (filename);
69 }
70
71 off_t
72 align_up (off_t offset, size_t alignment)
73 {
74   if (alignment == 0)
75     return offset;
76   return offset + (alignment - (offset % alignment)) % alignment;
77 }
78
79 int 
80 string_has_prefix (char *string, char *prefix)
81 {
82   while (*prefix != 0 && *string != 0 && *string == *prefix)
83     {
84       string++;
85       prefix++;
86     }
87   if (*prefix == 0)
88     return 1;
89   return 0;
90 }
91
92 /* Table computed with Mark Adler's makecrc.c utility.  */
93 static const unsigned int crc32_table[256] =
94 {
95   0x00000000, 0x77073096, 0xee0e612c, 0x990951ba, 0x076dc419,
96   0x706af48f, 0xe963a535, 0x9e6495a3, 0x0edb8832, 0x79dcb8a4,
97   0xe0d5e91e, 0x97d2d988, 0x09b64c2b, 0x7eb17cbd, 0xe7b82d07,
98   0x90bf1d91, 0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
99   0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7, 0x136c9856,
100   0x646ba8c0, 0xfd62f97a, 0x8a65c9ec, 0x14015c4f, 0x63066cd9,
101   0xfa0f3d63, 0x8d080df5, 0x3b6e20c8, 0x4c69105e, 0xd56041e4,
102   0xa2677172, 0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
103   0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940, 0x32d86ce3,
104   0x45df5c75, 0xdcd60dcf, 0xabd13d59, 0x26d930ac, 0x51de003a,
105   0xc8d75180, 0xbfd06116, 0x21b4f4b5, 0x56b3c423, 0xcfba9599,
106   0xb8bda50f, 0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
107   0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d, 0x76dc4190,
108   0x01db7106, 0x98d220bc, 0xefd5102a, 0x71b18589, 0x06b6b51f,
109   0x9fbfe4a5, 0xe8b8d433, 0x7807c9a2, 0x0f00f934, 0x9609a88e,
110   0xe10e9818, 0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
111   0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e, 0x6c0695ed,
112   0x1b01a57b, 0x8208f4c1, 0xf50fc457, 0x65b0d9c6, 0x12b7e950,
113   0x8bbeb8ea, 0xfcb9887c, 0x62dd1ddf, 0x15da2d49, 0x8cd37cf3,
114   0xfbd44c65, 0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
115   0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb, 0x4369e96a,
116   0x346ed9fc, 0xad678846, 0xda60b8d0, 0x44042d73, 0x33031de5,
117   0xaa0a4c5f, 0xdd0d7cc9, 0x5005713c, 0x270241aa, 0xbe0b1010,
118   0xc90c2086, 0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
119   0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4, 0x59b33d17,
120   0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad, 0xedb88320, 0x9abfb3b6,
121   0x03b6e20c, 0x74b1d29a, 0xead54739, 0x9dd277af, 0x04db2615,
122   0x73dc1683, 0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
123   0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1, 0xf00f9344,
124   0x8708a3d2, 0x1e01f268, 0x6906c2fe, 0xf762575d, 0x806567cb,
125   0x196c3671, 0x6e6b06e7, 0xfed41b76, 0x89d32be0, 0x10da7a5a,
126   0x67dd4acc, 0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
127   0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252, 0xd1bb67f1,
128   0xa6bc5767, 0x3fb506dd, 0x48b2364b, 0xd80d2bda, 0xaf0a1b4c,
129   0x36034af6, 0x41047a60, 0xdf60efc3, 0xa867df55, 0x316e8eef,
130   0x4669be79, 0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
131   0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f, 0xc5ba3bbe,
132   0xb2bd0b28, 0x2bb45a92, 0x5cb36a04, 0xc2d7ffa7, 0xb5d0cf31,
133   0x2cd99e8b, 0x5bdeae1d, 0x9b64c2b0, 0xec63f226, 0x756aa39c,
134   0x026d930a, 0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
135   0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38, 0x92d28e9b,
136   0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21, 0x86d3d2d4, 0xf1d4e242,
137   0x68ddb3f8, 0x1fda836e, 0x81be16cd, 0xf6b9265b, 0x6fb077e1,
138   0x18b74777, 0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
139   0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45, 0xa00ae278,
140   0xd70dd2ee, 0x4e048354, 0x3903b3c2, 0xa7672661, 0xd06016f7,
141   0x4969474d, 0x3e6e77db, 0xaed16a4a, 0xd9d65adc, 0x40df0b66,
142   0x37d83bf0, 0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
143   0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6, 0xbad03605,
144   0xcdd70693, 0x54de5729, 0x23d967bf, 0xb3667a2e, 0xc4614ab8,
145   0x5d681b02, 0x2a6f2b94, 0xb40bbe37, 0xc30c8ea1, 0x5a05df1b,
146   0x2d02ef8d
147 };
148
149 static unsigned int crc32 (unsigned int crc, unsigned char *buf, size_t len)
150 {
151   unsigned char *end;
152
153   crc = ~crc & 0xffffffff;
154   for (end = buf + len; buf < end; ++buf)
155     crc = crc32_table[(crc ^ *buf) & 0xff] ^ (crc >> 8);
156   return ~crc & 0xffffffff;
157 }
158
159 unsigned int
160 crc32_file (const char *filename)
161 {
162   unsigned int crc = 0;
163   int fd;
164   char buffer[1024*8];
165   ssize_t count;
166   
167   fd = open (filename, O_RDONLY);
168   if (fd < 0)
169     return 0;
170
171   while ((count = read (fd, buffer, sizeof (buffer))) > 0)
172     crc = crc32 (crc, buffer, count);
173
174   close (fd);
175   
176   return crc;
177 }