1 #include <unistd.h>
2 #include <stdlib.h>
3 #include <stdio.h>
4 #include <errno.h>
5 #include <sys/time.h>
6 #include <string.h>
7 #include "error.h"
8
READ(int fd,char * whereto,size_t len)9 ssize_t READ(int fd, char *whereto, size_t len)
10 {
11 ssize_t cnt=0;
12
13 while(len>0)
14 {
15 ssize_t rc;
16
17 rc = read(fd, whereto, len);
18
19 if (rc == -1)
20 {
21 if (errno != EINTR)
22 error_exit("error while read()\n");
23 }
24 else if (rc == 0)
25 {
26 break;
27 }
28 else
29 {
30 whereto += rc;
31 len -= rc;
32 cnt += rc;
33 }
34 }
35
36 return cnt;
37 }
38
WRITE(int fd,char * wherefrom,size_t len)39 ssize_t WRITE(int fd, char *wherefrom, size_t len)
40 {
41 ssize_t cnt=0;
42
43 while(len>0)
44 {
45 ssize_t rc;
46
47 rc = write(fd, wherefrom, len);
48
49 if (rc == -1)
50 {
51 if (errno != EINTR)
52 error_exit("error while write()\n");
53 }
54 else if (rc == 0)
55 {
56 break;
57 }
58 else
59 {
60 wherefrom += rc;
61 len -= rc;
62 cnt += rc;
63 }
64 }
65
66 return cnt;
67 }
68
resize(void ** pnt,size_t n,size_t * len,size_t size)69 int resize(void **pnt, size_t n, size_t *len, size_t size)
70 {
71 if (n == *len)
72 {
73 size_t dummylen = (*len) == 0 ? 2 : (*len) * 2;
74 void *dummypnt = (void *)realloc(*pnt, dummylen * size);
75
76 if (!dummypnt)
77 error_exit("resize::realloct: Cannot (re-)allocate %d bytes of memory\n", dummylen * size);
78
79 *len = dummylen;
80 *pnt = dummypnt;
81 }
82 else if (n > *len || n<0)
83 error_exit("resize: fatal memory corruption problem: n > len || n<0 || len<0!");
84
85 return 0;
86 }
87
read_line(FILE * fh)88 char * read_line(FILE *fh)
89 {
90 char *str = NULL;
91 size_t n_in=0, size=0;
92
93 for(;;)
94 {
95 int c;
96
97 /* read one character */
98 c = fgetc(fh);
99 if (c == EOF)
100 break;
101
102 /* resize input-buffer */
103 if (resize((void **)&str, n_in, &size, sizeof(char)) == -1)
104 {
105 free(str);
106 error_exit("read_line_fd::resize: malloc failed (for %d bytes)", size);
107 }
108
109 /* EOF or \n == end of line */
110 if (c == 10 || c == EOF)
111 break;
112
113 /* ignore CR */
114 if (c == 13)
115 continue;
116
117 /* add to string */
118 str[n_in++] = c;
119 }
120
121 if (n_in)
122 {
123 /* terminate string */
124 if (resize((void **)&str, n_in, &size, sizeof(char)) == -1)
125 {
126 free(str);
127 error_exit("read_line_fd::resize: malloc failed (for %d bytes)", size);
128 }
129 str[n_in] = 0x00;
130 }
131 else
132 {
133 free(str);
134 str = NULL;
135 }
136
137 return str;
138 }
139
get_token(char * in)140 char * get_token(char *in)
141 {
142 char *out, *dummy;
143
144 // skip leading spaces/tabs
145 while(*in == ' ' || *in == '\t')
146 in++;
147
148 // make copy of string
149 dummy = out = strdup(in);
150 if (!out)
151 error_exit("get_token::strdup: strdup-malloc failure");
152
153 // remove trailing spaces/tabs
154 while (*dummy != ' ' && *dummy != '\t' && *dummy != 0x00)
155 dummy++;
156
157 *dummy = 0x00;
158
159 return out;
160 }
161
mymalloc(size_t size,char * what)162 void * mymalloc(size_t size, char *what)
163 {
164 void *dummy = malloc(size);
165 if (!dummy)
166 error_exit("failed to allocate %d bytes for %s\n", size, what);
167
168 return dummy;
169 }
170
get_ts(void)171 double get_ts(void)
172 {
173 struct timeval ts;
174
175 if (gettimeofday(&ts, NULL) == -1)
176 error_exit("gettimeofday failed");
177
178 return (((double)ts.tv_sec) + ((double)ts.tv_usec)/1000000.0);
179 }
180