ze-filter  (ze-filter-0.8.0-develop-180218)
ze-buffer.c
Go to the documentation of this file.
1 /*
2  *
3  * ze-filter - Mail Server Filter for sendmail
4  *
5  * Copyright (c) 2001-2018 - Jose-Marcio Martins da Cruz
6  *
7  * Auteur : Jose Marcio Martins da Cruz
8  * jose.marcio.mc@gmail.org
9  *
10  * Historique :
11  * Creation : janvier 2002
12  *
13  * This program is free software, but with restricted license :
14  *
15  *
16  * This program is distributed in the hope that it will be useful,
17  * but WITHOUT ANY WARRANTY; without even the implied warranty of
18  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
19  *
20  * More details about ze-filter license can be found at ze-filter
21  * web site : http://foss.jose-marcio.org
22  */
23 
24 #include <ze-sys.h>
25 
26 #include "libze.h"
27 
28 
29 /* ***************************************************************************
30  * *
31  * *
32  *****************************************************************************/
33 long
34 bufspn (buf, sz, accept)
35  char *buf;
36  long sz;
37  char *accept;
38 {
39  long n;
40  char *p;
41 
42  for (p = buf, n = 0; n < sz; n++, p++) {
43  if (strchr (accept, *p) == NULL)
44  break;
45  }
46  return n;
47 }
48 
49 
50 /* ***************************************************************************
51  * *
52  * *
53  *****************************************************************************/
54 long
55 bufcspn (buf, sz, reject)
56  char *buf;
57  long sz;
58  char *reject;
59 {
60  long n;
61  char *p;
62 
63  for (p = buf, n = 0; n < sz; n++, p++) {
64  if (strchr (reject, *p) != NULL)
65  break;
66  }
67  return n;
68 }
69 
70 /* ****************************************************************************
71  * *
72  * *
73  **************************************************************************** */
74 size_t
76  char *s;
77  size_t sz;
78 {
79  size_t nsz = 0;
80  char *p, *q;
81 
82  for (p = q = s; sz > 0; sz--, p++)
83  {
84  if (*p != '\r')
85  {
86  *q++ = *p;
87  nsz++;
88  }
89  }
90  return nsz;
91 }
92 
93 /* ***************************************************************************
94  * *
95  * *
96  *****************************************************************************/
97 int
98 buf_get_line (dst, szdst, org, szorg)
99  char *dst;
100  long szdst;
101  char *org;
102  long szorg;
103 {
104  int i = 0, nbc = 0;
105  char *p = org;
106 
107  if (org == NULL || dst == NULL || strlen (org) == 0)
108  return 0;
109 
110  *dst = '\0';
111 
112 #if 1
113  if (*p == '\r') {
114  p++;
115  if (*p == '\n')
116  return 2;
117  else
118  return 1;
119  }
120  if (*p == '\n') {
121  p++;
122  if (*p == '\r')
123  return 2;
124  else
125  return 1;
126  }
127 #else
128  if (strncmp(p, "\r\n", 2) == 0 || strncmp(p, "\n\r", 2) == 0)
129  return 2;
130  if (*p == '\r' || *p == '\n')
131  return 1;
132 #endif
133 
134  i = 0;
135  p = org;
136  while ((i < szorg) && (*p != '\0') && (*p != '\r') && (*p != '\n')) {
137  i++;
138  p++;
139  }
140 
141  if (i > 0) {
142  if (i < szdst) {
143  strncpy (dst, org, i);
144  dst[i] = '\0';
145  } else {
146  ZE_LogMsgWarning(0, "line length > dest buf size");
147  }
148  }
149  szorg -= i;
150  nbc = i;
151 
152 #if 1
153  if (*p == '\r') {
154  p++;
155  if (*p == '\n')
156  return nbc + 2;
157  else
158  return nbc + 1;
159  }
160  if (*p == '\n') {
161  p++;
162  if (*p == '\r')
163  return nbc + 2;
164  else
165  return nbc + 1;
166  }
167 #else
168  if (strncmp(p, "\r\n", 2) == 0 || strncmp(p, "\n\r", 2) == 0)
169  return nbc + 2;
170  if (*p == '\r' || *p == '\n')
171  return nbc + 1;
172 #endif
173 
174  return nbc;
175 }
176 
177 
178 /* ****************************************************************************
179  * *
180  * *
181  **************************************************************************** */
182 char *
183 read_text_file (fname, sz)
184  char *fname;
185  size_t *sz;
186 {
187  struct stat fstat;
188  char *buf = NULL;
189 
190  if (fname == NULL)
191  return NULL;
192 
193  if (sz != NULL)
194  *sz = 0;
195 
196  if (stat (fname, &fstat) == 0) {
197  uint32_t fsize = fstat.st_size;
198  int fd;
199 
200  if ((buf = (char *) malloc (fsize + 1)) == NULL)
201  return NULL;
202 
203  if ((fd = open (fname, O_RDONLY)) < 0) {
204  ZE_LogSysWarning("open(%s) error", STRNULL(fname, "(NULL)"));
205  free (buf);
206  return NULL;
207  }
208 
209  if ((fsize = read (fd, buf, fsize)) < 0) {
210  ZE_LogSysWarning("read error");
211  free (buf);
212  return NULL;
213  }
214  close (fd);
215 
216  buf[fsize] = '\0';
217  fsize = zeStrRmNulls (buf, fsize);
218 
219  if (sz != 0)
220  *sz = fsize;
221  }
222  return buf;
223 }
224 
225 /* ****************************************************************************
226  * *
227  * *
228  **************************************************************************** */
229 char *
230 buf_get_next_line (out, in, szout)
231  char *in;
232  char *out;
233  size_t szout;
234 {
235  size_t n;
236 
237  memset(out, 0, szout);
238  n = strcspn (in, "\r\n");
239  if ((szout > 0) && (n > szout - 1))
240  n = szout;
241  strncpy (out, in, n);
242  out[n] = '\0';
243  in += n;
244 
245  if (*in == '\r') {
246  in++;
247  if (*in == '\n')
248  in++;
249  return in;
250  }
251  if (*in == '\n') {
252  in++;
253  if (*in == '\r')
254  in++;
255  return in;
256  }
257  return in;
258 }
259 
260 
261 /* ****************************************************************************
262  * *
263  * *
264  **************************************************************************** */
265 bool
266 text_word_length(buf, st, size)
267  char *buf;
268  kstats_T *st;
269  size_t size;
270 {
271  char *p = buf;
272  int i = 0;
273  int sz = size;
274 
275  if ((buf == NULL) || (st == NULL))
276  return FALSE;
277 
278  zeKStatsReset(st);
279 
280  p = buf;
281  i = 0;
282  while ((sz > 0) && (*p != '\0'))
283  {
284  long pi, pf;
285 
286  pi = pf = 0;
287 
288  if (!zeStrRegex(p, "[A-Za-z]+", &pi, &pf, TRUE))
289  break;
290 
291  if (pi == 0)
292  {
293  zeKStatsUpdate(st, (double) (pf - pi));
294  p += pf;
295  sz -= pf;
296  } else {
297  p += pi;
298  sz -= pi;
299  }
300  }
301 
302  return TRUE;
303 }
304 
305 /* ****************************************************************************
306  * *
307  * *
308  **************************************************************************** */
309 long
310 text_buf_histogram(buf, size, prob)
311  char *buf;
312  size_t size;
313  long *prob;
314 {
315  unsigned char *p = (unsigned char *) buf;
316  long n = 0;
317 #if 0
318  int freq[256];
319 #endif
320 
321  if ((buf == NULL) || (size == 0) || (prob == NULL))
322  return 0;
323 
324  memset(prob, 0, 256 * sizeof(*prob));
325 
326  for (p = (unsigned char *) buf, n = 0; (n < size) && (*p != '\0'); n++, p++) {
327  if (isprint(*p))
328  prob[tolower(*p)]++;
329  }
330 
331  return n;
332 }
#define STRNULL(x, r)
Definition: macros.h:81
void zeKStatsReset(kstats_T *)
Definition: zeKStats.c:92
#define FALSE
Definition: macros.h:160
bool zeStrRegex(char *, char *, long *, long *, bool)
Definition: zeStrings.c:544
size_t zeStrRmNulls(char *, size_t)
Definition: zeStrings.c:368
#define strchr
Definition: ze-sys.h:218
char * buf_get_next_line(char *out, char *in, size_t szout)
Definition: ze-buffer.c:230
long text_buf_histogram(char *buf, size_t size, long *prob)
Definition: ze-buffer.c:310
void zeKStatsUpdate(kstats_T *, double)
Definition: zeKStats.c:101
int buf_get_line(char *dst, long szdst, char *org, long szorg)
Definition: ze-buffer.c:98
size_t buf_clean_rc(char *s, size_t sz)
Definition: ze-buffer.c:75
#define TRUE
Definition: macros.h:157
#define ZE_LogSysWarning(...)
Definition: zeSyslog.h:128
long bufcspn(char *buf, long sz, char *reject)
Definition: ze-buffer.c:55
#define ZE_LogMsgWarning(level,...)
Definition: zeSyslog.h:112
long bufspn(char *buf, long sz, char *accept)
Definition: ze-buffer.c:34
char * read_text_file(char *fname, size_t *sz)
Definition: ze-buffer.c:183
bool text_word_length(char *buf, kstats_T *st, size_t size)
Definition: ze-buffer.c:266
long uint32_t
Definition: ze-sys.h:489