int
main(int argc, char *argv[])
{
    Clp_Parser *clp = Clp_NewParser(argc, (const char * const *)argv, sizeof(options) / sizeof(options[0]), options);
    char buf[BUFSIZ];
    const char *paper = NULL, *output = NULL;
    FILE *pf, *of;
    int overflow, nest, is_ps2write = -1, ps2write_state = 0;
    int colorize = 1, lighten = 1, newcoloropt = 0, random_random_seed = 1;
    int rotate = 0;
    uint32_t random_seed = 0;

    program_name = Clp_ProgramName(clp);

    while (1) {
        int opt = Clp_Next(clp);
        switch (opt) {

          case DIR_OPT:
            catdir(clp->vstr, 0, colorize, lighten, rotate);
            newcoloropt = 0;
            break;

          case FILE_OPT:
            addcat(clp->vstr, colorize, lighten, rotate);
            newcoloropt = 0;
            break;

          case PAPER_OPT:
            if (paper) {
                fprintf(stderr, "%s: `--paper` specified twice\n", program_name);
                usage_error();
            }
            paper = clp->vstr;
            break;

          case OUTPUT_OPT:
            if (output) {
                fprintf(stderr, "%s: `--output` specified twice\n", program_name);
                usage_error();
            }
            output = clp->vstr;
            break;

          case SEED_OPT:
            if (clp->negated)
                random_random_seed = -1;
            else if (!clp->have_val)
                random_random_seed = 1;
            else
                random_random_seed = 0, random_seed = clp->val.u;
            break;

          case COLORIZE_OPT:
            colorize = !clp->negated;
            newcoloropt = 1;
            break;

          case LIGHTEN_OPT:
            lighten = !clp->negated;
            newcoloropt = 1;
            break;

          case ROTATE_OPT:
            if (clp->negated)
                rotate = 0;
            else if (clp->have_val)
                rotate = clp->val.i;
            else
                rotate = 20;
            newcoloropt = 1;
            break;

          case NOCOLORIZE_OPT:
            colorize = 0;
            newcoloropt = 1;
            break;

          case NOLIGHTEN_OPT:
            lighten = 0;
            newcoloropt = 1;
            break;

          case MAXCATS_OPT:
            maxcats = clp->val.i;
            break;

          case HELP_OPT:
            usage();
            exit(0);

          case VERSION_OPT:
            printf("yapteaparprfotci %s\n", VERSION);
            printf("Copyright (c) 2005-2016 Eddie Kohler\n\
This is free software; see the source for copying conditions.\n\
There is NO warranty, not even for merchantability or fitness for a\n\
particular purpose.\n");
            exit(0);
            break;

          case Clp_NotOption:
            if (paper) {
                fprintf(stderr, "%s: too many arguments\n", program_name);
                usage_error();
            }
            paper = clp->vstr;
            break;

          case Clp_Done:
            goto done;

          case Clp_BadOption:
            usage_error();

        }
    }

  done:
    if (newcoloropt)
        fprintf(stderr, "%s: warning: last colorize/lighten options ignored\n(These options only affect subsequently-named cat imagery.)\n", program_name);
    if (!ncats)
        fprintf(stderr, "%s: warning: no cat imagery!  (Try `-d DIR` or `-f FILE`.)\n", program_name);
    if (!paper || strcmp(paper, "-") == 0) {
        pf = stdin;
        paper = "<stdin>";
    } else {
        pf = fopen(paper, "r");
        if (!pf) {
            perror(paper);
            exit(1);
        }
        fclose(stdin);
    }

    // Set random seed
    if (random_random_seed == 0)
        srandom(random_seed);
    else if (random_random_seed > 0) {
#if HAVE_SRANDOMDEV
        srandomdev();
#else
        int i;
        srandom(time(NULL));
        for (i = 0; i < getpid() % 43; i++)
            (void) random();
#endif
    }

    // Check for PDF
    if (fgets(buf, sizeof(buf), pf) == NULL) {
        fprintf(stderr, "%s: Empty file\n", paper);
        exit(1);
    }
    int need_pdf = 0;
    if (memcmp(buf, "%PDF-", 5) == 0) {
        int pipe1[2];
        if (pipe(pipe1) != 0) {
            perror(program_name);
            exit(1);
        }

        pid_t child = fork();
        if (child == 0) {
            size_t nread;

            close(STDOUT_FILENO);
            close(pipe1[0]);
            dup2(pipe1[1], STDOUT_FILENO);
            close(pipe1[1]);
            FILE* p = popen("pdf2ps -dLanguageLevel=3 - -", "w");
            if (!p) {
                perror("pdftops");
                exit(1);
            }
            close(STDOUT_FILENO);

            fputs(buf, p);
            while ((nread = fread(buf, 1, sizeof(buf), pf)))
                fwrite(buf, 1, nread, p);

            pclose(p);
            exit(0);
        } else if (child < 0) {
            perror(program_name);
            exit(1);
        }

        fclose(pf);
        close(pipe1[1]);
        pf = fdopen(pipe1[0], "r");
        if (fgets(buf, sizeof(buf), pf) == NULL) {
            fprintf(stderr, "%s: PDF conversion failed\n", paper);
            exit(1);
        }
        need_pdf = 1;
    }

    // Output
    if (need_pdf) {
        char* ocmd = malloc(strlen(output ? output : "-") * 2 + 20);
        char* opos;
        const char* ipos;
        strcpy(ocmd, "ps2pdf - ");
        opos = ocmd + strlen(ocmd);
        for (ipos = output ? output : "-"; *ipos; ++ipos)
            if (isalnum(*ipos) || *ipos == '/' || *ipos == '.')
                *opos++ = *ipos;
            else {
                *opos++ = '\\';
                *opos++ = *ipos;
            }
        *opos++ = 0;
        of = popen(ocmd, "w");
        free(ocmd);
    } else if (!output || strcmp(output, "-") == 0)
        of = stdout;
    else if (!(of = fopen(output, "w"))) {
        perror(output);
        exit(1);
    }

    // Actually process
    overflow = nest = 0;
    do {
        char *newline = strchr(buf, '\n');
        if (is_ps2write > 0 && ps2write_state)
            ps2write_state = check_ps2write(ps2write_state, buf);
        else if (is_ps2write < 0) {
            if (buf[0] != '%')
                is_ps2write = 0;
            else if (memcmp(buf, "%%Creator:", 10) == 0)
                is_ps2write = strstr(buf, "ps2write") != 0;
        }
        fputs(buf, of);
        if (!overflow && newline && memcmp(buf, "%%BeginDocument:", 16) == 0)
            nest++;
        else if (!overflow && newline && memcmp(buf, "%%EndDocument", 13) == 0)
            nest--;
        if (!overflow && newline && memcmp(buf, "%%Page: ", 8) == 0 && nest == 0) {
            double bbox[4] = {0, 0, 612, 792};
            if (fgets(buf, sizeof(buf), pf) != NULL
                && memcmp(buf, "%%PageBoundingBox: ", 19) == 0)
                sscanf(buf + 19, "%lg %lg %lg %lg", &bbox[0], &bbox[1], &bbox[2], &bbox[3]);
            cat(of, 0, bbox);
            ps2write_state = 1;
            continue;
        }
        overflow = (newline == NULL);
    } while (fgets(buf, sizeof(buf), pf) != NULL);

    if (need_pdf)
        pclose(of);
    else
        fclose(of);
    return 0;
}
Beispiel #2
0
main()
{
/*      PROGRAM TO LIST CATALOG BETWEEN FREQUENCY LIMITS */
  char fqhi[16], buf[82], *molnam, fqlow[16], resp, *xtra, line[82];
  double c, freq, err, dfqlow, dfqhi;
  FILE *flist;
  float q[7];
  int moltag, cnvt, ierr, iver, iresp, nline;
  xtra = buf + 21;
  c = 29979.2458;
  printf(" Enter list file\n");
  gets(buf);
  flist = fopen(buf, "w");
  printf(" MHz units, or  wavenumbers ? (m,w) [M] ");
  gets(line);
  cnvt = (line[0] == 'w');
  if (cnvt) {
    printf(" ENTER FREQUENCY LIMITS IN WAVENUMBERS \n");
    dfqlow = 0.;
    dfqhi = 10000.;
    gets(buf);
    iresp = sscanf(buf, "%lf %lf", &dfqlow, &dfqhi);
    dfqlow *= c;
    dfqhi *= c;
  } else {
    printf(" ENTER FREQUENCY LIMITS IN GHz \n");
    dfqlow = 0.;
    dfqhi = 10000.;
    gets(buf);
    iresp = sscanf(buf, "%lf %lf", &dfqlow, &dfqhi);
    dfqlow *= 1000.;
    dfqhi *= 1000.;
  }
  sprintf(fqlow, "%13.4f", dfqlow);
  sprintf(fqhi, "%13.4f", dfqhi);
  moltag = 0;
  while (nxtdir(&moltag)) {
    molnam = catdir(moltag, &nline, q, &iver);
    nline = catfrq(moltag, fqlow, buf);
    printf("%7d %s %d\n", moltag, molnam, nline);
    if (nline > 0)
      puts(buf);
    if (nline > 0 && strcmp(buf, fqhi) < 0) {
      printf("%s is next. OK? (y/n/a) [y] ", molnam);
      gets(line);
      resp = line[0];
      if (resp == 'a')
        exit(0);
      if (resp == 'y') {
        fprintf(flist, "              %6d %s\n", moltag, molnam);
        do {
          if (cnvt) {
            sscanf(buf, "%13.4lf%8.4lf", &freq, &err);
            err /= c;
            freq /= c;
            fprintf(flist, "%13.5f%8.5f%s\n", freq, err, xtra);
          } else {
            fputs(buf, flist);
            fputc('\n', flist);
          }
          nline++;
          ierr = catrd(moltag, nline, buf);
        } while (ierr == 0 && strcmp(buf, fqhi) < 0);
      }
    }
  }
  printf("LAST SPECIES READ\n");
}