Blame tools/djvups.cpp

Packit df99a1
//C-  -*- C++ -*-
Packit df99a1
//C- -------------------------------------------------------------------
Packit df99a1
//C- DjVuLibre-3.5
Packit df99a1
//C- Copyright (c) 2002  Leon Bottou and Yann Le Cun.
Packit df99a1
//C- Copyright (c) 2001  AT&T
Packit df99a1
//C-
Packit df99a1
//C- This software is subject to, and may be distributed under, the
Packit df99a1
//C- GNU General Public License, either Version 2 of the license,
Packit df99a1
//C- or (at your option) any later version. The license should have
Packit df99a1
//C- accompanied the software or you may obtain a copy of the license
Packit df99a1
//C- from the Free Software Foundation at http://www.fsf.org .
Packit df99a1
//C-
Packit df99a1
//C- This program is distributed in the hope that it will be useful,
Packit df99a1
//C- but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit df99a1
//C- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit df99a1
//C- GNU General Public License for more details.
Packit df99a1
//C- 
Packit df99a1
//C- DjVuLibre-3.5 is derived from the DjVu(r) Reference Library from
Packit df99a1
//C- Lizardtech Software.  Lizardtech Software has authorized us to
Packit df99a1
//C- replace the original DjVu(r) Reference Library notice by the following
Packit df99a1
//C- text (see doc/lizard2002.djvu and doc/lizardtech2007.djvu):
Packit df99a1
//C-
Packit df99a1
//C-  ------------------------------------------------------------------
Packit df99a1
//C- | DjVu (r) Reference Library (v. 3.5)
Packit df99a1
//C- | Copyright (c) 1999-2001 LizardTech, Inc. All Rights Reserved.
Packit df99a1
//C- | The DjVu Reference Library is protected by U.S. Pat. No.
Packit df99a1
//C- | 6,058,214 and patents pending.
Packit df99a1
//C- |
Packit df99a1
//C- | This software is subject to, and may be distributed under, the
Packit df99a1
//C- | GNU General Public License, either Version 2 of the license,
Packit df99a1
//C- | or (at your option) any later version. The license should have
Packit df99a1
//C- | accompanied the software or you may obtain a copy of the license
Packit df99a1
//C- | from the Free Software Foundation at http://www.fsf.org .
Packit df99a1
//C- |
Packit df99a1
//C- | The computer code originally released by LizardTech under this
Packit df99a1
//C- | license and unmodified by other parties is deemed "the LIZARDTECH
Packit df99a1
//C- | ORIGINAL CODE."  Subject to any third party intellectual property
Packit df99a1
//C- | claims, LizardTech grants recipient a worldwide, royalty-free, 
Packit df99a1
//C- | non-exclusive license to make, use, sell, or otherwise dispose of 
Packit df99a1
//C- | the LIZARDTECH ORIGINAL CODE or of programs derived from the 
Packit df99a1
//C- | LIZARDTECH ORIGINAL CODE in compliance with the terms of the GNU 
Packit df99a1
//C- | General Public License.   This grant only confers the right to 
Packit df99a1
//C- | infringe patent claims underlying the LIZARDTECH ORIGINAL CODE to 
Packit df99a1
//C- | the extent such infringement is reasonably necessary to enable 
Packit df99a1
//C- | recipient to make, have made, practice, sell, or otherwise dispose 
Packit df99a1
//C- | of the LIZARDTECH ORIGINAL CODE (or portions thereof) and not to 
Packit df99a1
//C- | any greater extent that may be necessary to utilize further 
Packit df99a1
//C- | modifications or combinations.
Packit df99a1
//C- |
Packit df99a1
//C- | The LIZARDTECH ORIGINAL CODE is provided "AS IS" WITHOUT WARRANTY
Packit df99a1
//C- | OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
Packit df99a1
//C- | TO ANY WARRANTY OF NON-INFRINGEMENT, OR ANY IMPLIED WARRANTY OF
Packit df99a1
//C- | MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
Packit df99a1
//C- +------------------------------------------------------------------
Packit df99a1
Packit df99a1
#ifdef HAVE_CONFIG_H
Packit df99a1
# include "config.h"
Packit df99a1
#endif
Packit df99a1
Packit df99a1
#include <stddef.h>
Packit df99a1
#include <stdlib.h>
Packit df99a1
#include <stdio.h>
Packit df99a1
#include <stdarg.h>
Packit df99a1
#include <string.h>
Packit df99a1
#include <fcntl.h>
Packit df99a1
#include <errno.h>
Packit df99a1
Packit df99a1
#include "libdjvu/ddjvuapi.h"
Packit df99a1
Packit df99a1
#if defined(_WIN32) || defined(__CYGWIN32__)
Packit df99a1
# include <io.h>
Packit df99a1
#endif
Packit df99a1
#if defined(_WIN32) && !defined(__CYGWIN32__)
Packit df99a1
# include <mbctype.h>
Packit df99a1
#endif
Packit df99a1
Packit df99a1
/* Some day we'll redo i18n right. */
Packit df99a1
#ifndef i18n
Packit df99a1
# define i18n(x) (x)
Packit df99a1
# define I18N(x) (x)
Packit df99a1
#endif
Packit df99a1
Packit df99a1
bool verbose = false;
Packit df99a1
bool tryhelp = false;
Packit df99a1
ddjvu_context_t *ctx;
Packit df99a1
ddjvu_document_t *doc;
Packit df99a1
ddjvu_job_t *job;
Packit df99a1
Packit df99a1
void
Packit df99a1
progress(int p)
Packit df99a1
{
Packit df99a1
  if (verbose)
Packit df99a1
    {
Packit df99a1
      int i=0;
Packit df99a1
      char buffer[52];
Packit df99a1
      for (; p>0; p-=2)
Packit df99a1
        buffer[i++]='#';
Packit df99a1
      for (; i<50;)
Packit df99a1
        buffer[i++]=' ';
Packit df99a1
      buffer[i] = 0;
Packit df99a1
      fprintf(stderr,"\r[%s]",buffer);
Packit df99a1
    }        
Packit df99a1
}
Packit df99a1
Packit df99a1
void
Packit df99a1
handle(int wait)
Packit df99a1
{
Packit df99a1
  const ddjvu_message_t *msg;
Packit df99a1
  if (!ctx)
Packit df99a1
    return;
Packit df99a1
  if (wait)
Packit df99a1
    msg = ddjvu_message_wait(ctx);
Packit df99a1
  while ((msg = ddjvu_message_peek(ctx)))
Packit df99a1
    {
Packit df99a1
      switch(msg->m_any.tag)
Packit df99a1
        {
Packit df99a1
        case DDJVU_ERROR:
Packit df99a1
          if (verbose)
Packit df99a1
            fprintf(stderr,"\n");
Packit df99a1
          fprintf(stderr,"djvups: %s\n", msg->m_error.message);
Packit df99a1
          if (msg->m_error.filename)
Packit df99a1
            fprintf(stderr,"djvups: '%s:%d'\n", 
Packit df99a1
                    msg->m_error.filename, msg->m_error.lineno);
Packit df99a1
          if (tryhelp)
Packit df99a1
            fprintf(stderr,"djvups: %s\n", i18n("Try option --help."));
Packit df99a1
          exit(10);
Packit df99a1
        case DDJVU_PROGRESS:
Packit df99a1
          if (verbose)
Packit df99a1
            progress(msg->m_progress.percent);
Packit df99a1
          break;
Packit df99a1
        default:
Packit df99a1
          break;
Packit df99a1
        }
Packit df99a1
      ddjvu_message_pop(ctx);
Packit df99a1
    }
Packit df99a1
}
Packit df99a1
Packit df99a1
void 
Packit df99a1
die(const char *fmt, ...)
Packit df99a1
{
Packit df99a1
  /* Handling messages might give a better error message */
Packit df99a1
  tryhelp = true;
Packit df99a1
  handle(FALSE);
Packit df99a1
  /* Print */
Packit df99a1
  va_list args;
Packit df99a1
  fprintf(stderr,"ddjvu: ");
Packit df99a1
  va_start(args, fmt);
Packit df99a1
  vfprintf(stderr, fmt, args);
Packit df99a1
  va_end(args);
Packit df99a1
  fprintf(stderr,"\n");
Packit df99a1
  /* Terminates */
Packit df99a1
  exit(10);
Packit df99a1
}
Packit df99a1
Packit df99a1
const char *options[] = {
Packit df99a1
  I18N("-verbose"),
Packit df99a1
  I18N("-page=<pagelists>                   (default: print all)"),
Packit df99a1
  I18N("-format=<ps|eps>                    (default: ps)"),
Packit df99a1
  I18N("-level=<1|2|3>                      (default: 2)"),
Packit df99a1
  I18N("-orient=<auto|portrait|landscape>   (default: auto)"),
Packit df99a1
  I18N("-mode=<color|bw|fore|back>          (default: color)"),
Packit df99a1
  I18N("-zoom=
Packit df99a1
  I18N("-color=<yes|no>                     (default: yes)"),
Packit df99a1
  I18N("-gray                               (same as -color=no)"),
Packit df99a1
  I18N("-colormatch=<yes|no>                (default: yes)"),
Packit df99a1
  I18N("-gamma=<0.3...5.0>                  (default: 2.2)"),
Packit df99a1
  I18N("-copies=<1...999999>                (default: 1)"),
Packit df99a1
  I18N("-frame=<yes|no>                     (default: no)"),
Packit df99a1
  I18N("-cropmarks=<yes|no>                 (default: no)"),
Packit df99a1
#ifdef THIS_THING_DOES_NOT_WORK_WITH_UTF8_STRINGS
Packit df99a1
  I18N("-text=<yes|no>                      (default: no)"),
Packit df99a1
#endif
Packit df99a1
  I18N("-booklet=<no|recto|verso|yes>       (default: no)"),
Packit df99a1
  I18N("-bookletmax=<n>                     (default: 0)"),
Packit df99a1
  I18N("-bookletalign=<n>                   (default: 0)"),
Packit df99a1
  I18N("-bookletfold=<n>[+<m>]              (default: 18+200)"),
Packit df99a1
  NULL };
Packit df99a1
Packit df99a1
Packit df99a1
void
Packit df99a1
usage(void)
Packit df99a1
{
Packit df99a1
  int i;
Packit df99a1
#ifdef DJVULIBRE_VERSION
Packit df99a1
  fprintf(stderr, "DJVUPS --- DjVuLibre-" DJVULIBRE_VERSION "\n");
Packit df99a1
#endif
Packit df99a1
  fprintf(stderr, "%s\n",
Packit df99a1
          i18n("DjVu to PostScript conversion utility\n\n"
Packit df99a1
               "Usage: djvups [<options>] [<infile.djvu> [<outfile.ps>]]\n"
Packit df99a1
               "Options:\n  -help"));
Packit df99a1
  for(i=0; options[i]; i++)
Packit df99a1
    fprintf(stderr, "  %s\n", i18n(options[i]));
Packit df99a1
  fprintf(stderr,"\n");
Packit df99a1
  exit(1);
Packit df99a1
}
Packit df99a1
Packit df99a1
int 
Packit df99a1
check_option(char *s)
Packit df99a1
{
Packit df99a1
  int i;
Packit df99a1
  for (i=0; options[i]; i++)
Packit df99a1
    {
Packit df99a1
      int n = 0;
Packit df99a1
      const char *p = options[i];
Packit df99a1
      while (p[n] && p[n]!='=' && p[n]!=' ')
Packit df99a1
        n += 1;
Packit df99a1
      if (p[n]=='=' && !strncmp(s, p, n+1))
Packit df99a1
        return 1;
Packit df99a1
      if (p[n]!='=' && !strncmp(s, p, n) && !s[n])
Packit df99a1
        return 1;        
Packit df99a1
    }
Packit df99a1
  // compatibility aliases 
Packit df99a1
  if (!strcmp(s,"-grayscale") ||
Packit df99a1
      !strncmp(s,"-pages=",7) ||
Packit df99a1
      !strncmp(s,"-orientation=",13) ||
Packit df99a1
      !strncmp(s,"-srgb=",6) )
Packit df99a1
    return 1;
Packit df99a1
  return 0;
Packit df99a1
}
Packit df99a1
Packit df99a1
int
Packit df99a1
main(int argc, char **argv)
Packit df99a1
{
Packit df99a1
Packit df99a1
  int i;
Packit df99a1
  int optc = 0;
Packit df99a1
  char **optv;
Packit df99a1
  const char *infile = 0;
Packit df99a1
  const char *outfile = 0;
Packit df99a1
  FILE *fout;
Packit df99a1
#if defined(_WIN32) && !defined(__CYGWIN32__)
Packit df99a1
  _setmbcp(_MB_CP_OEM);
Packit df99a1
#endif
Packit df99a1
  /* Sort options */
Packit df99a1
  if (! (optv = (char**)malloc(argc*sizeof(char*))))
Packit df99a1
    die(i18n("Out of memory"));
Packit df99a1
  for (i=1; i
Packit df99a1
    {
Packit df99a1
      char *s = argv[i];
Packit df99a1
      if (s[0]=='-' && s[1]=='-')
Packit df99a1
        s = s+1;
Packit df99a1
      if (!strcmp(s,"-verbose"))
Packit df99a1
        verbose = true;
Packit df99a1
      else if (check_option(s))
Packit df99a1
        optv[optc++] = s;
Packit df99a1
      else if (s[0]=='-' && s[1])
Packit df99a1
        usage();
Packit df99a1
      else if (s[0] && !infile)
Packit df99a1
        infile = s;
Packit df99a1
      else if (s[0] && !outfile)
Packit df99a1
        outfile = s;
Packit df99a1
      else
Packit df99a1
        die(i18n("Incorrect arguments. Try option --help."));
Packit df99a1
    }
Packit df99a1
  if (! infile)
Packit df99a1
    infile = "-";
Packit df99a1
  if (! outfile)
Packit df99a1
    outfile = "-";
Packit df99a1
  /* Open document */
Packit df99a1
  if (! (ctx = ddjvu_context_create(argv[0])))
Packit df99a1
    die(i18n("Cannot create djvu context."));
Packit df99a1
  if (! (doc = ddjvu_document_create_by_filename(ctx, infile, TRUE)))
Packit df99a1
    die(i18n("Cannot open djvu document '%s'."), infile);
Packit df99a1
  while (! ddjvu_document_decoding_done(doc))
Packit df99a1
    handle(TRUE);
Packit df99a1
  /* Open output file */
Packit df99a1
  if (! strcmp(outfile,"-")) 
Packit df99a1
    {
Packit df99a1
      fout = stdout;
Packit df99a1
#if defined(__CYGWIN32__)
Packit df99a1
      setmode(fileno(fout), O_BINARY);
Packit df99a1
#elif defined(_WIN32)
Packit df99a1
      _setmode(_fileno(fout), _O_BINARY);
Packit df99a1
#endif
Packit df99a1
    } 
Packit df99a1
  else if (! (fout = fopen(outfile, "wb")))
Packit df99a1
    die(i18n("Cannot open output file '%s'."), outfile);
Packit df99a1
  /* Create printing job */
Packit df99a1
  if (! (job = ddjvu_document_print(doc, fout, optc, optv)))
Packit df99a1
    die(i18n("Cannot create PostScript conversion job."));
Packit df99a1
  /* Wait until completion and cleanup */
Packit df99a1
  while (! ddjvu_job_done(job))
Packit df99a1
    handle(TRUE);
Packit df99a1
  if (verbose)
Packit df99a1
    fprintf(stderr,"\n");
Packit df99a1
  /* Make sure we get error messages */
Packit df99a1
  tryhelp = false;
Packit df99a1
  if (ddjvu_job_error(job))
Packit df99a1
    handle(FALSE);
Packit df99a1
  if (ddjvu_job_error(job))
Packit df99a1
    die(i18n("PostScript conversion job failed."));
Packit df99a1
  /* Close */
Packit df99a1
  fclose(fout);
Packit df99a1
  if (job)
Packit df99a1
    ddjvu_job_release(job);
Packit df99a1
  if (doc)
Packit df99a1
    ddjvu_document_release(doc);
Packit df99a1
  if (ctx)
Packit df99a1
    ddjvu_context_release(ctx);
Packit df99a1
  return 0;
Packit df99a1
}