bogofilter -Q
Matthias Andree
matthias.andree at gmx.de
Fri Aug 29 14:08:17 CEST 2003
On Thu, 28 Aug 2003, jxz wrote:
> I just use bogofilter with its default configuration. What's that
> garbage in spamicity_tags?
Fixed in CVS, try this patch (it also adds %D to format strings that
formats ISO-8601 date in UTC, for tracing filtering):
Index: src/format.c
===================================================================
RCS file: /cvsroot/bogofilter/bogofilter/src/format.c,v
retrieving revision 1.17
retrieving revision 1.19
diff -u -r1.17 -r1.19
--- src/format.c 19 Aug 2003 12:42:26 -0000 1.17
+++ src/format.c 29 Aug 2003 12:05:44 -0000 1.19
@@ -1,4 +1,4 @@
-/* $Id: format.c,v 1.17 2003/08/19 12:42:26 relson Exp $ */
+/* $Id: format.c,v 1.19 2003/08/29 12:05:44 m-a Exp $ */
/*****************************************************************************
@@ -56,6 +56,8 @@
**
** c - classification, e.g. Yes/No, Spam/Ham/Unsure, +/-/?
**
+** D - date, fixed ISO-8601 format for Universal Time ("GMT")
+**
** e - spamicity as 'e' format
** f - spamicity as 'f' format
** g - spamicity as 'g' format
@@ -76,16 +78,15 @@
const char *log_header_format = "%h: %c, spamicity=%p, version=%v";
const char *log_update_format = "register-%r, %w words, %m messages";
-#define RC_COUNT RC_UNSURE+1 /* 3 (for Spam/Ham/Unsure) */
-
typedef const char *FIELD;
-typedef FIELD FIELDS[RC_COUNT];
-FIELDS spamicity_tags_ynu = { "Yes", "No", "Unsure" };
-FIELDS spamicity_tags_shu = { "Spam", "Ham", "Unsure" };
+#define RC_COUNT 3
+static FIELD spamicity_tags_ynu[] = { "Yes", "No", "Unsure" };
+static FIELD spamicity_tags_shu[] = { "Spam", "Ham", "Unsure" };
+static FIELD spamicity_format_d[] = { "%0.6f", "%0.6f", "%0.6f" };
FIELD *spamicity_tags = spamicity_tags_ynu;
-FIELDS spamicity_formats = { "%0.6f", "%0.6f", "%0.6f" };
+FIELD *spamicity_formats = spamicity_format_d;
static bool set_spamicity_tags(const unsigned char *val);
static bool set_spamicity_formats(const unsigned char *val);
@@ -172,6 +173,24 @@
return ok;
}
+static size_t format_date(char *dest, const char *destend)
+{
+ struct tm *tm;
+ time_t t;
+ size_t l;
+
+ /* must check, size_t will wrap to INT_MAX or LONG_MAX otherwise */
+ if (dest == destend)
+ return 0;
+
+ (void)time(&t);
+ tm = gmtime(&t);
+ l = strftime(dest, (size_t)(destend - dest - 1), "%Y-%m-%dT%H:%M:%SZ", tm);
+ if (l + 1 >= (size_t)(destend - dest)) /* sanitize return */
+ l = 0;
+ return l;
+}
+
static size_t format_float(char *dest, double src,
int min, int prec, int flags, const char *destend)
{
@@ -202,7 +221,7 @@
{
size_t s_len = strlen(src);
int len;
- if (s_len > INT_MAX) {
+ if (s_len > (size_t)INT_MAX) {
fprintf(stderr, "cannot handle string length (%lu) above %d, aborting\n", (unsigned long)s_len, INT_MAX);
internal_error;
}
@@ -225,7 +244,9 @@
static size_t format_spamicity(char *dest, const char *fmt, double spamicity, const char *destend)
{
char temp[20];
- size_t len = sprintf(temp, fmt, spamicity);
+ size_t len = snprintf(temp, sizeof(temp), fmt, spamicity);
+ if (len > INT_MAX)
+ len = INT_MAX; /* clamp */
len = format_string(dest, temp, 0, len, 0, destend);
return len;
}
@@ -252,7 +273,8 @@
char temp[20];
int state = S_DEFAULT;
- size_t min = 0, prec = 0;
+ int min = 0;
+ int prec = 0;
int flags = 0;
rc_t status = method->status();
@@ -336,6 +358,12 @@
buff += format_spamicity(buff, f, spamicity, end);
break;
}
+ case 'D': /* D - date in ISO8601 format for GMT time zone */
+ {
+ buff += format_date(buff, end);
+ break;
+ }
+
case 'p': /* p - spamicity as a probability */
{
const char *f = spamicity_formats[status];
More information about the Bogofilter
mailing list