--- a/src/utils/mimeparse.cpp
+++ b/src/utils/mimeparse.cpp
@@ -1,5 +1,5 @@
#ifndef lint
-static char rcsid[] = "@(#$Id: mimeparse.cpp,v 1.15 2006-11-07 18:28:48 dockes Exp $ (C) 2004 J.F.Dockes";
+static char rcsid[] = "@(#$Id: mimeparse.cpp,v 1.16 2006-11-09 08:59:40 dockes Exp $ (C) 2004 J.F.Dockes";
#endif
/*
* This program is free software; you can redistribute it and/or modify
@@ -741,110 +741,186 @@
using namespace std;
extern bool rfc2231_decode(const string& in, string& out, string& charset);
extern time_t rfc2822DateToUxTime(const string& date);
-
+static const char *thisprog;
+
+static char usage [] =
+"-p: header value and parameter test\n"
+"-q: qp decoding\n"
+"-b: base64\n"
+"-7: rfc2047\n"
+"-1: rfc2331\n"
+"-t: date time\n"
+" \n\n"
+;
+static void
+Usage(void)
+{
+ fprintf(stderr, "%s: usage:\n%s", thisprog, usage);
+ exit(1);
+}
+
+static int op_flags;
+#define OPT_MOINS 0x1
+#define OPT_p 0x2
+#define OPT_q 0x4
+#define OPT_b 0x8
+#define OPT_7 0x10
+#define OPT_1 0x20
+#define OPT_t 0x40
int
main(int argc, const char **argv)
{
+ int count = 10;
+
+ thisprog = argv[0];
+ argc--; argv++;
+
+ while (argc > 0 && **argv == '-') {
+ (*argv)++;
+ if (!(**argv))
+ /* Cas du "adb - core" */
+ Usage();
+ while (**argv)
+ switch (*(*argv)++) {
+ case 'p': op_flags |= OPT_p; break;
+ case 'q': op_flags |= OPT_q; break;
+ case 'b': op_flags |= OPT_b; break;
+ case '1': op_flags |= OPT_1; break;
+ case '7': op_flags |= OPT_7; break;
+ case 't': op_flags |= OPT_t; break;
+ default: Usage(); break;
+ }
+ b1: argc--; argv++;
+ }
+
+ if (argc != 0)
+ Usage();
+
+ if (op_flags & OPT_p) {
+ // Mime header value and parameters extraction
+ const char *tr[] = {
+ "text/html;charset = UTF-8 ; otherparam=garb; \n"
+ "QUOTEDPARAM=\"quoted value\"",
+
+ "application/x-stuff;"
+ "title*0*=us-ascii'en'This%20is%20even%20more%20;"
+ "title*1*=%2A%2A%2Afun%2A%2A%2A%20;"
+ "title*2=\"isn't it!\""
+ };
+
+ for (unsigned int i = 0; i < sizeof(tr) / sizeof(char *); i++) {
+ MimeHeaderValue parsed;
+ if (!parseMimeHeaderValue(tr[i], parsed)) {
+ fprintf(stderr, "PARSE ERROR for [%s]\n", tr[i]);
+ }
+ printf("Field value: [%s]\n", parsed.value.c_str());
+ map<string, string>::iterator it;
+ for (it = parsed.params.begin();it != parsed.params.end();it++) {
+ if (it == parsed.params.begin())
+ printf("Parameters:\n");
+ printf(" [%s] = [%s]\n", it->first.c_str(), it->second.c_str());
+ }
+ }
+
+ } else if (op_flags & OPT_q) {
+ // Quoted printable stuff
+ const char *qp =
+ "=41=68 =e0 boire=\r\n continue 1ere\ndeuxieme\n\r3eme "
+ "agrave is: '=E0' probable skipped decode error: =\n"
+ "Actual decode error =xx this wont show";
+
+ string out;
+ if (!qp_decode(string(qp), out)) {
+ fprintf(stderr, "qp_decode returned error\n");
+ }
+ printf("Decoded: '%s'\n", out.c_str());
+ } else if (op_flags & OPT_b) {
+ // Base64
+ //'C'est � boire qu'il nous faut �viter l'exc�s.'
+ //'Deuxi�me ligne'
+ //'Troisi�me ligne'
+ //'Et la fin (pas de nl). '
+ const char *b64 =
+ "Qydlc3Qg4CBib2lyZSBxdSdpbCBub3VzIGZhdXQg6XZpdGVyIGwnZXhj6HMuCkRldXhp6G1l\r\n"
+ "IGxpZ25lClRyb2lzaehtZSBsaWduZQpFdCBsYSBmaW4gKHBhcyBkZSBubCkuIA==\r\n";
+
+ string out;
+ if (!base64_decode(string(b64), out)) {
+ fprintf(stderr, "base64_decode returned error\n");
+ exit(1);
+ }
+ printf("Decoded: [%s]\n", out.c_str());
#if 0
- //const char *tr = "text/html; charset=utf-8; otherparam=garb";
-
- const char *tr = "text/html;charset = UTF-8 ; otherparam=garb; \n"
- "QUOTEDPARAM=\"quoted value\"";
-
- // const char *tr = "application/x-stuff;"
- // "title*0*=us-ascii'en'This%20is%20even%20more%20;"
- //"title*1*=%2A%2A%2Afun%2A%2A%2A%20;"
- //"title*2=\"isn't it!\"";
-
- MimeHeaderValue parsed;
-
- if (!parseMimeHeaderValue(tr, parsed)) {
- fprintf(stderr, "PARSE ERROR\n");
- }
+ string coded, decoded;
+ const char *fname = "/tmp/recoll_decodefail";
+ if (!file_to_string(fname, coded)) {
+ fprintf(stderr, "Cant read %s\n", fname);
+ exit(1);
+ }
- printf("Field value: [%s]\n", parsed.value.c_str());
- map<string, string>::iterator it;
- for (it = parsed.params.begin();it != parsed.params.end();it++) {
- if (it == parsed.params.begin())
- printf("Parameters:\n");
- printf(" [%s] = [%s]\n", it->first.c_str(), it->second.c_str());
- }
-#elif 0
- const char *qp = "=41=68 =e0 boire=\r\n continue 1ere\ndeuxieme\n\r3eme "
- "agrave is: '=E0' probable skipped decode error: =\n"
- "Actual decode error =xx this wont show";
-
- string out;
- if (!qp_decode(string(qp), out)) {
- fprintf(stderr, "qp_decode returned error\n");
- }
- printf("Decoded: '%s'\n", out.c_str());
-#elif 0
- //'C'est � boire qu'il nous faut �viter l'exc�s.'
- //'Deuxi�me ligne'
- //'Troisi�me ligne'
- //'Et la fin (pas de nl). '
- const char *b64 =
- "Qydlc3Qg4CBib2lyZSBxdSdpbCBub3VzIGZhdXQg6XZpdGVyIGwnZXhj6HMuCkRldXhp6G1l\r\n"
- "IGxpZ25lClRyb2lzaehtZSBsaWduZQpFdCBsYSBmaW4gKHBhcyBkZSBubCkuIA==\r\n";
-
- string out;
- if (!base64_decode(string(b64), out)) {
- fprintf(stderr, "base64_decode returned error\n");
- exit(1);
- }
- printf("Decoded: '%s'\n", out.c_str());
-#elif 0
- char line [1024];
- string out;
- bool res;
- while (fgets(line, 1023, stdin)) {
- int l = strlen(line);
- if (l == 0)
- continue;
- line[l-1] = 0;
- fprintf(stderr, "Line: [%s]\n", line);
-#if 0
- res = rfc2047_decode(line, out);
-#else
- string charset;
- res = rfc2231_decode(line, out, charset);
+ if (!base64_decode(coded, decoded)) {
+ fprintf(stderr, "base64_decode returned error\n");
+ exit(1);
+ }
+ printf("Decoded: [%s]\n", decoded.c_str());
#endif
- if (res)
- fprintf(stderr, "Out: [%s]\n", out.c_str());
- else
- fprintf(stderr, "Decoding failed\n");
- }
-#elif 0
- string coded, decoded;
- const char *fname = "/tmp/recoll_decodefail";
- if (!file_to_string(fname, coded)) {
- fprintf(stderr, "Cant read %s\n", fname);
- exit(1);
- }
-
- if (!base64_decode(coded, decoded)) {
- fprintf(stderr, "base64_decode returned error\n");
- exit(1);
- }
- printf("Decoded: [%s]\n", decoded.c_str());
-#elif 1
- {
- time_t t;
+
+ } else if (op_flags & (OPT_7|OPT_1)) {
+ // rfc2047
+ char line [1024];
+ string out;
+ bool res;
+ while (fgets(line, 1023, stdin)) {
+ int l = strlen(line);
+ if (l == 0)
+ continue;
+ line[l-1] = 0;
+ fprintf(stderr, "Line: [%s]\n", line);
+ string charset;
+ if (op_flags & OPT_7) {
+ res = rfc2047_decode(line, out);
+ } else {
+ res = rfc2231_decode(line, out, charset);
+ }
+ if (res)
+ fprintf(stderr, "Out: [%s] cs %s\n", out.c_str(), charset.c_str());
+ else
+ fprintf(stderr, "Decoding failed\n");
+ }
+ } else if (op_flags & OPT_t) {
+ time_t t;
- const char *dates[] = {
- " Wed, 13 Sep 2006 11:40:26 -0700 (PDT)",
- " Mon, 3 Jul 2006 09:51:58 +0200",
- " Wed, 13 Sep 2006 08:19:48 GMT-07:00",
- " Wed, 13 Sep 2006 11:40:26 -0700 (PDT)",
- " Sat, 23 Dec 89 19:27:12 EST",
- " 13 Jan 90 08:23:29 GMT"};
-
- for (unsigned int i = 0; i <sizeof(dates) / sizeof(char *); i++) {
- t = rfc2822DateToUxTime(dates[i]);
- }
- }
-#endif
+ const char *dates[] = {
+ " Wed, 13 Sep 2006 11:40:26 -0700 (PDT)",
+ " Mon, 3 Jul 2006 09:51:58 +0200",
+ " Wed, 13 Sep 2006 08:19:48 GMT-07:00",
+ " Wed, 13 Sep 2006 11:40:26 -0700 (PDT)",
+ " Sat, 23 Dec 89 19:27:12 EST",
+ " 13 Jan 90 08:23:29 GMT"};
+
+ for (unsigned int i = 0; i <sizeof(dates) / sizeof(char *); i++) {
+ t = rfc2822DateToUxTime(dates[i]);
+ struct tm *tm = localtime(&t);
+ char datebuf[100];
+ strftime(datebuf, 99, " %Y-%m-%d %H:%M:%S %z", tm);
+ printf("[%s] -> [%s]\n", dates[i], datebuf);
+ }
+ printf("Enter date:\n");
+ char line [1024];
+ while (fgets(line, 1023, stdin)) {
+ int l = strlen(line);
+ if (l == 0) continue;
+ line[l-1] = 0;
+ t = rfc2822DateToUxTime(line);
+ struct tm *tm = localtime(&t);
+ char datebuf[100];
+ strftime(datebuf, 99, " %Y-%m-%d %H:%M:%S %z", tm);
+ printf("[%s] -> [%s]\n", line, datebuf);
+ }
+
+
+ }
+ exit(0);
}
#endif // TEST_MIMEPARSE