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