HUGE PATCH. This moves all of mime_parser.c and all
[citadel.git] / citadel / msgform.c
index 94ddb0971b5c85032934d09dd94627ea91df1780..c17a2577904aabcc255fb70648039d3b5225ba69 100644 (file)
@@ -1,14 +1,14 @@
 /*
- * msgform.c v2.1 $Id$
- * see copyright.doc for copyright information
+ * $Id$
  * 
  * This is simply a filter that converts Citadel binary message format
  * to readable, formatted output.
  * 
  * If the -q (quiet or qwk) flag is used, only the message text prints, and
  * then it stops at the end of the first message it prints.
- * This is used by the QWK reader for Citadel/UX during message format
- * translation.
+ * 
+ * This utility isn't very useful anymore.
+ *
  */
 
 #include "sysdep.h"
 #include <stdio.h>
 #include <ctype.h>
 #include <string.h>
-#include <time.h>
-#include <errno.h>
 
+#if TIME_WITH_SYS_TIME
+# include <sys/time.h>
+# include <time.h>
+#else
+# if HAVE_SYS_TIME_H
+#  include <sys/time.h>
+# else
+#  include <time.h>
+# endif
+#endif
+
+#include <errno.h>
+#include <libcitadel.h>
 
 int qwk = 0;
 
-int fpgetfield(FILE *fp, char *string);
-int fmout(int width, FILE *fp);
+int fpgetfield(FILE * fp, char *string);
+int fmout(int width, FILE * fp);
 
 
 #ifndef HAVE_STRERROR
@@ -36,121 +47,165 @@ char *strerror(int e)
 {
        static char buf[32];
 
-       sprintf(buf,"errno = %d",e);
-       return(buf);
-       }
+       snprintf(buf, sizeof buf, "errno = %d", e);
+       return (buf);
+}
 #endif
 
 int main(int argc, char **argv)
 {
-       struct tm *tm;
-       int a,b,e,mtype,aflag;
+       struct tm tm;
+       int a, b, e, mtype, aflag;
        char bbb[1024];
        char subject[1024];
        FILE *fp;
        time_t now;
 
-       if (argc==2) if (!strcmp(argv[1],"-q")) qwk = 1;
-       fp=stdin;
-       if (argc==2) if (strcmp(argv[1],"-q")) {
-               fp = fopen(argv[1],"r");
-               if (fp==NULL) {
-                       fprintf(stderr,"%s: cannot open %s: %s\n",
-                               argv[0],argv[1],strerror(errno));
-                       exit(errno);
+       if (argc == 2)
+               if (!strcmp(argv[1], "-q"))
+                       qwk = 1;
+       fp = stdin;
+       if (argc == 2)
+               if (strcmp(argv[1], "-q")) {
+                       fp = fopen(argv[1], "r");
+                       if (fp == NULL) {
+                               fprintf(stderr, "%s: cannot open %s: %s\n",
+                                       argv[0], argv[1], strerror(errno));
+                               exit(errno);
                        }
                }
 
 TOP:   do {
-               e=getc(fp);
-               if (e<0) exit(0);
-               } while(e!=255);
-       strcpy(subject,"");
-       mtype=getc(fp); aflag=getc(fp);
-       if (qwk == 0) printf(" ");
-
-   do {
-       b=getc(fp);
-       if (b=='M') {
-               if (qwk==0) {
+               e = getc(fp);
+               if (e < 0)
+                       exit(0);
+       } while (e != 255);
+       strcpy(subject, "");
+       mtype = getc(fp);
+       aflag = getc(fp);
+       if (qwk == 0)
+               printf(" ");
+
+       do {
+               b = getc(fp);
+               if (b == 'M') {
+                       if (qwk == 0) {
                                printf("\n");
-                               if (strlen(subject)!=0)
-                                       printf("Subject: %s\n",subject);
-                               }
-               if (aflag!=1) fmout(80,fp);
-                  else while(a=getc(fp), a>0) {
-                       if (a==13) putc(10,stdout);
-                       else putc(a,stdout);
+                               if (!IsEmptyStr(subject))
+                                       printf("Subject: %s\n", subject);
                        }
+                       if (aflag != 1)
+                               fmout(80, fp);
+                       else
+                               while (a = getc(fp), a > 0) {
+                                       if (a == 13)
+                                               putc(10, stdout);
+                                       else
+                                               putc(a, stdout);
+                               }
                }
-       if ((b!='M')&&(b>0)) fpgetfield(fp,bbb);
-       if (b=='U') strcpy(subject,bbb);
-       if (qwk==0) {
-               if (b=='A') printf("from %s ",bbb);
-               if (b=='N') printf("@%s ",bbb);
-               if (b=='O') printf("in %s> ",bbb);
-               if (b=='R') printf("to %s ",bbb);
-               if (b=='T') {
-                       now=atol(bbb);
-                       tm=(struct tm *)localtime(&now);
-                       strcpy(bbb,asctime(tm)); bbb[strlen(bbb)-1]=0;
-                       printf("%s ",&bbb[4]);
+               if ((b != 'M') && (b > 0))
+                       fpgetfield(fp, bbb);
+               if (b == 'U')
+                       strcpy(subject, bbb);
+               if (qwk == 0) {
+                       if (b == 'A')
+                               printf("from %s ", bbb);
+                       if (b == 'N')
+                               printf("@%s ", bbb);
+                       if (b == 'O')
+                               printf("in %s> ", bbb);
+                       if (b == 'R')
+                               printf("to %s ", bbb);
+                       if (b == 'T') {
+                               now = atol(bbb);
+                               localtime_r(&now, &tm);
+                               strcpy(bbb, asctime(&tm));
+                               bbb[strlen(bbb) - 1] = 0;
+                               printf("%s ", &bbb[4]);
                        }
                }
-          } while ((b!='M')&&(b>0));
-       if (qwk==0) printf("\n"); 
-       if (qwk==1) exit(0);
+       } while ((b != 'M') && (b > 0));
+       if (qwk == 0)
+               printf("\n");
+       if (qwk == 1)
+               exit(0);
        goto TOP;
 }
 
-int fpgetfield(FILE *fp, char *string) /* level-2 break out next null-terminated string */
-         
-              
-{
-int a,b;
-strcpy(string,"");
-a=0;
+int fpgetfield(FILE * fp, char *string)
+
+{                              /* level-2 break out next null-terminated string */
+       int a, b;
+       strcpy(string, "");
+       a = 0;
        do {
-               b=getc(fp);
-               if (b<1) { string[a]=0; return(0); }
-               string[a]=b;
+               b = getc(fp);
+               if (b < 1) {
+                       string[a] = 0;
+                       return (0);
+               }
+               string[a] = b;
                ++a;
-               } while(b!=0);
-       return(0);
+       } while (b != 0);
+       return (0);
 }
 
-int fmout(int width, FILE *fp)
+int fmout(int width, FILE * fp)
 {
-       int a,b,c;
+       int a, b, c;
        int real = 0;
        int old = 0;
        char aaa[140];
-       
-       strcpy(aaa,""); old=255;
-       c=1; /* c is the current pos */
-FMTA:  old=real; a=getc(fp); real=a;
-       if (a<=0) goto FMTEND;
-       
-       if ( ((a==13)||(a==10)) && (old!=13) && (old!=10) ) a=32;
-       if ( ((old==13)||(old==10)) && (isspace(real)) ) {
-                                               printf("\n"); c=1; }
-       if (a>126) goto FMTA;
-
-       if (a>32) {
-       if ( ((strlen(aaa)+c)>(width-5)) && (strlen(aaa)>(width-5)) )
-               { printf("\n%s",aaa); c=strlen(aaa); aaa[0]=0; }
-        b=strlen(aaa); aaa[b]=a; aaa[b+1]=0; }
-       if (a==32) {    if ((strlen(aaa)+c)>(width-5)) { 
-                                                       printf("\n");
-                                                       c=1;
-                                                       }
-                       printf("%s ",aaa); ++c; c=c+strlen(aaa);
-                       strcpy(aaa,""); goto FMTA; }
-       if ((a==13)||(a==10)) {
-                               printf("%s\n",aaa); c=1;
-                               strcpy(aaa,""); goto FMTA; }
+
+       strcpy(aaa, "");
+       old = 255;
+       c = 1;                  /* c is the current pos */
+FMTA:  old = real;
+       a = getc(fp);
+       real = a;
+       if (a <= 0)
+               goto FMTEND;
+
+       if (((a == 13) || (a == 10)) && (old != 13) && (old != 10))
+               a = 32;
+       if (((old == 13) || (old == 10)) && (isspace(real))) {
+               printf("\n");
+               c = 1;
+       }
+       if (a > 126)
+               goto FMTA;
+
+       if (a > 32) {
+               if (((strlen(aaa) + c) > (width - 5))
+                   && (strlen(aaa) > (width - 5))) {
+                       printf("\n%s", aaa);
+                       c = strlen(aaa);
+                       aaa[0] = 0;
+               }
+               b = strlen(aaa);
+               aaa[b] = a;
+               aaa[b + 1] = 0;
+       }
+       if (a == 32) {
+               if ((strlen(aaa) + c) > (width - 5)) {
+                       printf("\n");
+                       c = 1;
+               }
+               printf("%s ", aaa);
+               ++c;
+               c = c + strlen(aaa);
+               strcpy(aaa, "");
+               goto FMTA;
+       }
+       if ((a == 13) || (a == 10)) {
+               printf("%s\n", aaa);
+               c = 1;
+               strcpy(aaa, "");
+               goto FMTA;
+       }
        goto FMTA;
 
 FMTEND:        printf("\n");
-       return(0);
+       return (0);
 }