Milán Major

netscape-revival

1 branch
Code

cmd/intertwingle/scan.c

/* -*- Mode: C; tab-width: 4 -*-
   scan.c --- extract text from MIME objects.
   Copyright © 1997 Netscape Communications Corporation, all rights reserved.
   Created: Jamie Zawinski <jwz@netscape.com>, 25-Jul-97.
 */

#include <stdio.h>
#include "config.h"
#include "mbox.h"

#include "libmime.h"	/* for MimeHeaders, for leaf.h */

#include "leaf.h"
#include "pprint.h"

int IT_READ_ERROR = -69690;	/* #### */
int IT_SEEK_ERROR = -69691;	/* #### */

typedef struct msg {
  int number;
  LeafParseObject *pobj;
} msg;


static void *
msg_start (const char *filename, int32 start_pos, void *closure)
{
  int *count = (int *) closure;
  msg *m = XP_NEW_ZAP(msg);
  if (!m) return 0;
  m->number = (*count)++;

  m->pobj = leaf_init (filename, start_pos,
					   pprint_begin, pprint_attachment, pprint_end,
					   (void *) stdout);
  if (!m->pobj)
    {
      XP_FREE(m);
      return 0;
    }

  return m;
}

static int
msg_write (void *closure, char *buf, int32 size)
{
  msg *m = (msg *) closure;
  return leaf_write(m->pobj, buf, size);
}

static int
msg_close(void *closure, Bool error_p)
{
  msg *m = (msg *) closure;
  int status;
  status = leaf_done (m->pobj, error_p);
  free (m);
  return status;
}


int
main (int argc, char **argv)
{
  int count = 0;
  int status = 0;
  const char *name;
  FILE *in;
  if (argc == 1)
    in = stdin, name = 0;
  else if (argc == 2)
    {
	  name = argv[1];
      in = fopen(name, "r");
      if (!in) exit(1);
    }
  else
    {
      fprintf(stderr, "usage: %s [ mbox-file ]\n", argv[0]);
      exit(1);
    }

  status = map_over_messages (in, name,
							  msg_start, msg_write, msg_close, &count);
  fprintf(stdout, "\n");
  exit (status < 0 ? 1 : 0);
}